Для чтения данных из com порта использую функцию read(). В Serial Programming Guide for POSIX Operating Systems написано что работает она следующим образом:
"Когда вы работаете с портом в режиме не структурированного посимвольного обмена (raw data mode), каждый системный вызов read() будет каждый раз возвращать число символов реально прочитанных в буфер ввода. Если в текущий момент нет символов доступных для чтения, то вызов будет блокироваться (wait) до тех пор пока не появятся символы для чтения, или закончится счетчик таймаута, или обнаружится какая-нибудь ошибка. Функцию read можно выполнить так, что она вернет управление немедленно. Для этого она должна быть оформлена следующим образом:
fcntl(fd, F_SETFL, FNDELAY);
Опция FNDELAY указывает функции read возвращать 0 если нет символов доступных для чтения из последовательного порта. Для восстановления нормально поведения (с блокировками), необходимо вызвать fcntl() без опции FNDELAY:
fcntl(fd, F_SETFL, 0);
Это также выполняется после открытия последовательного порта с опцией O_NDELAY. "
Я написал следующий код:
#include <fcntl.h> /* File control definitions */
#include <iostream>
int open_port(void); //Функция открытия порта
int kolvo_bait_from_port=5; //Количество байт считываемых с порта функцией read.
int main()
{
char buf[kolvo_bait_from_port];
int k;
int fd=open_port();
while(1)
{
k=read(fd,buf,kolvo_bait_from_port);
std::cout<<"Read return "<<k<<std::endl;
}
close(fd);
}
int open_port(void)
{
int fd;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd == -1)
{
std::cout<<"open_port: Unable to open /dev/ttyS0 - "<<std::endl;
}
else
fcntl(fd, F_SETFL, 0);
return (fd);
}
Если в com порту есть что читать то все нормально,а если нет то функция read() ждет когда появятся символы для чтения.
Как правильно настроить функцию read под linuxом чтобы она сразу возвращала 0 при отсутствии символов?
Если можно рабочий пример.