错误的libserial序列接收数据

时间:2011-06-22 08:55:13

标签: c++ linux serial-port libserial

我现在正在开发一个在Ubuntu下使用libserial进行串口通信的项目。我们修改了libserial源代码以允许MARK / SPACE奇偶校验。但是在进行数据接收测试时,有时(约5%的几率)输入数据序列是错误的。第一个字节可以跳转到传入缓冲区的中间,甚至跳到最后。

问题出在原始SerialPort::SerialPortImpl::HandlePosixSignal( int singnalNumber) f内部,当错误发生时,它无法正确读取某个字节,错误描述为“资源暂时不可用”。但是因为它已经使用ioctl获得num_of_bytes_available,所以怎么可能失败?

在我的测试中,我经常在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 个答案:

答案 0 :(得分:1)

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