c++ - 错误的 libserial 接收数据序列

标签 c++ linux serial-port libserial

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

问题出在原来的SerialPort::SerialPortImpl::HandlePosixSignal(int singnalNumber) f函数中,发生错误时无法正确读取某些字节,错误描述为“Resource temporary unavailable ”。但是既然它已经使用 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 信号可能与 boost 线程冲突。我能够通过切换到 SerialStream 类来解决问题。

关于c++ - 错误的 libserial 接收数据序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6437306/

相关文章:

c++ - 为什么我的代码在调用免费电话时会崩溃?

linux - 为什么 umask 结果与权限位不同

php - 通过php访问串口

c++ - 使用 const void * 将 std::function 作为参数传递

c++ - 避免为不同的字符数组大小进行模板实例化

linux - 如何在 Linux 启动期间尽早设置 i2c PCA9570 gpio 扩展器的值?

c - 套接字连接失败

java - Java中从VendorID、ProductID自动检测串行COM端口

serial-port - 两个 USART 中断的溢出错误

c++ - typedef boost::shared_ptr<MyJob> Ptr;或者#define Ptr boost::shared_ptr