Як зробити апаратне управління потоком DTR / DSR в Linux (програмування послідовних портів)?


4

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

Можна перевірити ioctl () TIOCMGET для перевірки стану штифтів, але тоді нам потрібно надсилати один байт за один раз, що робить його ДУЖЕ ПОЛІЗНО!

Хіба немає кращого способу? Виготовлення власних кабелів не розширюється, і на ринку є багато послідовних принтерів POS, які використовують лише управління потоком DTR / DSR.

PS - Забудьте про XON / XOFF, мені потрібна надійна 8-бітна комунікація.


Проголосували за видалення моєї відповіді, щоб збільшити шанси на отримання кращих відповідей. Це справді здається цікавою проблемою, з якою стикалися й інші люди. Цікаво, що для вирішення цієї проблеми було щонайменше 3 патчі ядра (2001, 2008 та 2010), але жоден з них не здається реалізованим у поточних ядрах розподілу. Схоже, єдиним рішенням (якщо не брати варіант користувальницького кабелю) було б самостійно проклеїти ядро. Якщо це для POS-терміналів, де ви маєте контроль над усім програмним забезпеченням для встановлення, BSD UNIX також може спробувати спробувати.
ktf

Цей коментар насправді мені допоміг. Я виявив, що Red Hat Enterprise Linux 5.3 містить патч, щоб виправити цю проблему [1] на ядрі 2.6.18. Оскільки RHEL - це майже певний галузевий стандарт, я вважаю, що досить безпечно використовувати їх виправлення [2]. [1] rhn.redhat.com/errata/RHSA-2009-0225.html [2] bugzilla.redhat.com/show_bug.cgi?id=445211
nlucas

Відповіді:


3

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

Вони, здається, були додані до ядра висхідного потоку 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.