У меня есть код на c ++ для подключения к внешнему устройству, подключенному к моему odroid UX4. Я создал termios структуру, в которой я настраиваю свое соединение с тайм-аутом через 0,2 с без ответа от устройства
memset (&tty, 0, sizeof tty);
/* Error Handling */
if ( tcgetattr (fd, &tty ) != 0 )
{
std::cout << "Error " << errno << " from tcgetattr: " << strerror(errno) << std::endl;
}
/* Save old tty parameters */
tty_old = tty;
/* Set Baud Rate */
cfsetospeed (&tty, (speed_t)B921600);
cfsetispeed (&tty, (speed_t)B921600);
/* Setting other Port Stuff */
tty.c_cflag &= ~PARENB; // Make 8n1
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_iflag &= ~(BRKINT | ICRNL | IMAXBEL | IXON | IXOFF);
tty.c_oflag &= ~(OPOST | ONLCR);
tty.c_lflag &= ~(ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE);
tty.c_cflag &= ~CRTSCTS; // no flow control
tty.c_cc[VMIN] = 0; // read doesn't block
tty.c_cc[VTIME] = 0.2; // 0.2 seconds read timeout
tty.c_cflag |= CREAD | CLOCAL;
/* Make raw */
cfmakeraw(&tty);
/* Flush Port, then applies attributes */
tcflush( fd, TCIFLUSH );
if ( tcsetattr ( fd, TCSANOW, &tty ) != 0)
{
cout << "Error " << errno << " from tcsetattr" << endl;
}
но когда я читаю данные с устройства, тайм-аут не соблюдается
n = read(fd, &buf, 1);
У меня вопрос: есть ли у linux какой-то внутренний тайм-аут на USB-драйвере или что-то в этом роде (так что он может переопределить мой), или у кого-нибудь была симилиарная проблема?