Аппаратное обеспечение ввода: BeagleBone Black, на котором запущен какой-то дистрибутив GNU/Linux.
Чего я хочу добиться: я хочу установить для некоторого UART
периферийного устройства значение 921600
в бодах и иметь возможность устанавливать другие параметры, связанные с последовательным портом (например, стартовые/стоповые биты, четность, биты данных, аппаратное управление потоком и т. д.).
На сегодняшний день в Linux я нашел как минимум три способа настройки этих параметров:
- Использование
struct termios
файла заголовка формыtermios.h
. - Использование
struct termios2
из заголовочного файлаasm/termios.h
. - Использование утилиты
stty(1)
GNU/Linux.
В чем проблема:
С первым методом я не могу использовать значение скорости передачи 921600
(для такого более высокого значения нет определения, оно увеличивается только до 230400 baud
. Так что этот метод не будет работать.
Второй метод предлагает мне один способ изменить пользовательские значения коэффициента baud
, но он также сложен, потому что он не предлагает некоторые функции, такие как tcgetattr()
, tcsendbreak()
, tcflush()
и так далее. Эти функции присутствуют в первом описанном методе, и я не могу включить оба заголовочных файла termios.h
и asm/termios.h
из-за (1).
Последний метод тоже не работает, или, по крайней мере, не работает для всех настроек, которые я хочу сделать. Это текущий метод, который я использую, я открываю целевой файл, я получаю один файловый дескриптор, для этого файлового дескриптора я устанавливаю параметры связи (бод (сначала я устанавливаю одно меньшее значение), четность, стартовые/стоповые биты и т. д.), используя первый метод, а затем я использую утилиту stty(1)
для изменения (переопределения) значения скорости передачи данных на 921600
(для этого я делаю вызов функции system(...)
).
Этот метод не будет работать, если я хочу, например, изменить HW flow control
(он не переопределит этот параметр, как это происходит со значением baud
).
Каковы решения?
Можно ли смешивать два метода установки параметров для UART
-канала связи, как этот?