Существует очень хорошая статья по этой проблеме здесь .
В частности
четности MARK и SPACE, хотя и реализованы в большинстве аппаратных средств, неопределено в стандарте POSIX.Например, на странице руководства библиотеки 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 данных