2011-10-18 40 views
5

我看不到使用termios结构正确设置串口,所以我正在查看第三方库。是否可以使用boost.asio标记和空格奇偶校验?

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

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

有谁知道任何支持linux上的标记和空间奇偶校验的第三方库,我可以使用它来代替boost吗?

回答

5

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

特别

标记和间隔的奇偶校验,尽管在大多数硬件实现,都没有在POSIX标准中定义 。例如,Unix/Linux termios库的联机帮助页不会丢失关于这两个奇偶校验模式的单个字。 (请注意,PARMRK与MARK 奇偶校验无关。)

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

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

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

如果这些不符合您的要求,那么您可以在升压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

+0

你给的例子是termios结构,我不能去工作,CMSPAR未定义我的系统上并不起作用。谢谢你的答案无论如何,现在我知道我必须在Java中做到这一点:( – Skeith

+0

@Skeith - 看看链接 - 你可以通过使用额外的停止位模拟Mark和Space(Mark更容易) - 这是直接的由Boost.Asio支持,无需使用不支持的CMSPAR。顺便说一句 - 我不确定如果你的内核不支持它,切换语言将会有所帮助。 – Tom

+0

我们有一个java程序,它与外部设备通信,但是由我的前任构建。如果可能的话,我只是不想尝试切割串行代码,因为将功能代码从C++重写为java将是一项重要工作,因为我们缺少的是Linux的串行代码,但我别无选择现在。 – Skeith