Настройка ком порта линукс

Работа с последовательным портом в 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

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

Надеюсь, что эта практика пригодится кому-то, кроме меня самого.
Приятного си-программирования!

Источник

настройка компорта

Здравствуйте подскажите как в linux через утилиту stty задать такие параметры порта 9600/8N1

stty 9600 cs8 -parenb -cstopb -F /dev/ttyS0

вот так на 8N1 да?

ага, ток запускай от рута

вот кто может пояснить ситуацию с антенны по протоколу nmea на компорт поступают сообщения(посылки) в windows все приходит нормально там программа производителя устройства но когда я вывожу в линуксе с компорта cat ★ ( 19.10.15 22:04:27 )

Запусти любой эмулятор терминала (мне больше самописный нравится) или сессию screen. Ты же понимаешь, что stdout является буферизируемым, поэтому если тебе долго не идут ‘\n’, то ничего ты и не увидишь.

На тебе мои сниппеты для жопоэса.

если в файл вывожу такие же кракозябры бывают) cat /dev/ttyS0>/log

Попробуй мой терминал или хотя бы com из tinyserial.

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

поясните подробнее «com из tinyserial» чт овы имели ввиду

никакие сурсы в систему ставить нельзя

Быть такого не может! Либо ставить, либо пусть мучаются. Хотя, им не привыкать.

Под «com из tinyserial» я имел в виду элементарный эмулятор терминала из пакета tinyserial. но даже без него можно выкрутиться: запустить сессию screen! Уж screen-то должен быть даже в огороженном анально МСВС!

Читайте также:  Установка apache для windows server

minicom должен быть в репозитории (или что там у них, сырцы?)

minicom — монстр, cu из uucp — лучший выбор 🙂

в том то все и дело мне это все не нужно. Мне нужно вывести с ком порта в файл а в файл выводятся то кракозябры то нормальные посылки.

а не использует ли кто в системе этот порт с другой скоростью ?

софт для ups или еще кто. Я тут так разок залетел с agetty повешанной на 57600 на ttyUSB0

Источник

Настраиваем виртуальный компорт в Ubuntu

Удобно работать с виртуальной машиной XPSP3 в VirtualBox’е: когда надо включаешь её, когда не надо – выключаешь, всё очень быстро, и вирусы прочно экранируются. Но вот понадобилось внести изменения в отлаживаемую «виндовую» программу, работающую со старыми добрыми компортами. И тут обнаруживается: не работает компорт виртуальной машины. В ЛОРе нет хорошего ответа. Всё сводится к рекомендации создания новой машины, а это время. Западные пользователи на форумах тоже дают немало пустых советов. А на самом деле всё не так уж и сложно.

Сначала надо установить утилиту настройки аппаратного компорта хост-машины. Называется она setserial, в дистрибутивах Ubuntu её нет, но зато она есть в репозиториях, поэтому воспользуемся командой терминала:

sudo apt-get install setserial

И, конечно, запустим эту утилиту, чтобы посмотреть, присутствует ли на материнской плате, что собой представляет и как настроен аппаратный порт хозяйки (далее в примере исследуем COM1):

sudo setserial -g /dev/ttyS0

Учтите, что ttyS0 соответствует COM1, ttyS1 соответствует COM2 и т.д. согласно терминологии Линукса. Подставьте нужное. После ввода пароля суперпользователя в норме должен быть получен ответ:

/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4

Иначе компорт отсутствует или отключен на уровне BIOS’а хост-машины. Выключенный порт включаем. В случае отсутствия на материнской плате аппаратного компорта придётся поставить «костыль» из дополнительной PCI-платы расширения и добавить модуль его драйвера из прилагаемого к ней диска. Проверено: для Линукса драйверы раюотоспособны, но уточните номер появившегося компорта командой терминала

При необходимости параметры настройки коммуникационного порта можно откорректировать ( как именно – см. терминальной командой man setserial).

Настраиваем проключение виртуального COMn в аппаратный COMn, то бишь в файл ttySn+1. Для этого запускаем VirtualBox, НЕ ЗАПУСКАЯ ВИРТУАЛЬНУЮ МАШИНУ, и настраиваем параметры её компорта, как показано на этом скриншоте:

