- Работа с последовательным портом на С в Linux
- Русские Блоги
- Начало работы с последовательным портом в Linux
- Интеллектуальная рекомендация
- Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
- Создайте многоканальное окно в приложениях Win32
- Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
- Tree——No.617 Merge Two Binary Trees
- Заметки о Linux, электронике, радиолюбительстве
- воскресенье, 27 июля 2014 г.
- Работа с последовательным портом из консоли Linux
- Работа с последовательным портом в windows и linux
Работа с последовательным портом на С в Linux
Я уже писал о том, как работать с последовательным портом в Windows. Теперь созрела необходимость написать программу для обмена данными по последовательному каналу.
Работать с последовательным портом в Linux несколько сложнее чем в Windows.
Как и с любым другим устройством работа из пространства пользователя Linux происходит посредством чтения и записи в файл. Его нужно открыть при помощи функции open, в качестве параметров передаем путь к файлу и флаги.
- O_RDWR — чтение и запись
- O_NONBLOCK — не блокировать файл
- O_NOCTTY — не делать устройство управлящим терминалом
- O_NDELAY — не использовать DCD линию
Функция возвращает идентификатор открытого файла или -1 в случае ошибки.
Если файл открыт успешно очистим флаги состояния файла вызовом fcntl.
Для управления настройками последовательного порта предусмотрен интерфейс termios. Заводим структуру типа termios.
Как видно она содержит флаги управления приемом/передачей.
Сбрасываем значения в 0.
Устанавливаем скорость обмена 9600 бод.
Далее необходимо настроить ряд флагов для указания операционной системе, что это не консольный терминал, а канал обмена «сырыми» данными.
После настройки порта же все просто, используем вызовы write/read для записи/чтения данных.
Для примера передадим Modbus команду чтения:
где 8 — длина буфера данных для отправки.
Далее необходимо считать ответ. Можно конечно же сразу написать вызов read. Но таким образом мы заблокируем программу до поступления желаемого количества данных, а ответа может и не быть! Чтобы избежать этого заведем структуру типа timeval и организуем вызов select.
Например так:
Источник
Русские Блоги
Начало работы с последовательным портом в Linux
Операционная система Linux с самого начала обеспечивала хорошую поддержку последовательного порта.В этой статье кратко рассказывается о программировании связи через последовательный порт в Linux.
Введение в последовательный порт
Последовательный порт — это обычно используемый компьютерный интерфейс с несколькими линиями подключения, простой связью и широко используется. Обычно используемый последовательный порт — это интерфейс RS-232-C (также известный как EIA RS-232-C), который был совместно разработан Ассоциацией электронной промышленности (EIA) США в 1970 году совместно с Bell Systems, производителями модемов и производителями компьютерных терминалов для последовательного порта. Стандарты линейной связи. Его полное название — «Технический стандарт для интерфейса последовательного обмена двоичными данными между оконечным оборудованием данных (DTE) и оборудованием передачи данных (DCE)». Стандарт предусматривает использование 25-контактного разъема DB25 для каждого вывода разъема. Контент сигнала пина регулируется, а уровень различных сигналов регулируется. Когда расстояние передачи меньше 4%, длина кабеля передачи должна составлять 50 футов.
Операционная система Linux с самого начала обеспечивала очень хорошую поддержку последовательного порта. В этой статье кратко описывается программирование связи через последовательный порт в Linux. Если вы хотите получить более глубокое понимание, рекомендуется прочитать «Руководство по последовательному программированию», упомянутое в этой статье. для операционных систем POSIX》
Работа последовательного порта
Заголовочные файлы, необходимые для работы последовательного порта
#include /Стандартное определение ввода и вывода/
#include /Определение стандартной библиотеки функций/
#include /Определение стандартной функции Unix/
#include /Определение контроля документов/
#include /Определение управления терминалом PPSIX/
#include /Определение номера ошибки/
Откройте последовательный порт
В 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);
Закройте последовательный порт
Чтобы закрыть последовательный порт, нужно закрыть файл.
Ниже приведен простой пример чтения данных последовательного порта с использованием некоторых функций и файлов заголовков, определенных выше.
#define FALSE -1
#define TRUE 0
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);
>
Интеллектуальная рекомендация
Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
пример тестовое задание Исходный код Несмотря на загрузку файлов в Servlet3.0 +, мы можем очень легко программировать на стороне сервера, но пользовательский интерфейс не очень дружелюбен. Одна HTML-ф.
Создайте многоканальное окно в приложениях Win32
Создайте многоканальное окно в приложениях Win32, создайте несколько оконных объектов одного и того же класса Windows, а окна объектов разных классов окон. .
Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
IOS-APP реконструкция дороги (1) структура сетевых запросов IOS-APP реконструкция дороги (два) Модельный дизайн При рефакторинге нам нужна форма, позволяющая вносить смелые изменения, обеспечивая при .
Tree——No.617 Merge Two Binary Trees
Problem: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new bin.
Источник
Заметки о 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:
Источник
Работа с последовательным портом в windows и linux
Часто бывает необходимо, чтобы работа с устройством поддерживалась как в windows, так и в linux. В моем случае нужно было обеспечить работу com-порта в приложении, написанном на с/с++ с использованием кроссплатформенной библиотеки QT. Штатной поддержки программирования портов в QT нет (да и ни к чему это). Поэтому в win32 для работы с портом будем использовать средства WinAPI. В linux системах же, как известно для работы с устройствами используются специальные файлы.
Итак, взяв на вооружение всем знакомый gcc и его windows-аналог mingw, напишем нехитрый код.
Код будет довольно таки искусственным, т.к. ставится цель не более, чем показать принципы работы с com-портами в двух операционках. Для управления компилятором будем использовать директивы определения компилятора и ОС (__MINGW32__ и __linux). Com-портом в нашем случае является устройство dev/ttyS0 и COM1.
Инициализация
#ifdef __MINGW32__
HANDLE hSerial = CreateFile(«COM1»,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if (hSerial == INVALID_HANDLE_VALUE) <
printf(«Error opening port\r\n»);
return -1;
>
#endif
#ifdef __linux
int fd = open(«/dev/ttyS0», O_RDWR | O_NOCTTY );
if (fd
Здесь в win32 используется функция CreateFile, параметры по ссылке в коде. Функция возвращает хендл на на устройство, в которым мы дальше будем работать. Аналогично работает и open в linux.
Запись
Для записи в порт используем ранее возвращенный хендл и пишем соответствующими функциями.
Процедура чтения выглядит аналогично.
Чтение
Закрытие порта
#ifdef __MINGW32__
CloseHandle(hSerial);
#endif
#ifdef __linux
close(fd);
#endif
Кроме того, существуют функции для настройки самих портов. Об их использовании я, возможно, напишу в следующих статьях. В нашем примере все работает по стандартным настройкам системы.
Осталось дело за малым — скомпилировать код под каждую из ОС.
Надеюсь, что эта практика пригодится кому-то, кроме меня самого.
Приятного си-программирования!
Источник