libserial接收到的数据序列错误

wrong sequence of libserial received data

本文关键字:错误 数据 libserial      更新时间:2023-10-16

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

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