Виртуальный ком порт usb линукс

Заметки о 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:

Источник

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

Виртуальный com порт

Модератор: Bizdelnick

Виртуальный com порт

Сообщение troll80 » 17.05.2009 14:27

Re: Виртуальный com порт

Сообщение sash-kan » 17.05.2009 15:03

Читайте также:  Trucks and trailers windows 10

Re: Виртуальный com порт

Сообщение troll80 » 17.05.2009 16:07

Re: Виртуальный com порт

Сообщение troll80 » 17.05.2009 16:14

Re: Виртуальный com порт

Сообщение sash-kan » 17.05.2009 22:52

и больше ничего не появляется? забыл написать, что неплохо бы подключение производить после перезагрузки системы и команду dmesg выполнять через несколько (10-20) секунд после подключения кабеля.

но, судя по всему, придётся вам углубляться в usb-протоколы и в эмуляцию последовательного порта.
начать, наверно, можно с модуля usbserial:
Documentation/usb/usb-serial.txt
и
$ sudo modinfo usbserial
на предмет параметров, принимаемых модулем.

p.s. dmesg -c очищает буфер сообщений ядра.

Re: Виртуальный com порт

Сообщение troll80 » 18.05.2009 09:42

Re: Виртуальный com порт

Сообщение Denjs » 18.05.2009 10:26

Не надо нам «аналогий винды».
Если устройство полноценное, т.е. полностью реализует (нормально и правильно) профиль «последовательный порт» для USB, то никаких драйверов как правило ставить не надо — в большинстве дистрибутивов думаю уже идет в комплекте все что нужно. По крайней мере в SuSe Linux все идет «из коробки».

Например вот такой usb-2-com-адаптер в SuSe Linux 11.0 определяется без всяких доп. модулей, и создается устройство /dev/ttyUSB0 с которым можно работать так-же полноценно как и с «родным» /dev/ttyS0
Если ваше устройство реализует нормальный профиль для usb и полностью(!) — оно должно определяться аналогично.

Re: Виртуальный com порт

Сообщение Denjs » 18.05.2009 10:51

Вообще как я понимаю нужен подключенный модуль usbserial .
Также вы можете посмотреть сюда и/или сюда. Как я понимаю это про ваше устройство?

В общем просто включите модуль usbserial есил он не включен, и проверьте наличие у вас устройства /dev/ttyUSB0
там впрочем сказано загружать с заданными параметрами (судя по вашему dmesg после подключения — это ваше устройство)

Источник

Эмуляция COM-порта у сканера-штрихкода bluetooth в Linux

Имеется сканер-штрихкода подключенный к USB свистку в CentOS 6.10.
В Windows для подключения этого сканера к 1С используется эмуляция COM-порта. Т.е. подключаем сканер через специальную программу, которая как я понимаю пробрасывает данные с подключенного к «свистку» по bluetooth сканера на созданный этой програмкой COM-порт и обратно, а 1С уже работает с данным COM-портом.

Вопрос такой. Как подобное сделать в Linux?
Сканер по bluetooth подключается.

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

ну подключил, теперь rfcomm на него и будет com порт

«популярное пояснение»

подключаем сканер через специальную программу, которая как я понимаю пробрасывает данные с подключенного к «свистку» по bluetooth сканера на созданный этой програмкой COM-порт и обратно, а 1С уже работает с данным COM-портом.

у тебя сложились неверные представления. com-порт «создает» ОС (точнее драйвер устройства; но эти детали тебе не нужны). программа работает с устройством через этот виртуальный com-порт. Как там и что делал в windows в связке программа 1C не так важно сейчас для тебя.

В linux
После сопряжения сканера и адаптера bluetooth создаётся устройство /dev/rfcomm0 (это не точно). Посмотреть как именно называется sdptool browse или сразу после сопряжения искать в выхлопе dmesg|tail

для использования сканера необходимо ПО под linux (его нет?) или описание системы команд/протокола для обмена через com-порт для написания такого ПО (ну или скриптов). Если такой документации нет (производитель/продавец же не предоставляет?), то возможно поискать в открытом ПО для сканеров (есть такое?). На крайний случай wine (такое возможно?) или реверсинженеринг ПО из windows.

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

1С в linux может работать c этими данными только через внешнею компоненту(ВК) с типом Native.

В стандартных конфигурациях есть такая Драйвер1СУстройстваВводаNative. См там должны быть два SO, например: ScanOPOSNativeLin64_8_1_9_1.so ScanOPOSNativeLin32_8_1_9_1.so

Нашел такую конфигурацию БПО (библиотека подключаемого оборудования) буду через неё пробовать. Там есть такой драйвер оборудования как «1С:Сканеры штрихкода (NativeApi)», попробую его.

Вообщем настроил следующим образом

У меня появился файл /dev/rfcomm0.
Потом я удалил /dev/ttyS3 и сделал Линк с /dev/rfcomm0 на /dev/ttyS3

Это поведение соответствует заявленному производителем? Режим энергосбережения или что-то похожее.

мне тут подсказывают, что возможно нужно убрать park

