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

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

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

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

8 ответов


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

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

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

Википедия имеет больше о ptys:http://en.wikipedia.org/wiki/Pseudo_terminal


дополняя ответ @slonik.

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

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

socat -d -d pty,raw,echo=0 pty,raw,echo=0

код выше возвращает:

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]

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

cat < /dev/pts/2

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

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2**
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3**
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs 

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

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

echo "Test" > /dev/pts/3

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


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

например:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11

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

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

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

#ifndef init_MUTEX
#define init_MUTEX(x) sema_init((x),1)
#endif

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

изменить:

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

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

изменить:

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

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


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

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

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

Socat (также GPL) похож на расширенный вариант Remserial со многими другими параметрами, включая метод" PTY " для перенаправления PTY на что-то еще, что может быть другим экземпляром Socat. Для Unit tets socat, вероятно, лучше, чем remserial, потому что вы можете напрямую использовать файлы cat в PTY. Вижу PTY пример на странице. А патч существует в разделе "contrib" для обеспечения поддержки RFC2217 для согласования настроек последовательной линии.


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

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

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

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

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


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


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

реализовать RFC 2217

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

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

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

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

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

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

используйте два USB последовательных кабеля в петле

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

Адам