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

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

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

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

Ответ 1

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

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

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

Wikipedia имеет больше информации о ptys: http://en.wikipedia.org/wiki/Pseudo_terminal

Ответ 2

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

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

Откройте терминал (позвоните ему Terminal 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]

Откройте другой терминал и запишите (Terminal 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 

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

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

echo "Test" > /dev/pts/3

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

Ответ 3

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

Например:

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

Ответ 4

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

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

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

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

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

изменить:

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

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

изменить:

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

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

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

Ответ 5

Вы можете посмотреть 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 для согласования настроек последовательной линии.

Ответ 6

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

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

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

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

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

Ответ 7

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

Ответ 8

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

Внедрить RFC 2217

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

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

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

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

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

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

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

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

-Adam