Мне нужно протестировать приложение последовательного порта в Linux, однако моя тестовая машина имеет только один последовательный порт.
Есть ли способ добавить виртуальный последовательный порт в Linux и протестировать мое приложение, эмулируя устройство через оболочку или скрипт?
Примечание: я не могу переназначить порт, он жестко запрограммирован на ttys2, и мне нужно протестировать приложение, как оно написано.
pts
странице руководства.Дополняя ответ @ slonik.
Вы можете протестировать socat для создания виртуального последовательного порта, выполнив следующую процедуру (проверено на Ubuntu 12.04):
Откройте терминал (назовем его Terminal 0) и запустите его:
Приведенный выше код возвращает:
Откройте другой терминал и напишите (Терминал 1):
имя порта этой команды может быть изменено в зависимости от компьютера. это зависит от предыдущего вывода.
вы должны использовать номер, доступный в выделенной области.
Откройте другой терминал и напишите (Терминал 2):
Теперь вернитесь в Терминал 1, и вы увидите строку «Тест».
источник
link=/path/to/link
после каждого объявления устройства (после echo = 0). Таким образом, его можно использовать в автоматизированных тестах. (как это делает слоник в своем ответе)socat -d -d pty,raw,echo=0 /dev/ttyUSB5,raw,echo=0
./dev/ttyS0
вместо/dev/pts/1
?Для этого используйте socat:
Например:
источник
Также существует tty0tty http://sourceforge.net/projects/tty0tty/, который является настоящим эмулятором нуль-модема для Linux.
Это простой модуль ядра - небольшой исходный файл. Я не знаю, почему он получил отрицательные отзывы на sourceforge, но мне он подходит. Самое лучшее в нем то, что он также эмулирует аппаратные контакты (RTC / CTS DSR / DTR). Он даже реализует команды TIOCMGET / TIOCMSET и TIOCMIWAIT iotcl!
В недавнем ядре вы можете получить ошибки компиляции. Это легко исправить. Просто вставьте несколько строк вверху источника module / tty0tty.c (после включений):
Когда модуль загружен, он создает 4 пары последовательных портов. Устройства: от / dev / tnt0 до / dev / tnt7, где tnt0 подключен к tnt1, tnt2 подключен к tnt3 и т. Д. Вам может потребоваться исправить права доступа к файлам, чтобы иметь возможность использовать устройства.
редактировать:
Думаю, я немного поторопился со своим энтузиазмом. Хотя драйвер выглядит многообещающе, он кажется нестабильным. Я не знаю наверняка, но думаю, что это разбило машину в офисе, над которым я работал из дома. Я не могу проверить, пока не вернусь в офис в понедельник.
Во-вторых, TIOCMIWAIT не работает. Код, кажется, скопирован из какого-то примера кода "крошечного терминала". Обработка TIOCMIWAIT кажется на месте, но она никогда не просыпается, потому что соответствующий вызов wake_up_interruptible () отсутствует.
редактировать:
Авария в офисе действительно произошла по вине водителя. Отсутствовала инициализация, и полностью непроверенный код TIOCMIWAIT вызвал сбой машины.
Вчера и сегодня потратил на переписывание драйвера. Было много проблем, но теперь у меня все хорошо. По-прежнему отсутствует код для аппаратного управления потоком данных, управляемого драйвером, но он мне не нужен, потому что я сам буду управлять контактами, используя TIOCMGET / TIOCMSET / TIOCMIWAIT из кода пользовательского режима.
Если кому-то интересна моя версия кода, напишите мне, и я отправлю его вам.
источник
Вы можете посмотреть Tibbo VSPDL для создания виртуального последовательного порта Linux с использованием драйвера ядра - он кажется довольно новым и доступен для загрузки прямо сейчас (бета-версия). Не уверен насчет лицензии на данный момент, или хотят ли они сделать ее коммерчески доступной только в будущем.
Существуют и другие коммерческие альтернативы, например http://www.ttyredirector.com/ .
В Open Source Remserial (GPL) также может делать то, что вы хотите, используя Unix PTY. Он передает последовательные данные в «сыром виде» в сетевой сокет; При создании порта необходимо выполнить настройку параметров терминала в стиле STTY, изменение их позже, как описано в RFC 2217, похоже, не поддерживается. У вас должна быть возможность запустить два экземпляра remserial для создания виртуального нульмодема, такого как 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 .
Код довольно понятен. Сначала вы создаете главный процесс, запустив ./main master, и он будет печатать на stderr, используемом устройством. После этого вы вызываете ./main slave device, где device - это устройство, напечатанное в первой команде.
И это все. Между этими двумя процессами существует двунаправленная связь.
Используя этот пример, вы можете протестировать приложение, отправив все виды данных, и посмотреть, правильно ли оно работает.
Кроме того, вы всегда можете создать символическую ссылку на устройство, поэтому вам не нужно повторно компилировать тестируемое приложение.
источник
Сможете ли вы использовать адаптер 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-устройства с последовательным портом, соедините их вместе (нуль-модем) и получите два реальных последовательных порта - один для программы, которую вы тестируете, другой для вашего симулятора.
-Адам
источник