- How to connect to a serial port on Linux
- Install screen on Linux
- For Ubuntu, Debian or Linux Mint:
- For CentOS, Fedora or RHEL:
- Connect to a Serial Port with screen utility
- Support Xmodulo
- Работа с COM-портом (RS-232) в Linux
- Linux шпаргалки
- Чтение и отправка данных
- Завершение работы
- Дополнительные возможности
- В итоге получаем набор функций
How to connect to a serial port on Linux
Question: I need to access the management terminal of a hardware switch/router (e.g., Cisco Catalyst or HP ProCurve) via its console port. The switch console port is connected to the serial port of my Linux box. How can I connect to the serial port from a Linux terminal?
First of all, let’s assume that you have already connected the serial port of your Linux box to a switch console port via a serial cable.
To connect a Linux terminal to the serial port of your Linux system, you can use a command-line screen manager tool called screen .
Install screen on Linux
For Ubuntu, Debian or Linux Mint:
To install screen on Ubuntu, Debian or Linux Mint:
$ sudo apt-get install screen
For CentOS, Fedora or RHEL:
To install screen on CentOS, Fedora, or RHEL:
Connect to a Serial Port with screen utility
Traditionally in Linux, the first serial port (COM1) is assigned a name /dev/ttyS0 , the second serial port (COM2) assigned /dev/ttyS1 , etc. If you specify a serial port name as the first argument of the screen command, the current terminal window where you run screen will be directly connected to the serial port.
Thus, to connect to a serial port, simply run the following command from a terminal:
Optionally, you can specify baud rate (e.g., 1200, 9600, 19200) as the second parameter as follows.
Once connected to a serial port, you will then be able to access the switch console port from the terminal.
To terminate the current screen session, type Ctrl-A + k . If you want to temporarily detach from the screen session, type Ctrl-A + d . After detached, you can re-attached to the session later by running:
Support Xmodulo
This website is made possible by minimal ads and your gracious donation via PayPal or credit card
Please note that this article is published by Xmodulo.com under a Creative Commons Attribution-ShareAlike 3.0 Unported License. If you would like to use the whole or any part of this article, you need to cite this web page at Xmodulo.com as the original source.
Работа с 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 шпаргалки
COM порт в Linux представляет собой файл устройства. Типичное расположение такого файла
\dev\ttySx для обычного COM порта или \dev\ttyUSBx для
USB-RS переходника, где x = 0,1,2.
Встречаются также \dev\ttyOSx и др.
Для начала работы COM порт необходимо открыть:
int F_ID = -1; open(«\dev\ttyUSB0», O_RDWR | O_NOCTTY); if(F_ID == -1)
Если F_ID отличается от -1 , значит COM порт открыт успешно
и можно переходить к его настройке.
Чтение текущих настроек:
struct termios options; /*структура для установки порта*/ tcgetattr(F_ID, &options); /*читает пораметры порта*/
cfsetispeed(&options, B57600); /*установка скорости порта*/ cfsetospeed(&options, B57600); /*установка скорости порта*/
options.c_cc[VTIME] = 20; /*Время ожидания байта 20*0.1 = 2 секунды */ options.c_cc[VMIN] = 0; /*минимальное число байт для чтения*/
options.c_cflag &= ~PARENB; /*бит четности не используется*/ options.c_cflag &= ~CSTOPB; /*1 стоп бит */ options.c_cflag &= ~CSIZE; /*Размер байта*/ options.c_cflag |= CS8; /*8 бит*/ options.c_lflag = 0; options.c_oflag &= ~OPOST; /*Обязательно отключить постобработку*/ options.c_iflag = 0; options.c_iflag &= ~ (INLCR | IGNCR | ICRNL);
Чтение и отправка данных
unsigned char buff[16] = ; int size = 8; int n = read(F_ID, buff, size);
unsigned char buff[4] = ; int size = 4; int n = write(F_ID, buff, size);
Завершение работы
Дополнительные возможности
Кроме сигналов TX и RX в COM порте присутствуют дополнительные сигналы,
например: RTS, CTS и т.д
иногда с ними необходимо работать.
Установка RTS:
int status; ioctl(F_ID, TIOCMGET, &status); status |= TIOCM_RTS; ioctl(F_ID, TIOCMSET, &status);
int status; ioctl(F_ID, TIOCMGET, &status); status &= ~TIOCM_RTS; ioctl(F_ID, TIOCMSET, &status);
В итоге получаем набор функций
#include #include #include #include #include #include
#include int F_ID = -1; /*---------------------------------------------------------------------------- Открыть COM порт COM_name: путь к устройству, например: /dev/ttyS0 или /dev/ttyUSB0 - для USB speed: скорость, например: B9600, B57600, B115200 ----------------------------------------------------------------------------*/ bool openPort(const char *COM_name,speed_t speed) < F_ID = open(COM_name, O_RDWR | O_NOCTTY); if(F_ID == -1) < char *errmsg = strerror(errno); printf("%s\n",errmsg); return false; >struct termios options; /*структура для установки порта*/ tcgetattr(F_ID, &options); /*читает пораметры порта*/ cfsetispeed(&options, speed); /*установка скорости порта*/ cfsetospeed(&options, speed); /*установка скорости порта*/ options.c_cc[VTIME] = 20; /*Время ожидания байта 20*0.1 = 2 секунды */ options.c_cc[VMIN] = 0; /*минимальное число байт для чтения*/ options.c_cflag &= ~PARENB; /*бит четности не используется*/ options.c_cflag &= ~CSTOPB; /*1 стоп бит */ options.c_cflag &= ~CSIZE; /*Размер байта*/ options.c_cflag |= CS8; /*8 бит*/ options.c_lflag = 0; options.c_oflag &= ~OPOST; /*Обязательно отключить постобработку*/ tcsetattr(F_ID, TCSANOW, &options); /*сохронения параметров порта*/ return true; > /*---------------------------------------------------------------------------- Прочитать данные из COM порта buff - буфер для принятых данных size - количество запрашиваемых байт ----------------------------------------------------------------------------*/ int readData(unsigned char *buff,int size) < int n = read(F_ID, buff, size); if(n == -1) < char *errmsg = strerror(errno); printf("%s\n",errmsg); >return n; > /*---------------------------------------------------------------------------- Отправить в COM порт данные buff - буфер данных для отправки size - количество отправляемых байт ----------------------------------------------------------------------------*/ int sendData(unsigned char* buff,int len) < int n = write(F_ID, buff, len); if(n == -1) < char *errmsg = strerror(errno); printf("%s\n",errmsg); >return n; > /*---------------------------------------------------------------------------- Закрыть COM порт ----------------------------------------------------------------------------*/ void closeCom(void) < close(F_ID); F_ID = -1; return; >/*---------------------------------------------------------------------------- Установить RTS ----------------------------------------------------------------------------*/ void setRTS() < int status; ioctl(F_ID, TIOCMGET, &status); status |= TIOCM_RTS; ioctl(F_ID, TIOCMSET, &status); >/*---------------------------------------------------------------------------- Очистить RTS ----------------------------------------------------------------------------*/ void clrRTS() < int status; ioctl(F_ID, TIOCMGET, &status); status &= ~TIOCM_RTS; ioctl(F_ID, TIOCMSET, &status); >/*---------------------------------------------------------------------------- Пример использования ----------------------------------------------------------------------------*/ int main() < bool res = openPort("\dev\ttyUSB0",B9600); if(!res) < printf("Невозможно открыть COM порт\n"); return 0; >unsigned char buff[8] = ; sendData(buff,8); int s = readData(rbuff,4); if(s < 4) < printf("Нет ответа\n"); return 0; >/* Наш код */ return 0; >