【问题标题】:Is mark and space parity possible using boost.asio?使用 boost.asio 是否可以实现标记和空间奇偶校验?
【发布时间】:2011-12-10 00:47:33
【问题描述】:

我无法使用 termios 结构正确设置串行端口,因此我正在查看第三方库。

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

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

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

【问题讨论】:

    标签: c++ linux boost serial-port


    【解决方案1】:

    关于这个问题有一篇很好的文章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

    【讨论】:

    • 您提供的示例是我无法使用的 termios 结构,并且 CMSPAR 在我的系统上未定义并且无法正常工作。无论如何,感谢您的回答,现在我知道我必须在 java 中做到这一点:(
    • @Skeith - 查看链接 - 您可以通过使用额外的停止位来模拟 Mark 和 Space(Mark 更容易) - Boost.Asio 直接支持此功能,无需播放不支持的 CMSPAR。顺便说一句 - 如果您的内核不支持它,我不确定切换语言是否会有所帮助。
    • 我们有一个 java 程序,可以与外部设备进行通信,但它是由我的前任构建的。如果可能的话,我只是不想尝试从中删除串行代码,因为将功能代码从 c++ 重写为 java 将是一项主要工作,因为我们所缺少的只是 linux 的串行代码,但我别无选择现在。
    猜你喜欢
    • 2012-12-06
    • 2017-07-19
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2017-08-16
    • 2013-06-25
    相关资源
    最近更新 更多