Неправильная последовательность полученных данных libserial
Сейчас я работаю над проектом, который использует 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;
1 ответ
Хорошо, я наконец понял, что является причиной проблемы. libserial
SerialPort
класс не является потокобезопасным. Сигнал POSIX, вероятно, конфликтовал с потоком повышения. Я смог решить проблему, переключившись на SerialStream
учебный класс.