Здесь важно, чтобы номер порта, номер прерывания и адрес ввода-вывода совпадали бы с теми, которые проиндицировала утилита setserial. Если не совпадают, то утилита setserial поможет перенастроить параметры аппаратного компорта.

Но если вы сейчас попытаетесь запустить виртуальную машину, то с очень большой вероятностью получите ошибку. А всего-то надо сделать ещё две вещи.

Во-первых, вы, хотя и являетесь «главным администратором», не обязательно автоматически являетесь членом группы пользователей виртуальной машины. Удивительно? Но бывает нередко. Впрочем, эта нелепость устраняется легко. Чтобы не заморачиваться с CLI, установите с помощью эмулятора терминала великолепную утилиту gnome-system-tools (она есть в репозиториях) командой

sudo apt-get install gnome-system-tools

Данную утилиту рекомендую для многократного употребления, поэтому скопируйте из папки /usr/share/applications значок «Пользователи и группы» на рабочий стол и запустите эту утилиту из рабочего стола. Откроется окно «Параметры пользователей». Жмите кнопку «Управление группами», в открывшемся окне «Параметры групп» скроллингом отыщите группу vboxusers, выберите её и дважды щёлкните по ней. Откроется окно «Свойства группы vboxusers». Внутри панели «Члены группы» пометьте чекбокс напротив своего имени, отражающего вас, как пользователя системы.

Во вторых, реальному порту следует присвоить права «666», что означает разрешение дуплексного обмена через компорт на уровнях владельца, членов его группы и остальных пользователей. Делается это командой

sudo chmod 666 /dev/ttyS0

Вместо ttyS0 подставьте обозначение нужного аппаратного компорта хост-машины. Вcё, теперь можно смело запускать виртуальную машину, включать привычный «виндовый» гипертерминал и с помощью виртуальной Windows настраивать модемы, управлять программаторами и т.д. Словом, делать всё то, как будто бы вы работали с реальной Windows XP или «семёркой». Успехов!

Читайте также:  Theme tool windows 10

Источник

Работа с последовательным портом на С в 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.
Например так:

Источник

Вики IT-KB

Пошаговые руководства, шпаргалки, полезные ссылки.

Инструменты пользователя

Инструменты сайта

Боковая панель

Содержание

Трансляция COM-порта с устройства Moxa Nport 5610 в виртуальную машину с Linux Debian 8 (Jessie)

В этой статье описан пример того, как GSM-модем, подключенный к физическому COM-порту (RS-232) устройства Moxa NPort транслировать в виртуальную машину с гостевой ОС Linux Debian 8 (Jessie). В данном примере используется устройство Moxa NPort 5610 8-Port RS-232 Device Server (с прошивкой версии 3.8 Build 17030709).

К одному из COM-портов устройства (в нашем примере это будет порт 2) подключаем GSM-модем. В данном случае в качестве модема используется терминал Siemens TC35i Terminal.

Настройка COM-порта на устройстве Moxa Nport

Переходим в веб-консоль управления устройства Moxa NPort и в разделе Serial Settings > Port 2 настраиваем параметры порта в соответствии со спецификацией поддерживаемых режимов работы подключенного к порту устройства:

Затем переходим в раздел веб-консоли Operating Settings > Port 2 и устанавливаем режим работы порта как Real COM Mode

Далее переходим в раздел веб-консоли Accessible IP Settings, включаем опцию Enable the accessible IP list и в табличной части указываем IP-адресы хостов, которые могут подключаться к нашему устройству Moxa NPort для трансляции COM-портов по сети. То есть, в нашем случае, здесь указывается IP-адрес виртуального Linux-сервера, в который мы в дальнейшем будем подключать транслируемые COM-порты. Дополнительно о настройке данного ограничивающего доступ списка можно почитать в Moxa FAQ.

Внимание!
Если на устройстве опция Enable the accessible IP list ранее не была включена, то при её включении после нажатия кнопки Submit устройство Moxa NPort будет автоматически перезагружено.

Поиск и получение драйвера Moxa Nport для Linux

Все драйверы, которые должны устанавливаться в систему, принимающую по сети транслируемые COM-порты можно найти на официальном сайте Moxa в разделе Support. В частности для Linux-систем драйвер для нашей модели доступен по ссылке

