Возможно ли использование метки и пробела с помощью boost.asio? - PullRequest
5 голосов
/ 18 октября 2011

Я не вижу, чтобы правильно настроить последовательный порт, используя структуру termios, поэтому я смотрю на сторонние библиотеки.

Мне посоветовали попробовать boost.asio, но при просмотре примеров он появляетсячто он не поддерживает четность метки и пробела, это правда?

Если это возможно, может кто-нибудь показать пример кода о том, как сделать метку и четность проб в boost.asio.Я использую 8 бит данных, 115220 бод и 1 стоп-бит.

Кто-нибудь знает о каких-либо сторонних библиотеках, поддерживающих метки и четность пространства в linux, которые я могу использовать вместо boost?

1 Ответ

5 голосов
/ 18 октября 2011

Существует очень хорошая статья по этой проблеме здесь .

В частности

четности 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 данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...