Здравствуйте! Работаю с внешним устройтвом com-port, через USB. Не могу добиться возврата из фунции чтения в блокиружщем режиме, при отсутсвии сигнала.
Инициализация порта:
int fd = open(«/dev/ttyUSB0», O_RDWR | O_NOCTTY ); if (fd <= 0) { cout << "port open error "; fd = 0; return 1; }
tcgetattr(fd,&oldtio); // save current port settings tcgetattr(fd,&newtio); // save current port settings
newtio.c_lflag &= ~(ICANON|ECHO|ISIG); newtio.c_cflag |= B115200 | CS8 | CLOCAL | CREAD; newtio.c_cflag &= ~(CRTSCTS | PARENB | CSTOPB | CSIZE); newtio.c_oflag &= ~OPOST;
newtio.c_cc[VTIME] = 1;
newtio.c_cc[VMIN] = 1;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
cout<<"open port ";
return 0;
// Чтение
ssize_t ret = read(fd, readbuf, num); if (ret==-1){ cout<<«Error tty»; return 1; }
if (ret!=num){ cout<< «Error read» + to_string(ret); return 2; } return 0;
Если от внешнего устройства нет данных (при разрыве и т.п.) функции read блокирует поток.
По описанию если флаг newtio.c_cc[VTIME] = 1; фунция должна через 0,1 секунду вернуть значение 0 (данных нет)