Сейчас я работаю над проектом, который использует libserial для связи через последовательный порт под Ubuntu. мы изменили исходный код libserial, чтобы разрешить паритет MARK / SPACE. но при выполнении теста получения данных иногда (с вероятностью около 5%) последовательность входящих данных неверна. Первый байт может перейти в середину входящего буфера или даже в конец.
Проблема в исходной функции SerialPort::SerialPortImpl::HandlePosixSignal( int singnalNumber) f
, когда возникает ошибка, она не может правильно прочитать какой-то байт, и описание ошибки «Ресурс временно недоступен». Но так как он уже получает num_of_bytes_available
с помощью ioctl, как можно потерпеть неудачу?
во время теста я часто переключаюсь между паритетом MARK / SPACE. это вызовет проблему?
модифицированная часть в SetParity
функции
for **PARITY_SPACE**
port_settings.c_cflag |= CMSPAR | PARENB;
port_settings.c_cflag &= ~PARODD;
port_settings.c_iflag = 0;
for **PARITY_MARK**
port_settings.c_cflag |= CMSPAR | PARENB;
port_settings.c_iflag = 0;