Рассмотрим две наиболее полезных утилиты конфигурации последовательных устройств: setserial и stty.
Команда setserial
Ядро при запуске само пытается определить настройки устройств, но из-за их большого разнообразия это не всегда возможно. Хороший пример того, где это является проблемой, внутренние модемы, о которых мы говорили ранее. UART, который они используют, имеет 16-байтовый буфер FIFO, но он похож на UART 16450. Если мы определенно не сообщаем драйверу, что этот порт является устройством UART 16550, ядро не будет использовать расширенный буфер. Еще одним примером являются четырехпотровые карты, которые позволяют поделить один IRQ между несколькими устройствами. Нам, вероятно, придется сообщать ядру, который IRQ-порт предполагается использовать, и что IRQ может быть разделен несколькими устройствами.
setserial была создана, чтобы конфигурировать последовательный драйвер во время выполнения. Команда setserial обычно выполняется при начальной загрузке из скрипта, который в одних дистрибутивах называется 0setserial , а в других rc.serial . Этот скрипт обязан инициализировать последовательный драйвер, чтобы разместить любые нестандартные или необычные последовательные аппаратные средства в машине.
Команда setserial имеет большое количество параметров. Наиболее важные из них описаны в таблице 4-1. Остальные можно найти на man-странице по setserial.
Таблица 4-1. Параметры командной строки для setserial
Параметр
Описание
port port_number
Определяет адрес порта ввода-вывода последовательного устройства. Должен быть определен в шестнадцатеричной записи, например, 0x2f8 .
Определяет прерывание, используемое последовательным устройством.
Определяет тип UART последовательного устройства. Общие значения 16450 , 16550 и т.д. Установка этого значение в none не отключит это последовательное устройство.
Задание этого параметра инструктирует последовательный драйвер ядра, что этот порт является одним из портов платы AST Fourport.
Предписывает UART использовать быстродействие 57.6 kbps, когда процесс запрашивает 38.4 kbps.
Предписывает UART использовать быстродействие 115 kbps, когда процесс запрашивает 38.4 kbps.
Предписывает UART использовать заданное по умолчанию быстродействие 38.4 kbps, когда запрашивается. Этот параметр используется, чтобы отменить эффект spd_hi или spd_vhi на определенном последовательном устройстве.
Этот параметр заставит ядро сделать попытку автоматически определить IRQ определенного устройства. Эта попытка не может быть полностью надежной, так что, вероятно, лучше думать об этом как о просьбе к ядру предположить IRQ. Если Вы знаете IRQ этого устройства, Вы должны определить его, используя параметр irq .
Это параметр должен быть определен вместе с параметром port . Когда этот параметр задан, setserial инструктирует ядро сделать попытку автоматически определить тип UART на порте с заданным адресом. Если параметр auto_irq также задан, ядро попытается автоматически определить IRQ.
Отменяет автоопределение типа UART. Полезен, если ядро определяет его неправильно.
Типичный и простой файл rc для настройки Ваших последовательных портов при начальной загрузке показан в примере 4-1. Большинство дистрибутивов Linux включают более сложные файлы.
Пример 4-1. Образец файла rc.serial
Команда /sbin/setserial -bg /dev/ttyS* в последней строке будет печатать аккуратно форматируемое резюме аппаратной конфигурации всех активных последовательных устройств. Образец такого вывода показан в примере 4-2 .
Пример 4-2. Вывод команды setserial -bg /dev/ttyS Command
Команда stty
Имя stty, возможно, произошло от сокращения «set tty», но команда stty может также использоваться, чтобы отобразить конфигурацию терминала. Возможно, даже больше, чем setserial, команда stty обеспечивает изумительное число характеристик, которые Вы можете легко настроить. stty обычно используется, чтобы конфигурировать параметры терминала, типа того, будут ли символы отображены на экране, или какая клавиша должна генерировать сигнал прерывания. Мы объяснили ранее, что последовательные устройства являются tty-устройствами, а значит, команда stty применима к ним.
Одно из важнейших применений stty заключается в управлении аппаратным подтверждением связи на устройстве. Мы кратко говорили ранее относительно аппаратного подтверждения связи. Значение по умолчанию конфигурация для последовательных устройств: аппаратное подтверждение заблокировано. Эта установка позволяет работать последовательным кабелям “three wire”. Они не поддерживают необходимые сигналы для аппаратного подтверждения связи, и если оно включено по умолчанию, они будут не способны передать сигнал, чтобы изменить это.
Удивительно, но некоторые программы не допускают аппаратное подтверждение связи, так что если Ваш модем эту функцию поддерживает, Вы должны конфигу- рировать его так, чтобы ее использовать (проверьте руководство по модему, чтобы узнать, какую команду применить) и сконфигурировать последовательное устройство, чтобы учитывать это подтверждение. Команда stty имеет параметр crtscts , который включает аппаратное подтверждение связи на устройстве. Вам придется использовать его. Команда лучше всего должна быть выдана из rc.serial файла (или его эквивалента) при начальной загрузке. Образец показан в примере 4-3.
Пример 4-3. Файл rc.serial с командами stty
Команда stty работает на текущем терминале, но используя переадресацию ввода (» stty управлять любым tty-устройством. Про символы » » регулярно забывают. Новые версии stty имеют более удачный синтаксис для таких задач. Чтобы использовать новый синтаксис, я переписал мой пример настройки. Новую его версию можно посмотреть в примере 4-4.
Пример 4-4. Файл rc.serial с командами stty (новый синтаксис)
Я упомянул, что команда stty может использоваться, чтобы отобразить параметры конфигурации терминала tty-устройства. Чтобы отобразить все активные параметры настройки на tty-устройстве, скомандуйте:
Вывод этой команды показан в примере 4-5, Он дает Вам состояние всех параметров для этого устройства. Параметр, показанный с предшествующим минусом, как в -crtscts , означает, что данное свойство выключено.
Пример 4-5. Вывод команды stty -a
Таблица 4-2. Параметры stty для настройки последовательных устройств
Параметр
Назначение
N
Устанавливает быстродействие линии в N бит в секунду.
Включить/выключить аппаратное подтверждение связи.
Включить/выключить XON/XOFF управление потоком.
Включить/выключить сигналы управления модема типа DTR/DTS и DCD. Это необходимо, если Вы используете последовательный кабель «three wire», поскольку он не обеспечивает эти сигналы.
Установить число бит данных соответственно в 5, 6, 7 или 8.
Включить проверку на нечетность. Отключение этого параметра включает проверку на четность.
Включить проверку четности. Когда этот параметр выключен, контроль четности или нечетности не используется.
Включить использование двух стоп-бит на символ. Когда этот параметр выключен, используется один стоп-бит на символ.
Включить/выключить повторение полученных символов обратно отправителю.
Источник
Работа с COM-портом (RS-232) в Linux
Урок посвящен интерфейсу RS-232, который в простонародье называют COM-порт. Мы разберемся как он представлен в Linux, какой у него интерфейс, научимся его конфигурировать, а также узнаем, что написание программы для коммуникации через COM-порт в Linux не представляет сложности.
Разговор o коммуникации через COM-порт в Linux следует начать с того, что заметить, что каждому COM-порту в операционной системе соответствует файл устройства телетайп или tty. Он находится в каталоге dev и имеет имя /dev/ttyS и номер. Если посмотреть на мой каталог, то мы увидим следующее, что у меня таких файлов очень много [0:55]. Но по факту, в моем компьютере есть один физический COM-порт. Давайте попробуем его найти. Сделать это можно с помощью команды dmesg, которая выводит сообщения с момента инициализации системы. Если набрать
$dmeg | grep «ttyS»
то мы увидим, что, в действительности , у меня только один файл ttyS4 связанный с конкретным COM-портом, у которого есть некоторый диапазон ввода/вывода, номер прерывания, и который сейчас настроен на скорость обмена 150200 бит в секунду (или бод).
Для того, чтобы сконфигурировать мой COM-порт по умолчанию в Linux можно воспользоваться программой mincom, запускать её нужно от суперпользователя, либо добавить текущего пользователя в группу dialout. Запустим
$sudo minicom -s
Ключ -s – обозначает конфигурацию (setup),
Здесь мы видим следующее [2:24]. Есть параметры последовательного порта, важно прописать правильно файл, то есть указать тот файл, который у вас в системе связан с физическим COM-портом, Второй важный момент – это настройка параметров обмена (ключ Е). Дело в том, что корректный обмен данными по последовательному соединению возможен только тогда, когда обе стороны имеют один и тот же набор параметров. В этом окне можно набор этих параметров менять [3:08]. Мы видим, что у нас задана скорость 8 бит, нет контроля четности, и один стоповый бит. Именно здесь можно это все увидеть и настроить так, как требуется или, как требует ваше устройство.
Сохраняем конфигурацию по умолчанию. Дальше будем взаимодействовать — сначала с помощью команды терминала, чтобы проверить, как вручную это работает; а потом напишем небольшую программу, которая будет слать данные в COM-порт. Выйти из Mincom можно набрав ctrl-A-X.
Для того чтобы проверить, как работает COM-порт можно воспользоваться программой miniterm [4:03]. Я создал виртуальную машину с обычным linux, у неё указал, что в наличии имеется один COM-порт (это COM1), по умолчанию назначились линии обработки запросов прерывания. Я ассоциировал этот COM-порт с файлом на моей host-машине. С этого файла мы будем читать данные записанные в порт.
Итак, мы видим, что в левой части экрана у нас есть логин на виртуальную машину [4:46]. Давайте проверим с помощью minicom -s, как настроены коммуникации. Проверим, что /dev/ttyS0 – это действительно правильный физический порт – да, это именно так. Теперь мы можем вызвать команду
$sudo miniterm
она говорит, что есть следующие доступные порты, и просит ввести, через какой порт работать. Далее я попадаю терминал, связанный с COM-портом, где могу набирать текст. Набирая команды, я вижу «эхо» в моем файле справа. Обратите внимание, что я пишу в левом окне, а на экране надпись мы видим в правом. В левом окошке – виртуальная машина, на которой настроен порт. В правом – тот лог, который мы видим в файле ассоциированном с этим COM-портом на host-машине.
Создадим какой-нибудь каталог, в котором будем разрабатывать приложение. Как это ни странно, приложение будет выглядеть очень просто, потому что все действия, которые мы делаем с COM-портом в linux, это действия с файлами с использованием тех же самых файловых операций. Нам потребуется stdio.h, unistd.h, чтобы получить доступ – функциям open/read/write, fcntl.h, чтобы иметь возможность использовать файловые флажки. Открываем файловый дескриптор, COM-порт, имя, и флаги из COM-порта. Проверим, что файловый дескриптор у нас открылся, то есть если порт меньше или равен 0, то есть какая-то ошибка, оповестим об этом пользователя и вернем управление. В противном случае, можно писать в этот файловый дескриптор. write принимает файловый дескриптор, указатель на буфер, размер. Дальше мы закрываем файловый дескриптор и возвращаем управление. Приложение готово.
Теперь давайте попробуем запустить то, что у нас вышло, вернее, скомпилировать и запустить [10:40]. При запуске приложения произошла ошибка, но она вызвана понятными причинами, потому что пользователь должен был быть включен группу dialout [11:03], или нам надо запускать приложение от суперпользователя. Сделаем это. И сразу видим, что в нашем окошке появилась запись «hello world». Можно повторить и увидеть, что все работает корректно.
Точно таким же образом можно осуществлять чтение из COM-порта, то есть использовать не функцию write, а функцию read.
Источник
Заметки о Linux, электронике, радиолюбительстве
Личный блог Вадима Кузнецова, RA3XDH
воскресенье, 27 июля 2014 г.
Работа с последовательным портом из консоли Linux
В предыдущем посте было показано как запустить UART на отладочной плате Launchpad для MSP430. Теперь рассмотрим как общаться с платой при помощи средств командной строки Linux. Используется плата с прошивкой из предыдущего поста. Для подробностей — см. под кат
Как известно, все устройства последовательных портов представлены файлами устройств в каталоге /dev.Через эти файлы и происходит общение ОС Linux с внешним устройством на последовательном порту. Чтобы передать что-то на внешнее устройство нужно записать данные в файл устройства, а чтобы считать информацию из устройства — прочитать данные из файла устройства. Это можно делать при помощи команд cat и echo так же как для обычных файлов на диске. Или внутри программы на С при помощи вызовов ioctl(), read() и write() или библиотеки termios.
Физическим последовательным портам RS232, к которым подключались диалапные модемы на старых компьютерах, соответствуют файлы устройств /dev/ttyS*, начиная с /dev/ttyS0. Виртуальным последовательным портам, которые создаются различными конвертерами USB UART соответствуют файлы устройств /dev/ttyUSB* и /dev/ttyACM*. Ядро Linux автоматически разпознаёт подключенное устройство, загружает для него драйвер и создаёт файл устройства. Вручную устанавливать драйвер, как в ОС Windows не требуется. Например, если подключить к USB преобразователь USB UART FT232, то создаётся файл устройства /dev/ttyUSB0, с которым можно работать также как и с обычным последовательным портом. На плате Launcpad находится микросхема TUSB3410, которая тоже представляет собой конвертер USB UART. Если подключить её к USB, то создаётся файл устройства /dev/ttyACM0. Чтобы общаться с платой нужно что-либо писать/читать с этого файла.
Чтобы пользователь мог читать или писать в файл устройства последовательного порта, его нужно добавить в группу dialout. Иначе работать с последовательным портом сможет только администратор root.
Простейшим приложением с графическим интерфейсом, которое работает с последовательным портом, является CuteCOM. Он обычно уже есть в вашем дистрибутиве Linux. Его можно установить из репозиториев. При помощи CuteCOM мы работали с платой в предыдущем посте. Выглядит CuteCOM вот так:
Работать с ним крайне просто. Указываем нужное устройство, если его нет в списке, то его можно впечатать вручную. Затем указываем скорость и параметры и нажимаем OpenDevice. В окне видим данные, которые пришли от устройства. В поле ввода в нижней части можем печать строку символов, которые предаются на устройство. Чтобы передать данный нажимаем Enter и смотрим ответ устройства в окне.
Теперь рассмотрим как работать с COM-портом из командной строки. Для этого служат три команды: stty, cat и echo.
Команда stty устанавливает параметры и скорость COM-порта. Её формат:
stty -F
Чтобы установить параметры для платы Launchpad для соединения на скорости 9600 нужно выполнить:
$ stty 9600 -F /dev/ttyACM0 raw -echo
Параметр raw устанавливает, что данные в компьютер передаются байт за байтом так же как приходят в порт без преобразований. Аппаратное управление потоком отключено. Подробнее о том, что включает и выключает raw — см. man stty. Если не включить raw, то скорее всего ничего работать не будет.
Теперь в той же консоли нужно набрать
$ cat /dev/ttyACM0
И можно смотреть данные, которые приходят от платы. Выход — нажать Ctrl+C.
Теперь нажимаем на плате RESET и видим, что в консоди напечатался текст.
Чтобы передать в плату данные, в другой консоли нужно использовать команду echo и перенаправление вывода в файл устройства. Наберём в другой консоли:
$ echo "1">/dev/ttyACM0
Видим, что на плате загорелся красный светодиод и в первой консоли было выдано сообщение об этом. Чтобы убрать конец строки в передаваемых данных, то нужно использовать запуск echo -n, а чтобы интерпретировать 16-ричные коды — нужно echo -e. Ключи можно комбинировать.
В итоге должно получиться так:
Чтобы увидеть 16-ричные коды данных, приходящих от устройства, нужно использовать команду hexdump:
$ cat /dev/ttyACM0|hexdump -C
Получится вот так:
Чтобы иметь вывод данных от устройство на экран и в текстовый файл нужно использовать tee: