Linux скорость com порта

Работа с 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-машине.

Читайте также:  Как настроить xampp linux

Создадим какой-нибудь каталог, в котором будем разрабатывать приложение. Как это ни странно, приложение будет выглядеть очень просто, потому что все действия, которые мы делаем с 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 через утилиту 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-то должен быть даже в огороженном анально МСВС!

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

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

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

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

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

Источник

скорость порта ttyUSB

Добрый день!
OC:Debian 3.16.36-1+deb8u2.
К серверу подключен 3G-модем Huawei E1550, версия прошивки — 11.608.14.15.311
Модем видится как 3 устройства:

Тебе не нужно ничего ставить, ttyUSB если это не usb->uart никак к этой скорости не привязаны.

Читайте также:  Mac os check port usage

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

Сколько пролезло через USB столько и будет.

для этого необходимо узнать — поддерживает ли модем другую скорость. И скорее всего необходимо будет выполнить AT команду на модеме, которая переключит его порт на скорость больше чем 9600. Передернуть модем. А после уже думать об увеличении скорости USB порта (виртуального порта)

Скорость нужна только в одном случае, когда на железной стороне у тебя реальный U(S)ART. В остальных случаях типа usb-модемов — это рудимент оставленный для совместимости интерфейсов.

однако некоторые USB модемы работают на скорости 115200 по умолчанию. Конечно — если UARTa нет в модеме то это эмуляция. посмотрел спеку на свой модем — сходу не нашел АТ команды по смене скорости. Возможно скорость зашита жестко в драйвер модема.

подключись с любой другой скоростью. изменений не увидишь.

Ну и тебя не смущает, что ты получаешь 14MBit через 115200 порт?

это рудимент оставленный для совместимости интерфейсов.

Да полноте. Какой рудимент? Это типичное забивание гвоздей микроскопом. Типа мы сделаем видимость что у нас есть микроскоп, но вот все крутилки сделаем фальшивыми, вроде крутилка есть, а не крутится. По вашей логике с таким же успехом вы можете назвать рудиментом управление скорости на эзернете.

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

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

На eth управление скоростью приводит к вполне конкретным изменениям на физическом уровне. Потому не рудимент.

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

Пока usb-ep не отдаст ACK, ему следующий не отправят. Буферизация и так на хосте происходит. Так что в случае с usb-модемом, это именно рудимент.

Не надо путать с usb-u(s)art, где установка скорости на tty является установкой скорости физического u(s)art.

Пока usb-ep не отдаст ACK, ему следующий не отправят.

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

Не надо путать с usb-u(s)art, где установка скорости на tty является установкой скорости физического u(s)art.

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

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

у меня модем sierra в одном из режимов для передачи пакетов создается другой интерфейс.
• “DIP”—Direct IP interface
• “QMI”—QMI interface

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

Для начала почитать сюда, потом в исходники линуксовых драйверов. Сейчас там почти неплохо, пять лет назад местами был мрак.

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

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

Читайте также:  Виртуальные жесткие диски для windows

А вообще, с наступлением 3G/4G, PPP интерфейс становится сильно ограничивающим в плане скорости. Потому сейчас модемы стараются делать как usb-eth в лучшем случае cdc-wdm, в худшем RNDIS. И работает действительно быстрее.

Это мне известно.

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

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

А ты попробуй и увидишь что он отлично откликается и на 9600 и даже пакеты будут ходить примерно с той же скоростью.

А потом сравни с QMI(который умеет modemmanager, если ты к десктопному линуксу цепляешься). В общем случае latency будет ниже и максимальная скорость повыше, но это если БС тебе отдаст достаточно широкий поток.

Тогда ты пишешь странное.

Похоже проблема чисто китайская, дооптимизировались

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

Источник

Федоренко на связи

Заметки на полях

Проверка COM порта под linux

В этой заметке я расскажу про то, как можно проверить COM порт в Linux.

Для этого нам понадобятся:

  • права на чтение и запись в COM порт
  • программа minicom
  • кусок толстого многожильного кабеля
Права доступа

проверяем какие у нас в системе есть COM порты, а также наши права на них:

/dev/ttyS0 это первый COM порт
/dev/ttyS1 соответственно второй COM порт
/dev/ttyUSB0 специальный кабель-переходник из USB в COM (Gembird UAS111)

Как мы видим для работы с COM портом необходимы права root либо пользователь должен входить в группу dialout

Провод для связи

Берём многожильный кабель в оплётке длиной 4-6 см, и соединяем 2 и 3 выводы COM порта перемычкой из этого кусочка провода. Оплётка будет удерживать провод на контактах, а металлические жилы внутри будут проводниками.
Для любителей паять можно предложить спаять полный loop-back тестер. В нём соединить не только контакты приёма передачи, но и аппаратный контроль потока и готовность терминала.

Работа с программой minicom

Для начала необходимо настроить программу minicom

Выбираем «Настройка последовательного порта»

Если нужно, меняем СОМ порт, нажимая «A»
Отключаем аппаратное управление потоком, нажимая «F»
Выходим из настроек «Enter»
Сохраняем настройки по умолчанию «Сохранить настройки как dfl»
Выходим из minicom

Собственно проверка СОМ порта

Запускаем minicom без параметров.

Пробуем нажимать на клавиши. В ответ на экране должны появляться символы.
Проверка COM порта под linux завершена.

Эта запись была сделана 21.12.2010, 13:50 под рубрикой Разное. Вы можете подписаться на эту запись с помощью RSS 2.0. Both comments and pings are currently closed.

5 комментариев (and 38 trackbacks)

#1 by Евгений on 02.05.2012 — 12:50

А как им управлять через PHP скрипт? Спасибо за статью!

Источник

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