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


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

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

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

8 94

8 ответов:

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

Если вам действительно нужно поговорить с файлом под названием /dev/ttys2, тогда просто переместите свой старый /dev/ttys2 С дороги и сделать символическую ссылку из ptyp5 до 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 и т. д. Вам может понадобиться исправить права доступа к файлам, чтобы иметь возможность использовать устройства.

edit:

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

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

edit:

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

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

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

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

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

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

Socat (также GPL) похоже на расширенный вариант Remserial со многими другими вариантами, включая метод "PTY" для перенаправления PTY на что-то другое, что может быть другим экземпляром Socat. Для Unit tets socat, вероятно, лучше, чем remserial, потому что вы можете напрямую загружать файлы cat в 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 - устройства, соедините их вместе (нуль-модем) и фактически имейте два реальных последовательных порта-один для программы, которую вы тестируете, один для вашего симулятора.

Адам