Управление ком портом линукс

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; >

Источник

Читайте также:  Install nano in linux

Работа с 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 бит, нет контроля четности, и один стоповый бит. Именно здесь можно это все увидеть и настроить так, как требуется или, как требует ваше устройство.

Читайте также:  Linux load cpu 100

Сохраняем конфигурацию по умолчанию. Дальше будем взаимодействовать — сначала с помощью команды терминала, чтобы проверить, как вручную это работает; а потом напишем небольшую программу, которая будет слать данные в 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.

Источник

Оцените статью
Adblock
detector