使用boost.asio可以标记和空间奇偶校验吗?

时间:2011-10-18 11:36:29

标签: c++ linux boost serial-port

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

我被建议尝试使用boost.asio,但在查看示例时,它似乎不支持标记和空间奇偶校验,这是真的吗?

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

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

1 个答案:

答案 0 :(得分:5)

关于这个问题有一篇非常好的文章here

特别是

  

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

(根据here,无论如何) 另请参阅wrong sequence of libserial received data