Читайте также:  Что такое cider mac os

На данный момент нам доступен старый драйвер: NPort Real TTY Driver for Linux — Edition 1.18 — Released on Mar 20, 2012
В заметках к драйверу, которые доступны по ссылке есть информация о том, что данная версия драйвера поддерживает ядро Linux Kernel до версии 3.1.0-7. В нашем же случае используется более новая версия ядра, установленная из официальных репозиториев Debian Jessie:

Сразу скажу, что драйвер со страницы загрузки у меня даже не установился. Поэтому пришлось воспользоваться более свежей версией драйвера, которую удалось обнаружить на форуме Moxa в ветке Установка Real TTY Driver в Debian. Действующая на данный момент ссылка на файл, опубликованная в этой ветке: npreal2_1.18.65_build_17062316.tgz

Установка драйвера Moxa Nport на стороне Linux Debian

Переходим на наш виртуальный сервер с Debian Jessie, и распаковываем в отдельный каталог загруженный по указанной ранее ссылке драйвер:

Ознакомится с документацией, поставляемой с драйвером можно в файле README.TXT в распакованном подкаталоге с драйвером:

В этом файле перечислены пакеты, которые могут потребоваться в системе для сборки и установки драйвера. Чтобы установить все сборочные зависимости выполним:

Переходим в каталог с распакованным драйвером и запускаем скрипт установки с ключом m64 , так как в нашем случае используется 64-битная ОС Linux:

Вывод скрипта установки будет примерно таким:

После успешного окончания установки все инструменты управления драйвером мы можем найти в каталоге /usr/lib/npreal2/driver . В частности, нам могут быть полезны утилиты:

Обратите внимание на то, что в в последующем, в случае обновления ядра Linux, может потребоваться повторное выполнение утилиты mxinst, так как модуль ядра npreal2 может перестать загружаться.

Подключение портов Moxa Nport на стороне Linux Debian

Итак, давайте подключим COM-порт c устройства Nport с помощью утилиты mxaddsvr, передав ей в качестве параметра IP адрес устройства и количество портов, которые мы хотим создать в системе

Вывод должен быть примерно таким:

В результате в нашей Linux-системе должно появится устройство /dev/ttyr01 , которое мы будем использовать в дальнейшем для обращения девайсу, подключенному к удалённому COM-порту. Конфигурация подключения к устройству Moxa NPort при этом будет записана в файл /usr/lib/npreal2/driver/npreal2d.cf .Если вы захотите править этот файл вручную (внимательно читайте инструкции в README.TXT ), то после его правки для вступления изменений в силу нужно запускать утилиту /usr/lib/npreal2/driver/mxloadsvr .

Теперь нам остаётся убедиться в том, что добавленный в процессе установке драйвера скрипт инициализации /etc/init.d/npreals успешно отрабатывает в процессе перезагрузки системы. Перезагружаем наш Debian сервер и проверяем наличие информации о загруженном драйвере в dmesg

Если драйвер по какой-то причине на попал в загрузку, смотрим о способах решения данной проблемы в README.TXT

Проверяем доступность транслированного в Linux устройства

Проверяем доступность подключенного через Nport и транслируемого в нашу систему GSM-модема. Для этого установим утилиту screen:

Подключаемся к порту:

Должен открыться новый пустой экран консольной сессии с модемом. Набираем команду получения информации о модеме

В ответ мы должны получить от модема его модель. Например, в нашем случае ответ выглядит так:

Если ответ получен, значит желаемый результат нами достигнут.

Завершаем screen сессию клавишами «Ctrl+a» затем «\»

Внизу экрана появится вопрос

Жмём «y». Сессия screen будет завершена и соединение с модемом на порту /dev/ttyr0 будет завершено.

Отключение портов и удаление драйвера Moxa Nport в Linux

Как удалить подключение к устройству Moxa Nport:

Как удалить драйвер Moxa NPort:

Проверено на следующих конфигурациях:

Версия Moxa NPort Firmware Версия ОС Linux Версия драйвера Real TTY
3.8 Build 17030709 Linux Debian 8.6 (Jessie) Kernel 3.16.0-4-amd64 1.18.65

Автор первичной редакции:
Алексей Максимов
Время публикации: 15.09.2017 11:08

Источник

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