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