使用boost.asio是否可以使用标记和空格?

我看不到使用termios结构正确设置串口,所以我正在寻找第三方库。

我已经被build议尝试boost.asio,但通过例子来看,它似乎不支持标记和空间平价,这是真的吗?

如果有可能有人可以在boost.asio中显示如何做标记和空间平价的示例代码。 我使用8个数据位,115220波特率和1个停止位。

有没有人知道任何第三方库,支持在Linux上的标记和空间奇偶校验,我可以使用,而不是提升?

这里有一个关于这个问题的非常好的文章。

尤其是

MARK和SPACE奇偶校验虽然在大多数硬件中实现,但并未在POSIX标准中定义。 例如,Unix / Linux termios库的联机帮助页面并没有对这两种奇偶校验模式放松一下。 (请注意,PARMRK与MARK平价无关。)

这就是为什么我认为这些选项在Boost.Asio中没有实现。

有一些解决方案建议:例如:

模式8M1(8个数据位,MARK奇偶校验,1个停止位)可以用8N2来模拟。 不发送奇偶校验位和停止位,而是发送两个停止位。 由于停止位始终为1(标记位),因此两种模式是等效的。

如果这些不符合你的要求,那么你可以使用boost asio来获得串口的本地表示。 从文档:

basic_serial_port::native_handle Get the native serial port representation. native_handle_type native_handle(); This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided. 

得到一个使用的想法看看

 boost_1_45_0/boost/asio/serial_port_base.hpp 

特别是在linux上使用奇偶校验的代码:

 switch (value_) { case none: storage.c_iflag |= IGNPAR; storage.c_cflag &= ~(PARENB | PARODD); break; case even: storage.c_iflag &= ~(IGNPAR | PARMRK); storage.c_iflag |= INPCK; storage.c_cflag |= PARENB; storage.c_cflag &= ~PARODD; break; case odd: storage.c_iflag &= ~(IGNPAR | PARMRK); storage.c_iflag |= INPCK; storage.c_cflag |= (PARENB | PARODD); break; default: break; } 

我想你想使用native_handle设置设置标志像这样:

 cflag |= PARENB | CMSPAR // To select SPACE parity cflag &= ~PARODD cflag |= PARENB | CMSPAR | PARODD // to select MARK parity 

(按照这里 ,无论如何)也看到错误序列的libserial收到的数据