Как создать виртуальный com порт linux

Настраиваем виртуальный компорт в 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 или «семёркой». Успехов!

Источник

Подключаем последовательные интерфейсы по IP

Последовательные интерфейсы RS-232/422/485 до сих пор очень популярны в промышленности: по ним подключаются диагностические порты, датчики, сканеры штрих-кодов и RFID меток и т.д. Однако последовательные интерфейсы имеют свои ограничения. Иногда возникает необходимость получить доступ к такому интерфейсу по IP-сети, или, например, иметь доступ к одному устройству с RS-232 с нескольких удаленных компьютеров одновременно, или объединить несколько удаленных объектов в одну шину RS-485.

Сервер последовательных интерфейсов конвертирует последовательные физические протоколы в IP-пакеты, и позволяет программно управлять ими — подключать удаленный виртуальный COM-порт к компьютеру по сети так, будто он подключен физически, и прозрачно соединять несколько устройств в режиме P2P, без использования компьютеров.

Читайте также:  Code blocks русификация для линукс

В статье мы разберем сервер последовательных интерфейсов Advantech EKI-1524, имеющий четыре последовательный порта, каждый из которых поддерживает протоколы RS-232/422/485, и два LAN-порта.


Сервер последовательных интерфейсов EKI-1524 имеет четыре порта DB9 и два LAN-порта.

  • Виртуальный COM-порт — позволяет программно эмулировать виртуальный COM-порт удаленного устройства на системе Linux.
  • Одновременное подключение нескольких клиентов — в режиме сервера дает возможность использовать один последовательный порт для нескольких устройств одновременно.
  • Работа в режиме P2P — одновременная работа в режиме клиента и сервера позволяет объединить несколько EKI-1524 напрямую, без использования серверов и компьютеров.

Характеристики

Дополнительно представлены модели с повышенным уровнем защищенности, для работы в экстремальных условиях, и гальванической развязкой портов, для защиты от высоких напряжений: EKI-1522I, EKI-1524I, и другие.


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

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

Сервер последовательных интерфейсов позволяет по TCP/IP получить доступ к удаленным устройствам таким образом, что для прикладного ПО это будет выглядеть так, будто устройства подключены к физическому COM-порту.


Принцип работы виртуального COM-порта по сети Ethernet

Для этого на стороне клиента используется модуль ядра Linux и программа для обмена данными с сервером последовательных интерфейсов. В итоге для пользователя такое подключение выглядит как физический порт (устройство /dev/ttyADV0).

На данный момент Advantech выпускает драйвера виртуального COM-порта только для ОС Linux. Инструкция по сборке модуля ядра VCOM 2.0 на Ubuntu.
Также существуют бинарные пакеты драйвера под разные дистрибутивы: Linux Pseudo TTY

В веб-интерфейсе можно настроить параметры работы в данном режиме:

Дополнительные настройки. Можно вручную задать таймауты и т.д:

Настройки параметров последовательного интерфейса. В этом меню также можно изменить основной протокол (RS-232/422/485), для каждого порта.

Режим RFC 2217

Также доступен открытый протокол перенаправления COM-порта RFC 2217, представляющий собой расширенные команды для протокола Telnet. В этом режиме устройство принимает входящие подключения по TCP, в настройках можно указать порт для входящий соединений.

Режим P2P

Для сложных случаев, когда несколько устройств нельзя соединить напрямую, можно использовать два терминальных сервера в режиме прозрачного моста. Таким образом можно подключить удаленные устройства, используя в качестве транспорта TCP/IP.


Подключение двух удаленных устройств по последовательному протоколу через TCP/IP-транспорт

Таким образом можно программно переключать устройства между собой, соединять удаленные шины по RS-485 и делать много другое, используя все преимущества IP-сетей, включая радиомосты, виртуальные частные сети (VPN) и т.д. Передаваемые данные между двумя серверами можно дополнительно защитить от перехвата, используя шифрование на транспортном уровне.

Уведомления о событиях

Устройство позволяет настроить уведомления о событиях с помощью Email и SNMP Trap. MIB-файл для настройки SNMP-сервера доступен для каждого устройства.

События для уведомлений можно настроить вручную.

Логирование через Syslog

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

Первичная настройка

Первичную конфигурацию сервера последовательных интерфейсов можно выполнить через утилиту EKI Device Configuration Utility. При этом утилита работает через ARP-пакеты и не требует настройки соответствующего IP-адреса на сетевом интерфейсе. Это значит, что можно задать любой IP-адрес устройству, без утраты доступа.

Заключение

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

Источник

Эмуляция COM порта

