Przeanalizowałem wiele przydatnych tematów i kilka samouczków, ale nadal mam pewne problemy z czymś, co powinno być bardzo proste. Dla porównania oto kilka wątków, które ja perused:Linux Serial Port: Blocking Read with Timeout
How to implement a timeout in read function call?
how to open, read, and write from serial port in C
W każdym razie, mam mały problem. Mój kod działa poprawnie, jeśli otrzymam dane. Jeśli nie, funkcja read() zatrzymuje się i jedynym sposobem na wyjście z mojego programu jest użycie kill -9 (UWAGA: Używam obsługi sygnału do sygnalizowania wątkowi odczytywania danych szeregowych w celu zakończenia. winowajcę, wywołanie read() nadal zatrzymuje się, nawet jeśli usunąłem obsługę sygnałów). Co próbuję zrobić, to mieć odczyt, który blokuje i odczytywa kawałek (co oszczędza zużycie procesora), jednak jeśli odczyt nie otrzyma żadnych danych, nie będę tracił czasu.
Oto ustawienia, które mam zastosowanie do portu:
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
I wtedy ustawić te ustawienia z tcsetattr() i potwierdzić, że port otrzymał ustawienia poprzez tcgetattr(). Myślę, że moje ustawienia mogą być w konflikcie, ponieważ moje odczyty wydają się blokować i czekać, aż zostaną odebrane 64 bajty, ale nie robić nic w odniesieniu do limitu czasu. Rozumiem, że mogę użyć select(), aby poradzić sobie z przekroczeniem limitu czasu, ale mam nadzieję uniknąć wielu wywołań systemowych.
Jak zawsze, dziękuję z góry za pomoc.
P: Co to jest urządzenie (np./Dev/ttyS0)? Co to jest urządzenie na tym porcie (port RS232 COM? Coś jeszcze?) RÓWNIEŻ: jest to doskonały link, jeśli jeszcze go nie znasz: http://www.tldp.org/HOWTO/Serial-Programming -JAK/. Prawdopodobnie interesują Cię części "asynchroniczne I/O". – paulsm4