0

我现在正在开发一个在 Ubuntu 下使用 libserial 进行串行端口通信的项目。我们修改了 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;
4

1 回答 1

1

好的,我终于弄清楚了导致问题的原因。该类libserial SerialPort不是线程安全的。POSIX 信号可能与 boost 线程冲突。我能够通过切换到SerialStream班级来解决问题。

于 2011-08-02T07:49:07.910 回答