Есть ubuntu 16.04 которая установлена на VirtualBox. В самой машине есть один физический com порт, он прокинут в VirtualBox в режиме «хост устройство» вот так:

Еще я включил 2 порта в режиме «отключен»:

В результате на ubuntu эти порты определяются. (Но работать я так понимаю могу только с одним)

Вопрос такой: могу ли я сделать так чтобы я мог писать в com-порт и читать из него(как здесь), не подключая никакое устройство (мне просто нужно эхо) и не прибегая ни к каким костылям вроде вставки скрепки в порт что бы замкнуть TX-RX.

Читайте также:  Pkg config install linux

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

Или socat для этой цели не подходит, и мне нужно что-то другое?

1 ответ 1

Последовательный порт с точки зрения *nix-систем — это обычное терминальное устройство. Так что самое простое — создать псевдотерминал и подключиться к нему:

  • PIPE — создаёт неименованную трубу между входом и выходом, по сути работает как простой эхо-ответчик
  • PTY — создаёт псевдотерминальное устройство, к которому можно подключиться
  • link=/tmp/my_pty — создаёт ссылку на устройство, к которой можно подключаться, как к устройству, именно его можно указывать в open() при открытии порта.
  • raw,echo=0 — задаёт режим работы псевдотерминала, дабы исключить изменение данных ответа.

Из отличий от настоящего порта, самое явное — отсутствие задержки при отправке/получении данных, независимо от установленного baudrate ‘а данные будут передаваться почти мгновенно и целым пакетом.

  • tty0tty — эмулирует полноценную пару соединённых друг с другом портов, в качестве эхо можно использовать тот же socat на одном из них.
  • Перенаправить COM-порт в коробке на unix или tcp сокет. После чего можно использовать на этом сокете любой эхо-клиент/сервер на хосте или даже удалённой системе. В качестве клиента/сервера может выступать тот же socat .

Источник

Виртуальный последовательный порт для Linux

Мне нужно протестировать приложение последовательного порта в Linux, однако у моего тестового компьютера только один последовательный порт.

Есть ли способ добавить виртуальный последовательный порт в Linux и протестировать мое приложение, эмулируя устройство через оболочку или script?

Примечание. Я не могу переназначить порт, он жестко закодирован на ttys2, и мне нужно протестировать приложение, как оно написано.

Вы можете использовать pty ( “псевдотелевизор”, где для этого используется последовательный порт “настоящий телетайп” ). С одного конца откройте /dev/ptyp5 , а затем добавьте свою программу в /dev/ttyp5 ; ttyp5 будет действовать как последовательный порт, но будет отправлять/получать все, что он делает через /dev/ptyp 5.

Если вам действительно нужно поговорить с файлом под названием /dev/ttys2 , просто переместите старый /dev/ttys2 в сторону и сделайте символическую ссылку от ptyp5 до ttys2 .

Конечно, вы можете использовать другое число, кроме ptyp5 . Возможно, выберите один с большим числом, чтобы избежать дублирования, так как все ваши логин-терминалы также будут использовать ptys.

В дополнение к ответу @slonik.

Вы можете протестировать socat для создания виртуального последовательного порта, выполнив следующую процедуру (протестированную на Ubuntu 12.04):

Откройте терминал (позвоните ему Terminal 0) и выполните его:

Возвращенный код:

Откройте другой терминал и запишите (Terminal 1):

имя этого командного порта можно изменить в соответствии с ПК. это зависит от предыдущего выхода.

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

Откройте другой терминал и запишите (Terminal 2): ​​

Теперь вернемся к терминалу 1, и вы увидите строку “Test”.

Используйте для этого socat:

Существует также tty0tty http://sourceforge.net/projects/tty0tty/, который является настоящим эмулятором нулевого модема для Linux.

Это простой модуль ядра – небольшой исходный файл. Я не знаю, почему это только положило большие пальцы вниз на sourceforge, но это работает хорошо для меня. Самое лучшее в этом – это также эмулировать аппаратные контакты (RTC/CTS DSR/DTR). Он даже реализует команды TIOCMGET/TIOCMSET и TIOCMIWAIT iotcl!

В последнем ядре вы можете получить ошибки компиляции. Это легко исправить. Просто вставьте несколько строк вверху модуля /tty 0tty.c(после включения):

Когда модуль загружен, он создает 4 пары последовательных портов. Устройства:/dev/tnt0 to/dev/tnt7, где tnt0 подключен к tnt1, tnt2 подключен к tnt3 и т.д.
Возможно, вам придется исправить права доступа к файлам, чтобы использовать эти устройства.

Наверное, я был немного быстрым с моим энтузиазмом. Хотя водитель выглядит многообещающим, он кажется неустойчивым. Я не знаю точно, но я думаю, что он разбил машину в офисе, в котором я работал, из дома. Я не могу проверить, пока не вернусь в офис в понедельник.

Во-вторых, TIOCMIWAIT не работает. Код, как представляется, скопирован из некоторого “маленького tty” примера кода. Обработка TIOCMIWAIT кажется на месте, но она никогда не просыпается, потому что отсутствует соответствующий вызов wake_up_interruptible().

Читайте также:  Android as webcam mac os

Авария в офисе действительно была ошибкой водителя. Произошла инициализация, и полностью непроверенный код TIOCMIWAIT вызвал сбой машины.

Я провел вчера и сегодня переписывал водителя. Было много проблем, но теперь это хорошо работает для меня. Отсутствует код для управления аппаратным потоком, управляемый драйвером, но мне он не нужен, потому что я сам буду управлять булавками, используя TIOCMGET/TIOCMSET/TIOCMIWAIT из кода режима пользователя.

Если кто-то интересуется моей версией кода, отправьте мне сообщение, и я пришлю его вам.

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

Существуют и другие коммерческие альтернативы, такие как http://www.ttyredirector.com/.

В Open Source Remserial (GPL) также может делать то, что вы хотите, используя Unix PTY. Он передает последовательные данные в “сырой форме” в сетевой сокет; STTY-подобная настройка параметров терминала должна выполняться при создании порта, а изменение их позже, как описано в RFC 2217, похоже, не поддерживается. Вы должны иметь возможность запускать два экземпляра remserial для создания виртуального nullmodem, такого как com0com, за исключением того, что вам нужно заранее установить скорость порта и т.д.

Socat (также GPL) похож на расширенный вариант Remserial со многими другими опциями, включая метод PTY для перенаправления PTY к чему-то еще, что может быть другим примером Socat. Для юнитов, socat, вероятно, лучше, чем remserial, потому что вы можете напрямую вносить файлы в файл PTY. См. Пример PTY на странице руководства. A патч существует в разделе “contrib”, чтобы обеспечить поддержку RFC2217 для согласования настроек последовательной линии.

Используя ссылки, опубликованные в предыдущих ответах, я закодировал небольшой пример на С++, используя виртуальный последовательный порт. Я переместил код в GitHub: https://github.com/cymait/virtual-serial-port-example.

Код довольно понятен. Во-первых, вы создаете мастер-процесс, запустив мастер. /main, и он будет печатать на stderr, который использует устройство. После этого вы вызываете ведомое устройство. /main, где устройство является устройством, напечатанным в первой команде.

И что это. У вас есть двунаправленная связь между двумя процессами.

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

Кроме того, вы всегда можете ссылаться на устройство, поэтому вам не нужно повторно компилировать тестируемое приложение.

Можно ли использовать USB- > RS232-адаптер? У меня есть несколько, и они просто используют драйвер FTDI. Затем вы должны иметь возможность переименовывать /dev/ttyUSB 0 (или что-то созданное) как/dev/ttyS2.

Я могу представить три варианта:

Внедрить RFC 2217

RFC 2217 охватывает COM-порт к стандарту TCP/IP, который позволяет клиенту в одной системе эмулировать последовательный порт для локальных программ, при этом прозрачная отправка и прием данных и сигналов управления на сервер в другой системе, которая фактически имеет последовательный порт. Здесь обзор высокого уровня.

Что бы вы сделали, это найти или реализовать клиентский COM-порт, который будет реализовывать клиентскую часть системы на вашем ПК – представляя собой настоящий последовательный порт, но на самом деле перенаправляет все на сервер. Вы можете получить этот драйвер бесплатно от Digi, Lantronix и т.д. В поддержку их реальных автономных серверов последовательных портов.

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

Это, вероятно, нетривиально, но RFC там, и вы можете найти проект с открытым исходным кодом, который реализует одну или обе стороны соединения.

Измените драйвер последовательного порта linux

В качестве альтернативы источник драйвера последовательного порта для Linux легко доступен. Возьмите это, обрезайте элементы управления аппаратным обеспечением и попросите один драйвер запустить два порта /dev/ttySx, как простой loopback. Затем подключите свою реальную программу к ttyS2 и вашему симулятору к другому ttySx.

Используйте два USB-кабеля с последовательным интерфейсом

Но самое легкое занятие прямо сейчас? Потратьте $40 на два USB-устройства с последовательным портом, соедините их вместе (нуль-модем) и фактически получите два реальных последовательных порта – один для тестируемой программы, один для вашего симулятора.

Источник

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