Я читаю фреймы данных с устройства с помощью программного драйвера 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
}
Я мог бы, вероятно, со временем взломать что-то, что делает это, но я думаю, что есть хороший шанс, что это уже выяснили, и я просто не могу найти информацию в интернете.