2010-07-01 7 views
3

J'ai un gros problème. À l'heure actuelle, je suis l'accès à un port série via les crochets suivants:comment détecter un tampon sur exécuter sur le port série dans Linux en utilisant C++

fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY) 

alors j'ai lu en utilisant le morceau de code suivant

i = select(fd + 1, &rfds, NULL, NULL, &tv) 
... 
iLen = read(fd, buf, MAX_PACKET_LEN) 

le problème est que avant d'avoir lu, je dois détecter s'il y avait des dépassements de tampon. Les deux au niveau du port série et les tampons internes tty flip.

Nous avons essayé cat /proc/tty/driver/serial mais il ne semble pas à la liste des dépassements (voir résultat ci-dessous)

1: uart:16550A port:000002F8 irq:3 tx:70774 rx:862484 fe:44443 pe:270023 brk:30301 RTS|CTS|DTR 
+0

Sans rapport avec C++ – pmod

Répondre

2

Selon les sources du noyau, vous devez utiliser les ioctl TIOCGICOUNT. Le troisième argument de ioctl doit être un pointeur vers la structure suivante, définie dans <linux/serial.h>:

/* 
* Serial input interrupt line counters -- external structure 
* Four lines can interrupt: CTS, DSR, RI, DCD 
*/ 
struct serial_icounter_struct { 
     int cts, dsr, rng, dcd; 
     int rx, tx; 
     int frame, overrun, parity, brk; 
     int buf_overrun; 
     int reserved[9]; 
}; 

Je ne sais pas si chaque conducteur détecte toutes les conditions cependant.

+1

Hey, merci pour cela, mais il semble que notre système ne met pas à jour les champs "overrun" et "buf_overrun". Une idée pourquoi? –

0

noir Templer,

Votre pilote série doit mettre à jour les erreurs de icount.frame/dépassement. Struct uart_port dans serial_core.h a struct uart_icount, qui doit être mis à jour dans le pilote de périphérique série de la plate-forme selon les interruptions reçues.