Возможен ли паритет меток и пробелов с помощью boost.asio?

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

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

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

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


person Skeith    schedule 18.10.2011    source источник


Ответы (1)


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

Особенно

Четность 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
comment
приведенные вами примеры представляют собой структуру termios, которую я не смог заставить работать, а CMSPAR не определен в моей системе и не работает. в любом случае спасибо за ответ, теперь я знаю, что должен сделать это в Java :( - person Skeith; 18.10.2011
comment
@Skeith - взгляните на ссылку - вы можете эмулировать как Mark, так и Space, используя дополнительный стоповый бит (Mark проще) - это напрямую поддерживается Boost.Asio без необходимости играть с неподдерживаемыми CMSPAR. Кстати, я не уверен, что переключение языков поможет, если ваше ядро ​​​​не поддерживает его. - person Tom; 18.10.2011
comment
у нас есть программа на java, которая взаимодействует с нашим устройством, но она была создана моим предшественником. я просто не хотел пытаться вырезать из него последовательный код, если это возможно, так как это будет основная работа по переписыванию функционального кода с С++ на java, поскольку все, что нам не хватает, это серийный код для Linux, но у меня нет выбора в настоящее время. - person Skeith; 18.10.2011