Obsługa portu szeregowego w linuxie - timeouty

0

Witam!

Piszę prosty program do obsługi portu szeregowego w Linuxie i chciałbym żeby operacja odczytywania danych była nieblokująca (program ma czekać maksymalnie 200ms na pojawienie się danych w buforze portu szeregowego). W tym celu ustawiłem strukturę termios w następujący sposób (raw-mode):

serial_port_control_block.c_cflag |= (CREAD | CLOCAL);
serial_port_control_block.c_cflag &= ~CRTSCTS;
serial_port_control_block.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG | IEXTEN | ECHONL);
serial_port_control_block.c_iflag &= ~(IGNBRK | IXON | IXOFF | IXANY | BRKINT | IGNCR | INLCR);
serial_port_control_block.c_oflag &= ~OPOST;
serial_port_control_block.c_cc[VMIN] = 0;
serial_port_control_block.c_cc[VTIME] = 2;
//...
tcflush(serial_port_descriptor, TCIOFLUSH);
tcsetattr(serial_port_descriptor, TCSANOW, &serial_port_control_block);

Port otwieram w następujący sposób:

if((serial_port_descriptor = open(port_name.c_str(), O_RDWR | O_NOCTTY)) == -1) {
  //...
}

Niestety w sytuacji gdy żadne dane nie są dostępne, funkcja read cały czas "wisi" i oczekuje na nie. Według mojego rozumowania powinna ona w takim wypadku poczekać 200ms na pojawienie się czegoś na porcie a jeżeli nic nie przyjdzie to po prostu zwrócić "0" jako ilość odczytanych bajtów. Czy ktoś spotkał się z takim zachowanie?

Pozdrawiam!

3

Poczytaj o select

1

albo niskopoziomowo przez select, albo jakaś biblioteka lub framework, który to ogarnie za ciebie, np Qt i QSerialPort.

1 użytkowników online, w tym zalogowanych: 0, gości: 1