LINUX.ORG.RU

Com-port настройка

 ,


0

1

Здравствуйте! Работаю с внешним устройтвом 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 (данных нет)

По описанию если флаг newtio.c_cc[VTIME] = 1; фунция должна через 0,1 секунду вернуть значение 0 (данных нет)

Нет!

VMIN > 0 and VTIME > 0 A read() is satisfied when either VMIN characters have been transferred to the caller’s buffer, or when VTIME tenths expire between characters. Since this timer is not started until the first character arrives, this call can block indefinitely if the serial line is idle. This is the most common mode of operation, and we consider VTIME to be an intercharacter timeout, not an overall one. This call should never return zero bytes read.

http://unixwiz.net/techtips/termios-vmin-vtime.html

seiken ★★★★★
()