мне тут подсказывают, что возможно нужно убрать park

Убрал, но ничего не изменилось, все так же отключается. Причем в Windows с той же конфигурацией 1С и сканером, такого не наблюдается. Какие еще настройки могут на это влиять?
И еще вопрос. Можно как то сделать чтобы сканер сам подключался на ttyS3? А то приходится каждый раз вручную делать симлинк с rfcomm0.
И rfcomm0 почему то появляется только после ручного

Читайте также:  Чистим windows от мусора

Есть преобразователи USB<>bluetooth последовательного порта. Они появляются как /dev/ttyUSBx. Возможно, как раз то, что надо. Около двух-трех баксов на али.

А чего, этот сканер клавиатурой не умеет работать?

мне тут подсказывают, что возможно нужно убрать park

Убрал, но ничего не изменилось, все так же отключается.

Вот по этому ману получается, что это никак не отключается — бред, наверное я не разобрался. Также sniff, как я понял, может быть причиной; но как это изменить непонятно. Есть идея добавить discovto 0 — хотя, это вроде бы «о другом»; я бы попробовал. На крайний случай придётся «костылять» некий сервис, который будет проверять наличие порта и если его нет подключать сканер автоматически — мне такое не нравится. Но если, через конфиг не получится, я не вижу других средств.

А действительно необходимо держать сканер постоянно соединённым с ПК?

Можно как то сделать чтобы сканер сам подключался на ttyS3? А то приходится каждый раз вручную делать симлинк с rfcomm0.

Да, через правила udev. Опять же я бы

  • сначала посмотрел что происходит при спаривании сканера и ПК в dmesg
  • посмотрел текущие правил для сканера в /etc/udev/rules.d/
  • создал/модифицировал правило

И rfcomm0 почему то появляется только после ручного

про rfcomm0 я по памяти писал, возможно это и необязательно. Но мне это странно, может же быть несколько устройств с rfcomm и с разными настройками. Решается через правило udev

А чего, этот сканер клавиатурой не умеет работать?

Умеет, но как мне кажется это более медленный и менее надежный способ.

Есть преобразователи USB<>bluetooth последовательного порта. Они появляются как /dev/ttyUSBx. Возможно, как раз то, что надо. Около двух-трех баксов на али.

Т.е.поставить преобразователь с Али, а в него уже «свисток» пихать? Чего то фигня какая то получается, Будет ли вообще такая связка работать?

«Свисток» в данном случае не понадобится. Будет эмуляция последовательного порта на bluetooth

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

«Свисток» в данном случае не понадобится. Будет эмуляция последовательного порта на bluetooth

Я может не понимаю чего, можно ссылку? Поискал и не могу понять о чем речь.

А как спаривание делать, вручную? При com порте происходит автоматически при обращении к нему (вроде бы).

Ищи HC-05 или HC-06 на Али. Пишу с планшета, поэтому ссылки дать не могу.

Вот по этому ману получается, что это никак не отключается — бред, наверное я не разобрался. Также sniff, как я понял, может быть причиной; но как это изменить непонятно. Есть идея добавить discovto 0 — хотя, это вроде бы «о другом»; я бы попробовал.

Добавил, но ничего не произошло. А может как то влиять постфикс приходящего со сканера? У меня после кода идет ‘CR’+’LF’ на win, а на Линуксе, почему-то, ‘LF’+’LF’.

А действительно необходимо держать сканер постоянно соединённым с ПК?

Мне он не нужен постоянно подключенный, логика такая. Когда 1С лезет в COM порт происходит подключение самого сканера, а когда отключается то соединение рвется, по крайней мере в Windows было так. Тут же получается что устройства rfcomm0 не видно вообще пока не сделаешь

Сейчас как раз ковыряю его. Пока сделал через скрипт при старте.

При помощи AT-команд модуль настраивается как мастер и подключается к заданной железке. Далее он просто проксирует поток между синезубом и виртуальным портом.

А, блин, да: к модулю понадобится usb-ttl, что-то я ступил!

Это ожидаемый результат :(, но ведь проверить надо было.

меня после кода идет ‘CR’+’LF’ на win, а на Линуксе, почему-то, ‘LF’+’LF’.

Думаю «да», это влияет. Про сканер не скажу, а модемы «вешаются» если не получают ‘CR’+’LF’. Для модемов понимающих AT-команды (и windows-а) комбинация ‘CR’+’LF’ разделяет строки. В линуксе принято просто ‘LF’. А где ты наблюдаешь эти коды?

ут же получается что устройства rfcomm0 не видно вообще пока не сделаешь

для USB-модемов (да и не только) создаются устройства /dev/ttyUSB (или /dev/ttyACM ; есть ещё варианты). А вот для виртуального порта через Bluetooth разрабы отчего-то приняли просто rfcomm (мне вот непонятно). Если других виртуальных портов через Bluetooth у тебя не предвидится, то можешь не создавать rfcomm0 — сразу rfcomm привязывай к /dev/ttyS*

Хочется уточнить проблемы именно при работе через 1C?

если работать с этим портом через терминал (например CuteCOM) проблема есть?

Ничего уже не понимаю. 🙁 После запуска minicom, он тут же крашится.. НО зато после этого сканер ведет себя так как нужно, на конце ‘CR’+’LF’ и не отваливается.
Не понимаю в чем проблема, возможно при старте minicom что то донастраивает, а вот что и где посмотреть пока непонятно. Ну не запускать же его при старте системы..

Читайте также:  Убрать надпись активация windows 2012 r2

stty поможет проверить настройки порта.

Нет только, например если сделать

то тоже вылетает через 5 сек. По выводу видно что передается два ‘LF’

stty поможет проверить настройки порта.

Я уже туплю наверное. Подскажите как посмотреть то? 🙁

Да, вот этот момент как-то ускользнул от внимания. Вероятно, просто привязать rfcomm* к ttyS* мало, нужна и «наладка». Если не ошибаюсь, то параметры порта можно подсмотреть в inf-файле его виндового драйвера. В скрипт, который «дергается» правилом udev для rfcomm добавить команду настройки через stty.

Разобрался.
До запуска minicom

В паре написано, я до ноутбука только вечером доберусь. После обхода и прогулки.

Нашел какие два ключа были нужны

Погуглив вроде это файл, rc.serial. Но у меня в CentOS нет такого, а его создание ни к чему не приводит.

Нашел какие два ключа были нужны

после привязки rfcomm* к /dev/ttyS3 выполни

Да так работает, но при этом происходит активация сканера и он пищит. А нельзя это как то без спаривания сделать? Ну типа правил udev.

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

Чего то не выходит у меня. Я правильно понял, что правило типа такого?

Может в другое место надо запихать?

Но если сделать скрипт таким то все работает, правда выглядит как костыль.

KERNEL==«rfcomm0», SUBSYSTEM==«tty», ATTR

==«00:20:E0:7F:43:0A», ATTR==«1», SYMLINK+=«ttyS5», RUN+=«/etc/bluetooth/stty_SF51.sh»

да, примерно так оно и должно выглядеть. разве что, я бы добавил ACTION==»add»

Не срабатывает скорее всего потому, что на момент выполнения команды порт ещё не связан с симлинком — т.е. нет устройства /dev/ttyS5. Я уже обращал твоё внимание, что команда должна применяться после появления устройства в /dev/ttyS5. Или добавить ACTION==»add» в правило или модифицировать скрипт. Например, как ты поставить задержку или вот так как-то

Причем если сканер находится в энергосберегающем режиме то вообще ничего не получается. И к тому же происходит активация сканера и он пищит. Может все таки можно как то более красиво сделать?

Всё дело в том, что американцы программы «тупые». Сканер и так скорее всего находиться в требуемом режиме, но stty делает ему принудительную настройку, причём при каждом его появлении в системе. Хотя нам этого как бы и не нужно. По умолчанию последовательный порт в линукс имеет установки отличающиеся от настроек в сканере (коряво сказал) — тебе бы только «принимающий» интерфейс настроить, а там мы настраиваем всю цепочку. Вот не знаю можно ли такое сделать. Точнее сказать: не знаю как это сделать.

P.S. Ты же взаимодействуешь со сканером через какие-то компоненты 1С? Там нет конфигов для настройки портов/устройств?

1с может читать с fifo? Сделай fifo, да отформатируй выхлоп туда. Что ему вообще надо? Может через xdotool накостылись можно.

Но если сделать скрипт таким то все работает, правда выглядит как костыль.

У меня был скрипт типа такого, он до сих пор там работает. Сканер штрихкодов штука тупая. Он просто передаёт код и endline в конце. Я его просто замыкал на xdotool и все были счастливы. Я из треда не понял кто кому что передаёт, опиши весь процесс еще раз.

Не знаю что с этим кодом не так но у меня при старте сканер вошел в бесконечный цикл (включался-выключался) и система при попытке перегрузится наглухо висла, помогало только по питанию выключить.

Добавление ACTION==«add» ничего не меняет все равно нужен sleep 1

Сканер и так скорее всего находиться в требуемом режиме, но stty делает ему принудительную настройку, причём при каждом его появлении в системе.

Да вроде как достаточно только один раз сделать, а потом само работает.

P.S. Ты же взаимодействуешь со сканером через какие-то компоненты 1С? Там нет конфигов для настройки портов/устройств?

Да вроде нет стандартных, но буду что то колхозть тогда. 🙂

Я из треда не понял кто кому что передаёт, опиши весь процесс еще раз.

Если я правильно понял, то примерно так. Сканер bluetooth Подключается к USB-bluetooth, создается порт /dev/rfcomm0 на который создается линк /dev/ttyS5. А 1С, через драйвер NativeAPI подключается к COM6. Или не так?

Не знаю что с этим кодом не так но у меня при старте сканер вошел в бесконечный цикл (включался-выключался) и система при попытке перегрузится наглухо висла, помогало только по питанию выключить.

ну так аффтар «перла» как бы намекал

я не проверял работоспособность этого «кода»
«кода»

Сообщаю для тех кто может тоже захотеть попробовать. 🙂

Источник

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