Виртуальный com порт для usb linux

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

Источник

как сделать эмуляцию serial порта на usb-устройстве?

В windows’е для определенного устройства есть специальный драйвер. Как мне его воспроизвести на linux mint 15? http://dumpz.org/753081/ — вот код драйвера.

Написать драйвер. Что за устройство-то?

Написать драйвер. Что за устройство-то?

Самодельное — дали поюзать, описали протокол взаимодействия по Serial-порту, дали драйвер под винду..)

Как драйвер под венду называется?

CDC, «драйвер» в ведре.

Cмотри драйвер usbserial.

Установи пакет tinyserial, запускай com /dev/ttyACM0 [скорость] . Или тупо screen используй — он-то у всех установлен.

А еще можно при помощи setserial или minicom настроить «порт» и фигачить посредством echo туда всякую дребедень, считывая tailf ‘ом.

Это, извиняюсь, говнище какое-то, но никак не код «драйвера»!

Да, конечно. Я бы даже не начинал разбираться, если б протокола не было )))

Лол, это *.inf от вендового драйвера; не код, да.

В общем, похоже, ТС собирается сделать «то, не знаю, что». Трудно ему придется.

В общем, похоже, ТС собирается сделать «то, не знаю, что». Трудно ему придется.

Для того тему и завел — спросить совета. tinyserial в mint’е нету. $ /dev/ttyACM0 не появляется. С setserial и minicom не разобрался. Да. Трудно.

Читайте также:  Точка доступа для андроид windows

Как страшно жить.

Вынимаешь железку, вставляешь, смотришь dmesg что там определилось. В девайсах у тебя появятся ttyACM0 или ttyU0 . На него и натравливаешь cu или minicom .

Par example: cu -s 9600 -l /dev/ttyU0

Либо эта самоделка глючит либо драйвер её не опознаёт.

Попробуй lsusb, может он его покажет. Но то, что в dmesg его не видно это плохой признак.

Кабель к нему тоже самопальный идёт?

Кабель к нему тоже самопальный идёт?

Покупной обычный Mini usb — Crc-драйвер успешно ищется и встает на винде — только-что попробовал.

Ну ты как маленький прямо! Запусти udevadm monitor и воткни железяку. Если по выхлопу удева не поймешь, то dmesg тебе, возможно, что-то подскажет.

А если это не CDC, а хитрожопая вантузная НĒХ, то придется при помощи libusb что-нибудь пилить.

В девайсах у тебя появятся ttyACM0 или ttyU0

Увы — их не появляется.

dmesg что говорит? А lsusb ? А udevadm monitor при втыкании железяки?

Если все молчат, производитель железки — козел.

До неё только дошел — уже завтра буду разбираться. Через pyusb делаю:

путем исключения после втыкания и вытыкания usb-девайсов, становится понятно, что что-то там видно на usb-порте. вопрос тепрь, как с этим «что-то» работать, через вот эту либу.

после втыкания и вытыкания usb-девайсов, становится понятно, что что-то там видно на usb-порте.

Посмотри через lsusb, что за VID и PID у железяки. А еще глянь, какое устройство ей соответствует (/dev/bus/usb/[BUS]/[DEV]) и попробуй его открыть в обычном последовательном терминале. Вдруг случится чудо? Тогда просто правило для удева напишешь для этих VID и PID, чтобы симлинк делал.

Есть нормальные железные эмуляшки от старых нокиа. Банка пива.
Правда получается не com1, com2 и с програматорами правильно не сростется.
Если конечно для этого нужно. rts, cts и тп.

Поднял задницу — нашел.
Bus 005 Device 002: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Оно.

USB CDC ACM Vendor and Product ID Definitions VID 04D8 PID 000A

Гуглишь «linux VID 04D8 PID 000A» и находишь что стоит его один раз воткнуть в Ubuntu 10.04 — оно начинает рабоать везде. Так что выкинь нахер свой минт и ставь убунту.

I did not change anything. No patches, nothing. I just loaded «usbserial», «cdc_acm» and «ftdi_sio», plugged in the device and it worked. I added the modules to /etc/modules and the board gets ready with the RPi boot. Perfect! The only difference is, that I plugged it once into my notebook with Ubuntu 10.04 (2.6.+).

Волшебный дистрибутив — сам пользуюсь 🙂

Возможно ТС-у просто нужно вручную сделать:

$ modprobe usbserial $ modprobe cdc_acm

и воткнуть девайс. Возможно тогда оно подцепится в Mint.

Скорее всего, в параметрах указав pid и vid девайса (product=xxx, vendor=xxx).

Источник

