неправильная последовательность полученных данных libserial - PullRequest
0 голосов
/ 22 июня 2011

Сейчас я работаю над проектом, который использует 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 Ответ

1 голос
/ 02 августа 2011

Хорошо, я наконец выяснил, в чем причина проблемы.Класс libserial SerialPort не является потокобезопасным.Сигнал POSIX, вероятно, конфликтовал с потоком повышения.Я смог решить проблему, переключившись на класс SerialStream.

...