Виртуальный последовательный порт для Linux - PullRequest
103 голосов
/ 09 сентября 2008

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

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

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

Ответы [ 8 ]

130 голосов
/ 01 ноября 2013

Дополняет ответ @ 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».

69 голосов
/ 16 сентября 2008

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

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

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

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

38 голосов
/ 11 мая 2012

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

Например:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11
16 голосов
/ 07 июля 2012

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

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

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

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

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

редактировать:

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

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

редактирование:

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

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

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

8 голосов
/ 01 декабря 2008

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

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

.

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

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

6 голосов
/ 25 февраля 2012

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

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

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

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

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

4 голосов
/ 09 сентября 2008

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

3 голосов
/ 09 сентября 2008

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

Реализация RFC 2217

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

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

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

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

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

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

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

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

-Adam

...