4

Можно настроить связь через последовательный порт, используя аппаратное управление потоком с выводами RTS/CTS (флаг CRTSCTS для tcsetattr), но нет способа использовать выводы DTR/DSR для управления потоком надежным и эффективным способом.

Можно использовать TIOCMGET ioctl() для проверки состояния вывода, но тогда нам нужно отправлять один байт за раз, что делает его ОЧЕНЬ МЕДЛЕННЫМ!

Нет ли лучшего способа? Изготовление наших собственных кабелей не масштабируется, и на рынке есть много серийных принтеров POS, которые используют только управление потоком DTR/DSR.

PS - Забудь XON/XOFF, мне нужна надежная 8-битная связь.

1 ответ1

3

Отвечая на мой собственный вопрос, благодаря подсказке от @ktf, я обнаружил, что по крайней мере начиная с 2.6.28 [1] существуют IOCTL (TCGETX, TCSETX, TCSETXF и TCSETXW) для настройки расширенных атрибутов.

Похоже, что они были добавлены в ядро upstream 13 октября 2008 года [2].

Эти дополнительные IOCTL (совместимые с SYS5) позволяют индивидуально настроить обработку каждого из дополнительных выводов.

Смотрите ссылку на оригинальный патч RHEL [3] и посмотрите на прилагаемый тестовый пример для примера того, как его использовать.

Определения IOCTL находятся в файле «asm-generic/ioctls.h», а константы структуры и флага определены в «linux /termios.h» (в «/usr /include», конечно).

ОБНОВИТЬ

Дальнейшие исследования показывают, что общая последовательная поддержка этого IOCTL не была объединена с исходным кодом ядра. Он есть в RHEL 5.3, но не в ядре версии 3.0.6.
Это означает, что вызов ioctl() завершится неудачей для любого другого ядра, которое не портировало патч RHEL [4].

[1] http://lxr.free-electrons.com/ident?v=2.6.28;i=TCGETX
[2] https://lkml.org/lkml/2008/10/13/120
[3] https://bugzilla.redhat.com/show_bug.cgi?id=445211
[4] https://bugzilla.redhat.com/attachment.cgi?id=315300&action=diff

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .