Подключение к последовательному порту linux

Обновлено: 04.07.2024

Операционная система Linux с самого начала обеспечивала хорошую поддержку последовательного порта.В этой статье кратко рассказывается о программировании связи через последовательный порт в Linux.

Введение в последовательный порт

Последовательный порт - это обычно используемый компьютерный интерфейс с несколькими линиями подключения, простой связью и широко используется. Обычно используемый последовательный порт - это интерфейс RS-232-C (также известный как EIA RS-232-C), который был совместно разработан Ассоциацией электронной промышленности (EIA) США в 1970 году совместно с Bell Systems, производителями модемов и производителями компьютерных терминалов для последовательного порта. Стандарты линейной связи. Его полное название - «Технический стандарт для интерфейса последовательного обмена двоичными данными между оконечным оборудованием данных (DTE) и оборудованием передачи данных (DCE)». Стандарт предусматривает использование 25-контактного разъема DB25 для каждого вывода разъема. Контент сигнала пина регулируется, а уровень различных сигналов регулируется. Когда расстояние передачи меньше 4%, длина кабеля передачи должна составлять 50 футов.

Операционная система Linux с самого начала обеспечивала очень хорошую поддержку последовательного порта. В этой статье кратко описывается программирование связи через последовательный порт в Linux. Если вы хотите получить более глубокое понимание, рекомендуется прочитать «Руководство по последовательному программированию», упомянутое в этой статье. для операционных систем POSIX》

Работа последовательного порта

Заголовочные файлы, необходимые для работы последовательного порта

Откройте последовательный порт

В Linux файл последовательного порта находится в / dev. Первый последовательный порт - / dev / ttyS0, а второй последовательный порт - / dev / ttyS1. Откройте последовательный порт, используя стандартную операцию открытия файла:

int fd; /Откройте последовательный порт для чтения и записи/

fd = open( “/dev/ttyS0”, O_RDWR);

Настроить последовательный порт

Самые основные настройки последовательного порта включают настройку скорости передачи, бит проверки и настройку стопового бита. Настройка последовательного порта в основном предназначена для установки значения каждого члена структуры struct termios.

Установить эту структуру очень сложно, здесь я расскажу только о некоторых общих настройках:

Установка скорости передачи данных Ниже приведен код для изменения скорости передачи данных:

struct termios Opt;

cfsetispeed(&Opt,B19200); /Установите на 19200 бит / с/ cfsetospeed(&Opt,B19200);

Пример функции для установки скорости передачи:

void set_speed(int fd, int speed)

Установите функцию проверки:

int set_Parity(int fd,int databits,int stopbits,int parity)

Следует отметить, что если это не терминал разработки или что-то подобное, но только последовательный порт передает данные без необходимости обработки последовательного порта, тогда используйте необработанный режим (Raw Mode) для связи, метод настройки следующий:

(ICANON | ECHO | ECHOE | ISIG); /Input/

Чтение и запись последовательного порта

После установки последовательного порта его легко читать и записывать, просто обрабатывайте последовательный порт как файл.

nByte = write(fd, buffer ,Length)

· Прочитать серийные данные

Для чтения используйте функцию чтения файловой операции.Если для передачи данных установлен необработанный режим (Raw Mode), количество символов, возвращаемых функцией чтения, равно количеству символов, полученных фактическим последовательным портом. Вы можете использовать функции для управления файлами для достижения асинхронного чтения, такие как fcntl, или select.

int readByte = read(fd,buff,Len);

Закройте последовательный порт

Чтобы закрыть последовательный порт, нужно закрыть файл.

Ниже приведен простой пример чтения данных последовательного порта с использованием некоторых функций и файлов заголовков, определенных выше.

int OpenDev(char *Dev)
int fd = open( Dev, O_RDWR );
if (-1 == fd)
perror(“Can’t Open Serial Port”);
return -1;
>
else
return fd;
>

int main(int argc, char **argv)

int fd;
int nread;
char buff[512];
char * dev = "/ dev / ttyS1"; // Последовательный порт два
fd = OpenDev(dev);
set_speed(fd,19200);
if (set_Parity(fd,8,1,‘N’) == FALSE) printf(“Set Parity Error/n”);
exit (0);
>

Этот документ описывает как программировать связь с устройствами подключенными к последовательным портам компьютера под Linux.

Содержание 1. Введение 1.1. Информация об авторских правах 1.2. Отказ от ответственности 1.3. Новые версии 1.4. Благодарности 1.5. Обратная связь 2. Getting started 2.1. Отладка 2.2. Установки порта 2.3. Концепции ввода для последовательных устройств 2.3.1. Обработка канонического ввода 2.3.2. Обработка неканонического ввода 2.3.3. Асинхронный ввод 2.3.4. Ожидание ввода от множества источников 3. Примеры программ 3.1. Обработка канонического ввода 3.2. Обработка неканонического ввода 3.3. Асинхронный ввод 3.4. Ожидание ввода от множества источников 4. Другие источники информации

Этот документ называется Linux Serial Programming HOWTO. Здесь описывается как программировать связь с другими устройствами/компьютерами через последовательную линию под Linux. Рассматриваются различная техника: Канонический ввод/вывод (прием/передача только полной строки), асинхронный ввод/вывод и ожидание ввода от различных источников.

Это - первое обновление начального релиза Linux Serial Programming HOWTO. Первичное назначение этого обновления - изменение авторской информации и конвертирование документа в формат DocBook. Относительно технического содержимого, на данный момент времени, изменений очень мало. Подчистка технического содержимого не может быть произведена за одну ночь, но я буду работать над этим когда мне позволит время.

Пожалуйста, шлите мне любые пожелания/замечания которые вы имеете, это будет очень ценно.

Все примеры тестировались при использовании i386 Linux Kernel 2.0.29.

This document is copyrighted (c) 1997 Peter Baumann, (c) 2001 Gary Frerking and is distributed under the terms of the Linux Documentation Project (LDP) license, stated below.

Unless otherwise stated, Linux HOWTO documents are copyrighted by their respective authors. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions.

All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below.

In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs.

Не принимаются никакие обязательства относительно содержимого этого документа. Приведенные в документе концепции, примеры и другое содержимое на свой страх и риск. Поскольку э то новая редакция этого документа, то в ней могут быть ошибки и опечатки, которые, естественно, могут повредить вашу систему. Относитесь к этому с осторожностью, и, хотя это не очень нравится, автор не принимает на себя никакой ответственности.

Все авторские права сохраняются за соответствующими владельцами, пока не будет указано обратное. Использование терминов в этом документе не дожно иметь отношение к нарушению любых торговых или сервисных марок.

Наименование определенных продуктов или брэндов не должно рассматриваться как индоссамент (передаточная надпись).

Вам строго рекомендуется выполнить резервное сохранение вашей системы перед основной инсталляцией и выполнять резервное сохранение вашей системы через определенные интервалы времени.

Как указывалось ранее, здесь мало изменений касающихся технического содержимого.

Автор благодарит Mr. Strudthoff, Michael Carter, Peter Waltenberg, Antonino Ianella, Greg Hankins, Dave Pfaltzgraff, Sean Lincolne, Michael Wiedmann, и Adrey Bonar.

Для создания нуль-модемного кабеля вам необходимо перекрутить линии TxD (передача) и RxD (прием). Описание кабеля см. в секции 7 Serial-HOWTO.

Устройства /dev/ttyS* предпологаются для подключения терминалов к вашей системе Linux и конфигурируются для этого во время запуска системы. Об этом необходимо помнить при программировании связи непосредственно через последовательные порты. Например, порты могут быть сконфигурированы во время запуска системы таким образом, что они возвращают "эхо" вводимого символа обратно, что обычно должно быть изменено при передаче данных.

Здесь будут представлены три различных концепции ввода. Для определенного приложения должна быть выбрана подходящая концепция. Если возможно, то не зацикливайте чтение одиночного символа для получения целой строки. Когда я так делал, я терял символы, в то время как read для целой строки не показывал ни одной ошибки.

Это нормальный режим обработки для терминалов, но он также может быть полезен для коммуникации с другим dl вводом, обрабатываемым построчно, что подразумевает что read будет возвращать полнострочный ввод. Строка, по умолчанию, заканчивается NL (ASCII LF ), символом конца строки или символом конца файла. Символ CR (по умолчанию, символ конца строки для DOS/Windows) не будет завершать строку при установках по умолчанию.

Обработка канонического ввода может также обрабатывать очистку, удаление слова, и перепечатку символов, транслировать CR в NL , и т.д.

Обработка неканонического ввода будет манипулировать фиксированным количеством символов в одной операции чтения, кроме того, это разрешает символьный таймер. Этот режим должен быть использован если ваше приложение всегда должно читать фиксированное количество символов, или если подключенное устройство посылает пакеты символов.

Два режима описанных выше могут быть использованы в синхронном и асинхронном режиме. Синхронный режим устанавливается по умолчанию, при этом вызов read будет заблокирован до тех пор пока операция чтения не будет завершена. В асинхронном режиме вызов read возвращает управление немедленно и посылает сигнал вызвавшей программе после завершения операции чтения. Этот сигнал может быть принят сигнальным обработчиком.

Эта ситуация не является отдельным режимом ввода, но может быть полезно если вы манипулируете несколькими устройствами. В моем приложении я управлял вводом через TCP/IP сокет и вводом через последовательное соединение с другим компьютером квази-последовательно. Пример программы показанный ниже будет ожидать ввод от двух источников ввода. Если ввод от одного из источников становится доступным, он будет обработан, и, затем, программа будет ожидать новый ввод данных.

Подход показанный ниже выглядит сложно, но необходимо не забывать о том, что Linux - это многозадачная операционная система. Системный вызов select не будет загружать процессор (CPU) при ожидании ввода, в то время как цикл ожидания пока ввод станет доступен будет замедлять одновременное выполнение других процессов.

Смотрите комментарии в коде которые объясняют использование различных режимов ввода. Я надеюсь что этот код понятен. Пример для канонического ввода откомментирован прекрасно, другие примеры откомментированы только там где они отличаются от примера для канонического ввода для того чтобы подчеркнуть различия.

Описания - не полны, но это поощряет вас поэкспериментировать с примерами для получения наилучшего решения для вашего приложения.

Don't forget to give the appropriate serial ports the right permissions Не забудьте предоставить правильные привелегии доступа к соответствующему последовательному порту (например: chmod a+rw /dev/ttyS1 )!

В режиме обработки неканонического ввода, не производится построчная сборка ввода и обработка ввода (очистка, удаление слов, и т.д.) не производится. Два параметра управляют поведением этого режима: c_cc[VTIME] устанавливает символьный таймер, и c_cc[VMIN] устанавливает минимальное количество символов которые необходимо принять для удовлетворения операции чтения.

Если MIN = 0 и TIME = 0, то чтение будет удовлетворено немедленно. При этом операция чтения вернет число фактически доступных символов или число запрошенных символов. Согласно Antonino (см. содействие), вы можете выдать fcntl(fd, F_SETFL, FNDELAY); перед чтением для получения таких же результатов.

При модификации newtio.c_cc[VTIME] и newtio.c_cc[VMIN] могут быть проверены все режимы описанные выше.

Эта секция оставлена минимальной. Она предназначена быть только подсказкой, и, таким образом, код примера очень краток. Это будет работать не только с последовательными портами, но и с любым множеством файловых дескрипторов.

Вызов select и сопутствующие макросы используют fd_set . Это битовый массив, который имеет определенный бит для каждого правильного/существующего номера файлового дескриптора. select будет принимать fd_set с установленными битами для соответствующих файловых дескрипторов и возвращать fd_set , в котором биты, соответствующие файловым дескрипторам, установлены когда произошел ввод, вывод, или исключение. Вся обработка fd_set выполняется с помощью предусмотренных макросов. Обратитесь к странице руководства (man page) select(2) .

Данный пример производит блокировку на неопределенное время, до тех пор, пока данные от одного из источников ввода не будут доступны. Если вам необходим таймаут ввода, то измените вызов select как указано ниже:

Этот пример будет "вываливаться" в таймаут через 1 секунду. Если произошел таймаут, то вызов select будет возвращать 0, однако позаботьтесь чтобы Timeout определялся временем актуального ожидания ввода в select . Если значение таймаута - нуль, то вызов select будет возвращать управление немедленно.

Linux Serial-HOWTO описывает как установить и сконфигурировать последовательные порты, а также содержит дополнительную информацию об оборудовании.

Справочная страница руководства (man page) termios(3) описывает все флаги для структуры termios .

Напомню, что последовательные порты в Linux именуются в виде файлов /dev/ttyS* (на месте звёздочки может быть любой номер порта, начиная с нуля). Иногда, если используются адаптеры COM2USB, порты могут именоваться /dev/ttyUSB* (тоже начиная с нуля).

Задача состоит из четырёх этапов, каждый из которых может быть необязательным, в зависимости от конечной цели.

На всех этапах следует выбирать одинаковую скорость порта.

Содержание

В репозиториях ALT доступны несколько пакетов программ для работы по COM-порту:

  • cutecom (графический)
  • minicom (текстовый полноэкранный)
  • picocom : picocom -b115200 /dev/ttyUSB0
  • python-module-serial : miniterm.py --eol CRLF --raw /dev/ttyUSB0 115200
  • uucp : cu -l ttyS0 -s 115200

Для удаленного подключения к Serial Console через IPMI потребуется настроить управление сервером в BIOS или при помощи ipmitool; для подключения используется следующая команда:

Как выше было написано, функция есть не в каждом BIOS. Практически всегда встречается в BIOS серверных материнских плат Intel. Следует найти соответствующий раздел и настроить.

Может случиться так, что до входа в систему дело не дойдёт из-за неправильно настроенной загрузки. Существует способ взаимодействовать с загрузчиком по последовательному порту.

В файл /etc/sysconfig/grub2 нужно записать:

и далее выполнить update-grub (если этого скрипта ещё не было, то grub-mkconfig -o /boot/grub/grub.cfg ).

В файл /boot/grub/menu.lst нужно записать:

В общие параметры загрузчика следует добавить

В общую часть syslinux.cfg (isolinux.cfg, extlinux.cfg -- по надобности) добавляем:

Пример изменения /etc/sysconfig/grub2 (без splash!):

Пример записи в /boot/grub/menu.lst с подсказками от Сергея Власова:

Пример записи в /etc/lilo.conf :

Годятся mgetty и agetty. Ставятся из соответствующих пакетов. Для настройки входа вам нужно установить одну из этих утилит. Сделайте это обычным методом (apt-get, aptitude, synaptic).

Например, это может выглядеть так (mgetty):

Эти параметры (с которыми init запустит mgetty для первых двух последовательных портов) означают, что на портах /dev/ttyS[01] (mgetty сам умеет добавлять /dev/) ожидаются прямые (-r, то есть, с других компьютеров/терминалов, в противоположность модемным) соединения со скоростью 115200 бит/с (-s) и с уровнем отладочной информации равным нулю (-x). Изменения вступят в силу лишь после прочтения файла init-ом (в результате команды telinit q от суперпользователя или перезагрузки машины).

Дополнительную краткую информацию по вызову mgetty можно почерпнуть из mgetty(8).

agetty настраивается аналогично, но командная строка отличается:

Я знаю, что могу cat выводить данные, /dev/ttyS0 но таким образом возможна только одна связь - от порта к консоли. И echo выход в порт точно такой же, но наоборот, в порт.

Как я могу реализовать двустороннюю связь с последовательным портом самым простым способом в Unix / Linux?

Я нахожу screen наиболее полезную программу для последовательной связи, так как я все равно использую ее для других целей. Обычно это просто screen /dev/ttyS0 <speed> , хотя настройки по умолчанию могут отличаться для вашего устройства. Это также позволяет вам передавать что-либо в сеанс, вводя командный режим и делая exec !! <run some program that generates output> .

screen это круто, но я не думаю, что это проще, чем minicom :-) @CiroSantilli Screen 死 六四 事件 法轮功 - Экран может быть не проще, чем Minicom, но, поскольку я уже использую Screen, для меня гораздо проще выполнять сериалы с Screen, что полностью исключает необходимость в Minicom.

Основная причина, по которой вам нужна любая программа, например, minicom для связи через последовательный порт, заключается в том, что порт должен быть настроен до начала подключения. Если бы не были установлены надлежащим образом , то cat и echo команды не будет делать для вас то , что вы могли бы ожидать. Обратите внимание, что после запуска подобной minicom программы порт остается с использованными настройками minicom . Вы можете запросить настройки связи с помощью stty программы следующим образом:

Если вы сделали это правильно; после загрузки компьютера и перед запуском любой другой программы, такой minicom, как настройки связи, будут установлены настройки по умолчанию. Они, вероятно, отличаются от того, что вам нужно для подключения. В этой ситуации отправка команд cat или echo в порт будет либо производить мусор, либо не работать вообще.

Запустите stty снова после использования minicom , и вы увидите, что настройки установлены на то, что использовала программа.

Минимальная последовательная связь

В принципе, для двусторонней связи через последовательный порт необходимы две вещи: 1) настройка последовательного порта и 2) открытие псевдо-tty для чтения-записи.

Самая основная программа, которую я знаю, которая делает это picocom . Вы также можете использовать такой инструмент, как setserial настроить порт, а затем взаимодействовать с ним непосредственно из оболочки.

picocom также позволит вам подключиться к последовательному порту, не переконфигурируя его ( --noinit ), и позволит вам выйти без восстановления конфигурации последовательного порта ( --noreset или использовать Ctrl-A / Ctrl-Q для выхода picocom ). Я обнаружил, picocom что намного проще в использовании, чем minicom . По причинам, которые я не выяснил, иногда Minicom просто не будет отправлять или получать данные через порт, который работал несколько минут назад или с которым у Picocom нет проблем. Вероятно, это какой-то непонятный вариант конфигурации, но что бы это ни было, я не могу понять это (и такое поведение имело место на более чем одной машине). +1 за пиком! Я обнаружил, что не могу писать команды на последовательное устройство без правильных окончаний строк: мне нужно было использовать --omap crcrlf --echo опции

Если в системе установлен UUCP, вы можете использовать команду cu , например:

Я нашел способ , используя скрипт здесь , что поставить cat как фоновый процесс и время цикла , который гласил , введенную пользователем , и echo его к порту. Я изменил его, чтобы он был более общим, и он идеально подходил моей цели.

Кроме того, я сделал немного измененную версию ниже, которая также может отправлять Ctrl + C и Ctrl + Z. @Fritz Хорошая находка! Так что, если я правильно понял, фоновый процесс никогда не будет убит, потому что $? кажется, не расширяется ни к чему, верно? Не могли бы вы уточнить, где происходит соединение, поскольку это закомментировано в вашем ответе

«tio» - это простое приложение терминала TTY, которое имеет простой интерфейс командной строки для простого подключения к устройствам TTY для базового ввода / вывода.

Типичное использование без вариантов. Например:

Что соответствует часто используемым параметрам:

Он поставляется с полной поддержкой автозаполнения оболочки для всех опций.

Я использую msys2 на Windows, и вы можете установить tio с, pacman -S tio потому что он входит в число доступных пакетов по умолчанию. screen , picocom И т.д. , не являются. Спасибо!

Этот сценарий основан на другом ответе , но отправляет все через последовательный порт (кроме Ctrl + Q), а не только отдельные команды, за которыми следует Enter . Это позволяет вам использовать Ctrl + C или Ctrl + Z на удаленном хосте, а также использовать интерактивные программы с «GUI», такие как aptitude или alsamixer. Можно выйти, нажав Ctrl + Q.

Кстати, пакет putty (который работает в Linux) включает в себя поддержку последовательного интерфейса.

Другая проблема, которая может возникнуть, заключается в том, что вашей учетной записи пользователя может потребоваться установить группу «dialout» для доступа к последовательному порту.

Putty хорошо работает в Linux и предлагает некоторые удобства, особенно для последовательной связи. У него есть один недостаток, который я не смог решить напрямую: нет копирования-вставки из самого окна Putty. Версия для Windows имеет прекрасное автоматическое копирование в буфер обмена при выделении, щелчок правой кнопкой мыши, чтобы вставить поведение (и есть отличные плагины для Chrome и Firefox, чтобы включить то же поведение), но в Linux, копия не любит AFAIK.

Я обнаружил, что Putty в Linux не вставляет «буфер обмена» (то, что вы копируете с помощью control-C), но вставляет «основной выбор» (то, что вы в данный момент выбрали в какой-либо программе) средней мышью. Точно так же вы можете выбрать символы на экране Putty, чтобы определить основной выбор. Но если я хочу, чтобы текст с экрана Putty переносился на какую-то виртуальную машину, мне нужно, чтобы он был буфером обмена, поэтому я должен использовать программу-посредник, чтобы получить текст из основного выделения и затем скопировать его в буфер обмена.

Как упоминалось ранее, вы можете попробовать Picocom. Последний выпуск (2.0) также можно использовать (безопасно) для настройки «терминального сервера», поскольку он больше не позволяет вводить команды оболочки. Видеть:

Это зависит от того, что вы хотите сделать. Хотите ли вы запускать оболочку или приложение в интерактивном режиме с терминала, подключаться к другому компьютеру через последовательную линию, автоматизировать связь с устройством через последовательный порт?

Если вы хотите двунаправленную связь, то я предполагаю, что вы хотите что-то интерактивное с человеком на терминале. Вы можете настроить систему таким образом, чтобы разрешить вход в систему через терминал через последовательный порт, настроив сеанс getty (1) на последовательном порту - getty - это инструмент для настройки терминала и разрешения входа в него. Поместите запись в ваш файл inittab (5), чтобы запустить ее на соответствующем последовательном порту respawn .

Если вы хотите подключиться к устройству и инициировать автоматические двусторонние разговоры, вы можете увидеть, если ожидаете получить то, что вы хотите. Используйте stty (1), чтобы настроить порт на правильную четность, скорость передачи и другие соответствующие параметры.

Если вы хотите взаимодействовать с другим компьютером через последовательный порт в интерактивном режиме, вам понадобится программа эмуляции терминала. Это делает очень многое - он устанавливает порт, интерпретирует ANSI или другие последовательности команд терминала (ANSI был далеко не единственным стандартом, поддерживаемым последовательными терминалами). Многие эмуляторы терминала также поддерживают протоколы передачи файлов, такие как kermit или zmodem.

Читайте также: