Boost :: Asio :: SerialPort альтернатива, которая поддерживает нестандартные скорости передачи данных? - PullRequest
0 голосов
/ 20 февраля 2012

Кто-нибудь знает о хорошей библиотеке последовательной связи, которая является достойной альтернативой boost :: asio :: serialport?

Boost :: Asio :: SerialPort, по-видимому, не поддерживает нестандартные скорости в бодах - как 31250 (он определенно не работает в Mac OS 10.6 с надстройкой 1.48.0)

Мне нужна библиотека для работы как минимум на Mac OS X и Windows

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Самый простой обходной путь - создать экземпляр asio :: serial_port для соответствующего устройства, а затем вызвать serial_port.native_native () и использовать возвращенный дескриптор для вызова ioctl () или SetCommState () для установки скорости.

Таким образом, вы можете использовать asio для всего, кроме установки скорости линии, и вы можете получить желаемую скорость линии с минимальным специальным кодом.

Вам потребуется, чтобы этот код был особенным для каждой операционной системы, но, по крайней мере, все остальное является общим.

Однако: ошибка, на которую вы ссылаетесь, связана с определенным обходным решением для конкретной версии Linux / glibc. У вас также есть эта проблема на Windows и OSX?

1 голос
/ 20 февраля 2012

Вы можете использовать ioctl и termios для прямого управления скоростью передачи и параметрами последовательного порта. Это не очень сложно.

Если вам нужен только простой последовательный порт и вам не нужны асинхронные компоненты ввода-вывода, вы можете попробовать: https://github.com/wjwwood/serial это библиотека, которую мой друг написал для некоторых своих проектов. Обязательно используйте ветку boostless. Я знаю, что драйверы OS X поддерживают пользовательские скорости передачи данных, я их протестировал, и настраиваемые скорости передачи данных также должны работать в Linux. В настоящее время он не поддерживает Windows, поэтому, если вам нужна поддержка Windows, в данный момент он не сильно поможет.

Если вы хотите использовать только ioctl и termios, вы можете сделать:

#define IOSSIOSPEED _IOW('T', 2, speed_t)
int new_baud = static_cast<int> (baudrate_);
ioctl (fd_, IOSSIOSPEED, &new_baud, 1);

И это позволит вам установить скорость передачи в любое значение в OS X, но это зависит от ОС. для Linux вам нужно сделать:

struct serial_struct ser;
ioctl (fd_, TIOCGSERIAL, &ser);
// set custom divisor
ser.custom_divisor = ser.baud_base / baudrate_;
// update flags
ser.flags &= ~ASYNC_SPD_MASK;
ser.flags |= ASYNC_SPD_CUST;

if (ioctl (fd_, TIOCSSERIAL, ser) < 0)
{
  // error
}

Для любой другой ОС вам придется читать некоторые справочные страницы, иначе она может вообще не работать, она зависит от самой ОС.

1 голос
/ 20 февраля 2012

Это скорость MIDI. Меня всегда удивляла оптимизированная скорость, чтобы вы были вынуждены покупать оборудование у поставщиков музыкальных инструментов. Сначала купите оборудование, программное обеспечение обычно идет с ним. Таким образом, вы не закончите тем, что делаете со своей хорошей машиной Apple:

enter image description here

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