Чтение данных переменной длины из последовательного с тайм-аутом - PullRequest
0 голосов
/ 21 января 2019

Я читаю фреймы данных с устройства с помощью программного драйвера UART. Он написан как модуль tty, поэтому чтение из него довольно стандартно:

struct termios options;
int tty = open(path, O_RDWR | O_NOCTTY  | O_SYNC);
tcgetattr(tty, &options);
options.c_cflag = B4800 | CS8 | CLOCAL | CREAD | PARENB;
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
tcsetattr(tty, TCSANOW, &options);
while (running)
{
    int rx_count = read(tty_device, (void*)header, header_size);
    // parse the header to figure out the total frame size
    rx_count = read(tty_device, (void*)frame_data, frame_size);
}

Это работает большую часть времени, но иногда я пропускаю некоторые байты из-за ограничений в надежности UART.

Моя проблема в том, что когда я пропускаю байты, код считывает начальные байты следующего кадра как последние байты предыдущего кадра. Это вызывает случайное, непредсказуемое поведение.

Мне интересно, есть ли хороший способ чтения по времени, а не по размеру данных. Примерно так:

while (running)
{
    // read bytes continuously from the tty device
    // if 1 second passes with no further bytes coming, stop reading
    // process whatever data was read
}

Я мог бы, вероятно, со временем взломать что-то, что делает это, но я думаю, что есть хороший шанс, что это уже выяснили, и я просто не могу найти информацию в интернете.

1 Ответ

0 голосов
/ 22 января 2019

Я смог выполнить то, что мне нужно, используя VMIN и VTIME, как было найдено в ссылке из комментария опилок: Блокировка Linux против последовательного чтения без блокировки

Это также относилось к моей проблеме. Каким-то образом я не мог найти правильные условия поиска, чтобы найти его раньше: Настройки терминала VMIN и VTIME для сообщений переменного размера

...