Ske*_*ith 5 c++ linux boost serial-port
我无法看到使用termios结构正确设置串口,所以我正在寻找第三方库.
我被建议尝试使用boost.asio但是在查看示例时,它似乎不支持标记和空间奇偶校验,这是真的吗?
如果有可能有人展示如何在boost.asio中进行标记和空间奇偶校验的示例代码.我使用8个数据位,115220波特率和1个停止位.
有谁知道支持linux上的标记和空间奇偶校验的任何第三方库我可以使用而不是使用boost?
有关于这个问题一个很好的文章在这里.
特别是
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.
Run Code Online (Sandbox Code Playgroud)
要了解使用情况,请查看
boost_1_45_0/boost/asio/serial_port_base.hpp
Run Code Online (Sandbox Code Playgroud)
特别是在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;
}
Run Code Online (Sandbox Code Playgroud)
我想你想用native_handleset来设置这样的标志:
cflag |= PARENB | CMSPAR // To select SPACE parity
cflag &= ~PARODD
cflag |= PARENB | CMSPAR | PARODD // to select MARK parity
Run Code Online (Sandbox Code Playgroud)
(根据这里,无论如何)还看到错误的libserial接收数据序列