Ho studiato molti thread utili e alcuni tutorial, ma ho ancora alcuni problemi con qualcosa che dovrebbe essere molto semplice. Per avere un riferimento qui ci sono alcune discussioni che ho emetterlo:Porta seriale Linux: blocco lettura con timeout
How to implement a timeout in read function call?
how to open, read, and write from serial port in C
In ogni caso, ho un po 'un problema. Il mio codice funziona bene se ricevo dati. Se non lo faccio, la funzione read() si blocca e l'unico modo per uscire dal mio programma è usare kill -9 (NOTA: uso la gestione del segnale per segnalare alla discussione la lettura dei dati seriali da terminare. il colpevole, la chiamata read() si blocca ancora, anche se ho rimosso la gestione del segnale). Quello che sto cercando di fare è avere una lettura che blocchi e legga un chunk alla volta (quindi risparmiando l'utilizzo della CPU), tuttavia se la lettura non riceve dati, non lo faccio per scadere.
Qui ci sono le impostazioni che sto applicando alla porta:
struct termios serial_struct;
serial_struct.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
serial_struct.c_iflag = IGNPAR;
serial_struct.c_oflag = 0;
serial_struct.c_lflag = 0;
serial_struct.c_cc[VTIME] = 1; // timeout after .1s that isn't working
serial_struct.c_cc[VMIN] = 64; // want to read a chunk of 64 bytes at a given time
ho quindi impostare queste impostazioni con tcsetattr() e verificare che il porto ha ricevuto le impostazioni tramite tcgetattr(). Sto pensando che le mie impostazioni potrebbero essere in conflitto, perché le mie letture sembrano bloccarsi e aspettare fino a 64 byte, ma non fare nulla per quanto riguarda il timeout. Capisco che posso usare select() per gestire un timeout, ma spero di evitare le chiamate di sistema multiple.
Come sempre, grazie in anticipo per l'aiuto.
D: Qual è il dispositivo (ad esempio/dev/ttyS0)? Qual è il dispositivo su questa porta (una porta COM RS232? Qualcos'altro?) ANCHE: questo è un link eccellente, se non lo conosci già: http://www.tldp.org/HOWTO/Serial-Programming -COME/. Probabilmente ti interessano le parti "I/O asincrone". – paulsm4