Настраиваем виртуальный компорт в 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». Внутри панели «Члены группы» пометьте чекбокс напротив своего имени, отражающего вас, как пользователя системы.

Читайте также:  Найти новое устройство windows

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

sudo chmod 666 /dev/ttyS0

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

Источник

Кунг-фу стиля Linux: разбираемся с последовательными портами

Раньше последовательные порты были буквально повсюду. И они, в каком-то смысле, никуда и не делись, так как многое, что подключается к компьютеру по USB, на самом деле, выглядит для системы как последовательный порт. Проблема тут заключается в том, что в наши дни всё в мире завязано на компьютерные сети. Конечно, можно купить терминальный сервер, который преобразует последовательный порт в интерфейс Ethernet. Но это совсем не интересно. Здесь я хочу рассказать о том, как пробрасывать последовательные порты по сети с использованием существующих Linux-инструментов. Решение это не идеальное, оно оказывается работоспособным далеко не всегда, но если оно работает, то работает оно хорошо.

Всё — это файл — до тех пор, пока это не так

Когда-то в прошлом ОС Unix — прародитель Linux — практически всё считала файлом. Все файлы были созданы более или менее равными. Программы не заботило то, с чем именно им приходилось работать: с локальными файлами, с файлами, доступными по сети, с файлами, считанными с ленточного накопителя, или с файлами, прибывшими по именованному каналу.

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

Переходник USB/последовательный порт

Практика, конечно, отличается от теории. В некоторых случаях, очень простых, это может и сработать. Для настройки вышеописанной схемы работы с последовательными портами можно воспользоваться утилитой socat (это — нечто вроде cat для сокетов). Но если программа, которую мы пытаемся таким образом обмануть, попробует, например, задать скорость порта в бодах, то у неё, вероятно, ничего не получится. А некоторые программы даже не распознают такой вот ненастоящий последовательный порт.

Подробности о socat

Программа socat напоминает волшебный кабель-переходник, который просто передаёт на выход всё, что поступает на его вход, и, кроме того, поддерживает передачу данных в обратном направлении. Программа может читать данные из файлов, из каналов, с различных устройств, из сокетов и из некоторых других мест. Например, может понадобиться создать простой TCP-прокси для перенаправления соединений с одного локального хоста на другой хост. С помощью socat решить эту задачу очень просто:

То, что получится в результате выполнения этой команды, поддерживает лишь одно соединение. Но socat можно настроить так, чтобы для новых соединений создавались бы форки, что позволяет обрабатывать множество запросов.

Проблема

Правда, если попытаться применить socat для работы с последовательным портом, то получившаяся конструкция вряд ли будет работать без множества дополнительных настроек. Но нужно это так часто, что существует несколько программ, способных нам в этом помочь. В большинстве Linux-дистрибутивов заработает программа ser2net , которая умеет преобразовывать последовательный порт в сокет. Если ser2net кому-то не подойдёт — можно воспользоваться Python-кодом, который имеется среди примеров использования библиотеки pyserial . Правда, та версия pyserial , которая установлена в используемом дистрибутиве, может оказаться слишком старой для поддержки этого кода. Если это так и есть — нужно установить эту библиотеку в обход системного менеджера пакетов, например, воспользовавшись pip .

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

Эта утилита обычно устанавливается в виде системной службы, для её настройки можно прибегнуть к редактированию файла /etc/ser2net.conf . Я убрал из этого файла всё, что там было, и добавил туда описания двух нужных мне последовательных портов, указав, кроме прочего, их желаемую скорость в бодах:

После редактирования этого файла сервис надо перезапустить (вероятно, тут подойдёт команда systemctl restart ser2net ; а если она не сработает в первый раз — её стоит попробовать выполнить ещё раз, так как иногда она пытается запустить новую копию сервиса ещё до того, как предыдущая копия полностью завершила работу).

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

Но, в любом случае, после того, как сервер заработает, указанные порты (7777 и 7778 в моём конфигурационном файле) будут работать как соответствующие последовательные порты.

Хочу сделать тут несколько замечаний. Если вы пытаетесь проделать это с 3D-принтером, и если у вас запущено нечто вроде Octoprint, то вам понадобится или закрыть программу, или найти другой способ «отвязать» её от принтерного порта до выполнения вышеописанных настроек. Это применимо к любой программе, удерживающей последовательный порт, который нам нужно открыть. В случае с некоторыми стандартными портами нужно удостовериться в том, что механизм входа в систему не удерживает порт открытым, ожидая пользователя. То, как именно это всё заработает, зависит от конкретной системы. То же самое относится и к файрволу. Если прослушивается порт 7777 и при этом используется файрвол, нужно настроить его так, чтобы он разрешал бы подключения к этому порту. При этом надо помнить о том, что для открытия портов с небольшими номерами обычно нужны root-права.

Читайте также:  Gradle path mac os

Клиент

На стороне клиента можно использовать socat , но некоторые программы поймут, что перед ними — не настоящий последовательный порт. Правда, никто не мешает попробовать такую команду:

Кое-какие программы, правда, ищут устройства лишь в папке /dev . Если это именно так — понадобится запустить socat с root-правами (воспользовавшись sudo ), а затем нужно будет настроить /dev/ttyNET0 , дав разрешения на чтение и запись (например — sudo chmod 666 /dev/ttyNET0 ).

Тестирование

Если созданный механизм выглядит работоспособным, я, всё равно, не рекомендую сразу же пробовать пользоваться им в программе, для которой он создавался. Советую сначала протестировать его, воспользовавшись чем-то вроде picocom . После запуска socat , например, на клиентской машине должна нормально отработать такая команда:

Утилита picocom может обмениваться данными по сети с использованием виртуального последовательного порта

Если вы попробуете сделать нечто подобное, то вам, понятно, нужно будет указать актуальные для вашей системы имя и скорость порта. У вас, в результате, должна появиться возможность обмениваться данными с удалённым устройством. Если это не получится — нужно разобраться с причинами неполадки до того, как виртуальный порт можно будет использовать в обычной программе. Если в основе вашего последовательного устройства не лежит передача текста, то, возможно, вам больше повезёт с cutecom. Но, к сожалению, эта программа знает о том, что виртуальный последовательный порт — это порт поддельный, и не позволит его выбрать. Правда, программа это опенсорсная, поэтому не слишком сложно будет создать её собственную версию, которая примет любое нужное имя устройства. Конечно, есть и другие варианты. Например — выбрать ненастоящий последовательный порт позволит gtkterm .

Если в ходе тестирования возникнет ошибка протокола, может оказаться так, что последовательный порт перемещён (например — был /dev/ttyUSB0 , а потом стал /dev/ttyUSB1 ), или окажется, что неправильно настроена скорость порта. Сообщения об ошибках не особенно информативны, но при поиске проблем стоит помнить об опции -d программы ser2net .

Документация программы ttynvt устроена просто, но отличается точностью

Когда же дело дойдёт до использования виртуального последовательного порта в обычной программе, всё может заработать как надо. Но может появиться ошибка, или, в некоторых случаях, программа может не позволить выбрать соответствующий файл, так как он не ассоциирован с настоящим последовательным портом. Иногда бывает так, что в чём-то просто не везёт. Правда, тут может пригодиться более интеллектуальный клиент, который знает толк в последовательных портах. Например — ttynvt. Программу, возможно, придётся собрать из исходников, но сделать это очень просто. Она зависит от libfuse , но больше ей ничего особенного не нужно.

После того, как программа будет готова к работе — попробуйте нечто вроде такой команды:

Будет создано устройство /dev/ttyNET0 (отсюда — и потребность в root-правах). В моей системе у нового устройства были права на чтение и запись root-уровня, оно входило в группу dialout . Если вы воспользуетесь этой программой, то вам, возможно, нужно будет проверить и настроить под себя её разрешения.

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

Почему всё так нескладно?

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

Но, к сожалению, сейчас ситуация такова, что Lightburn — программа слишком умная, которая не ведётся на мои хитрости и не хочет показывать мне виртуальные последовательные порты. И нет известного мне способа заставить её использовать имя файла, выбранное мной. Поэтому я даже не могу проверить то, как она работает с виртуальным портом. Правда, мне удалось протестировать подобные порты с некоторыми другими G-Code-программами. И всё это работало хорошо. Я сообщил о моей проблеме разработчикам Lightburn. Возможно, в тот момент, когда вы это читаете, проблема уже решена.

Парадигма «всё — это файл» чрезвычайно мощна. Но, к сожалению, с каждым годом она всё меньше соответствует реальному положению дел. Это создаёт всё больше препятствий тем, кто хочет сделать в Linux что-то интересное и не совсем обычное. Но, как это обычно бывает в Linux, желаемого, всё равно, как-то можно достичь. Я не сомневаюсь в том, что смог бы отследить вызовы, которые выполняет Lightburn для открытия порта, а после этого смог бы найти способ обмануть программу и подсунуть ей последовательный клиент. Но я надеюсь, что делать этого мне не придётся.

Возникала ли у вас необходимость в работе с виртуальными последовательными портами в Linux?

Источник

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