2016-06-15 12 views
1

Аппаратное обеспечение ввода: BeagleBone Black, с некоторым дистрибутивом GNU/Linux.Linux установил более высокую скорость передачи и связанные с ней настройки

Что я хочу достичь: Я хочу установить некоторые UART периферийных для 921600 бода значения, и быть в состоянии установить другие последовательные-ассоциированные параметры (например, пуск/стоп-бит, четность, биты данных, управление HW потока, и т.д.).

До сих пор, в Linux, я обнаружил, по крайней мере, три способа настройки этих параметров:

  1. Использования struct termios файла формы termios.h заголовка.
  2. Использование struct termios2 от asm/termios.h файл заголовка.
  3. Использование утилиты GNU/Linux stty(1).

чем проблема:

С первым методом я не могу использовать значение 921600 скорости (там нет определения для такого высокого значения, она идет только до 230400 baud Так что этот метод не будет. работа.

Второй метод предлагает мне один способ изменить пользовательские baud значения скорости, но также сложно, потому что он не предлагает некоторые функции, такие как tcgetattr(), tcsendbreak(), tcflush(), и поэтому один. Эти функции присутствуют в первой -Описанный метод, и я не могу включить оба heade r файлов termios.h и asm/termios.h из-за (1).

Последний метод также не работает, или, по крайней мере, он не работает для всех параметров, которые я хочу сделать. Это текущий метод, который я использую, я открываю целевой файл, я получаю один файловый дескриптор, в этот дескриптор файла я устанавливаю параметры связи (бод (сначала я устанавливаю одно меньшее значение), четность, бит начала/остановки , и т. д.) с использованием первого метода, а затем я использую утилиту stty(1) для изменения (переопределения) значения скорости передачи до 921600 (я делаю вызов функции system(...) для выполнения этого).

Этот метод не работает, если я хочу, например, изменить HW flow control (он не будет переопределять этот параметр, как это происходит с значением baud).

Каковы решения?

Можно ли смешать два метода настройки параметров с помощью ссылки на связь UART?

ответ

0

Вы можете использовать setserial консоли утилиту:

1) Получить baud_base значение из setserial выхода

setserial -a /dev/<...> 

2) Вычислить делитель = baud_base/desired_baud_rate

Например, если baud_base = 3000000 (3MHz):

baud_rate = 115200 -> divisor = 26.04 (approximately 26) 
baud_rate = 230400 -> divisor = 13.02 (approximately 13) 
baud_rate = 921600 -> divisor = 3.26 

3.26 слишком много, чтобы установить divisor = 3 и слишком мало, чтобы установить divisor = 4.

Итак, в этом случае вы не можете использовать baud_rate = 921600 из-за ограничений оборудования. Вы можете выбрать divisor = 3 (baud_rate = 1000000) или divisor = 4 (baud_rate = 750000). Эти тарифы не являются стандартными, но возможны.

stty -F /dev/<...> 9600 -icrnl -ixon -crtscts -parenb # desired UART settings 
setserial /dev/<...> spd_cust # use custom value for divisor 
setserial /dev/<...> divisor 3 # set custom value for divisor 
stty -F /dev/<...> 38400 # activate setserial settings 
# now baud_rate is (baud_base/divisor) 
+0

'setserial' выводит меня' Невозможно установить серийную информацию: недопустимый аргумент' при попытке установить параметр 'baud_base'. –

+0

Вы уверены, что ваше оборудование поддерживает скорость 921600 бод? Попробуйте 'setserial -a/dev/<...>', чтобы просмотреть информацию о последовательном порту. – petrmikheev

+0

См. Http://www.linurs.org/linux/SerialPort.html. – petrmikheev

0

ИМХО, используя system и stty из C или программы C++ является не путь (system известен как плохой практикой безопасности на первом).

После прочтения вы родственные вопросы, мой совет будет только объявить в вас основной модуль, пространства имен или класса некоторые функции оболочки для всех функций, которые вы хотите использовать с обеих termios.h и ассемблерный/termios.h.

После этого вы определите их в двух разных единицах компиляции (исходные файлы c или C++), сначала связанные с termios.h, последний с asm/termios.h

Если это не сработает, последним способом было бы тщательно слить объявления от termios.h и asm/termios.h в пользовательском local_termios.h, который будет управляться в ваших собственных источниках и включать его. Это, конечно, приводит к не переносимому коду, но в любом случае, как только вы используете asm/termios.h, вы теряете совместимость.