По этой проблеме есть очень хорошая статья здесь.
Особенно
Четность MARK и SPACE, хотя и реализована в большинстве аппаратных средств, не определена в стандарте POSIX. Man-страница библиотеки termios Unix/Linux, например, не упускает ни слова об этих двух режимах контроля четности. (Обратите внимание, что 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
person
Tom
schedule
18.10.2011