- Ubuntu Documentation
- Introduction
- Installing prerequisites
- Creating ports
- Checking file names
- Using socat
- Using lsof
- External Links
- Виртуальный последовательный порт для Linux
- Virtual serial ports emulator linux
- Настройте виртуальные последовательные порты (эмулятор нуль-модема Linux) с помощью tty0tty
- Установка
- Сохраняется через загрузку
- Предупреждение
- Виртуальный последовательный порт для Linux
- 8 ответов
- реализовать RFC 2217
- измените драйвер последовательного порта linux
- используйте два USB последовательных кабеля в петле
Ubuntu Documentation
Introduction
Virtual serial ports are commonly used in development of programs using serial connection as well as debugging existing applications — to check what kind of data is transmitted over a serial connection.
The idea of virtual serial port is to create two virtual serial ports linked with a null modem cable, attaching one end to tested application and the other end to (usually) serial terminal (e.g. Cutecom).
Installing prerequisites
To create a pair of ports you will need a utility called «socat». It is located in «universe» repository, so you should be able to find it in Synaptic. Alternatively install using
Creating ports
After installing socat you have to execute following command:
That should create and link the virtual port pair for as long as socat is running.
If you are like me and want a little more feedback on what is happening instead of a command line that is hanging, use verbose mode instead:
You can put the -d argument up to four times, increasing the information fed back to you each time.
Checking file names
Using socat
The easiest way to tell which file names are assigned to these virtual ports is to tell socat to print information about opened pseudo terminals during initialization using following options (verbose mode):
Your applicantion should connect to these files.
Using lsof
Another way is to list socat’s open files:
You should notice file /dev/ptmx, that is pseudo terminal multiplexer and directly below each entry should be listed /dev/pts/X file, which are the ends of created pair.
External Links
VirtualSerialPort (последним исправлял пользователь janisozaur 2010-10-28 11:21:26)
The material on this wiki is available under a free license, see Copyright / License for details
You can contribute to this wiki, see Wiki Guide for details
Источник
Виртуальный последовательный порт для Linux
Мне нужно протестировать приложение последовательного порта в Linux, однако моя тестовая машина имеет только один последовательный порт.
Есть ли способ добавить виртуальный последовательный порт в Linux и протестировать мое приложение, эмулируя устройство через оболочку или скрипт?
Примечание: я не могу переназначить порт, он жестко запрограммирован на ttys2, и мне нужно протестировать приложение, как оно написано.
Для этого вы можете использовать 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):
Откройте терминал (назовем его Terminal 0) и запустите его:
Приведенный выше код возвращает:
Откройте другой терминал и напишите (Терминал 1):
имя порта этой команды может быть изменено в зависимости от компьютера. это зависит от предыдущего вывода.
вы должны использовать номер, доступный в выделенной области.
Откройте другой терминал и напишите (Терминал 2):
Теперь вернитесь в Терминал 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 из кода пользовательского режима.
Если кому-то интересна моя версия кода, напишите мне, и я отправлю его вам.
Источник
Virtual serial ports emulator linux
Virtual Serial Port driver for Linux
This kernel module allows userspace programs to create virtual serial ports under /dev/ttyV#.
This is somewhat similar to the regular pseudo-tty interface, but vtty also emulates characteristics such as baud rate & modem line state. This allows users to create a fully-functional serial port driver completely in userspace.
- forward a serial port over the network. There are several Linux implementations of a RFC2217 server. VTTY allows you to write a RFC2217 client exposing a native-looking serial port to other software.
- quickly prototype a driver for an USB-to-serial converter using VTTY & libusb
- split one physical serial port in two, allowing two apps to access it without conflict (for example gdb & minicom, or esptool & minicom)
The module creates a /dev/vtmx «master» device, which is used to create the virtual serial ports in a manner similar to the pseudo-tty master device /dev/ptmx. Opening the /dev/vtmx device causes a /dev/ttyV# device to be allocated. The index of the virtual port can be obtained by issuing a VTMX_GET_VTTY_NUM (equal to TIOCGPTN) ioctl on the vtmx file descriptor.
Any writes on the vtmx file descriptor will appear as incoming data on the virtual TTY, subject to the regular in-kernel processing (line disciplines, echoing, and so on). Reading from vtmx will return data in a «packetized» format, inspired by the obscure pseudo-tty «packet» mode. On each successful read() call, the first byte returned will indicate the type of packet returned.
Currently supported packet formats:
- TAG_UART_RX (0), followed by the «serial port» data coming in from the virtual TTY (processed by the kernel as usual)
- TAG_SET_TERMIOS (1), followed by a ‘struct termios2’ structure representing the serial port configuration requested on the virtual TTY (TCSETS/TCSETS2)
- TAG_SET_MODEM (2), followed by a 32-bit integer representing the modem line state requested on the virtual TTY (TIOCMSET/TIOCMBIC/TIOCMBIS)
- TAG_BREAK_CTL (3), followed by a 32-bit integer representing the requested «break» state. A «break» state is a special condition on the serial port, during which the «low» signal state is sent for a period longer than the byte duration. A positive number indicates the duration of the requested break state (in milliseconds). Negative numbers indicate a request to set the break state indefinitely. Zero terminates the break state.
The master side can also use the VTMX_SET_MODEM_LINES ioctl (equal to TIOCMSET) to manipulate the modem line state of the virtual serial port. Only the «input» lines (such as CTS) can be changed this way. If the master process needs to change the «output» lines (such as RTS), it needs to open the ttyV# device and issue the regular tty ioctls there.
The test/ directory contains testing/example apps demonstrating the use of the interface.
Comparison with PTY
Most of the functionality of VTTY is inspired by and follows the PTY interfaces. Most notable differences include:
The «master» side of the pseudo-tty is a tty. I’m not really sure why and what would be the reason to (for example) configure the line discipline on the master side. After all, it’s only used to read & write some bytes. In VTTY, the master side is a simple character device.
PTY does not inform the master of the «termios» settings on the slave
PTY does not support setting modem lines on the slave
VTTY reads on the master side return the data prefixed with a «tag» byte. This is similar to the (rarely used) «packet» mode of the pseudo-ttys.
PTY supports locking/unlocking access to the pseudo-tty using TIOCSPTLCK. This is not supported in VTTY
Any kinds of flow control were not tested. I assume that XON/XOFF will not work.
The module is mostly stable, but I wouldn’t recommend running it on any «important» systems. I wouldn’t be surprised if there were some subtle locking bugs remaining (the linux tty layer is. complex).
Also see FIXME/TODO markers in the source code.
Some tty ioctls are not supported (notably TIOCMIWAIT & TIOCGICOUNT).
tty0tty emulates pairs of serial ports, connected in a null-modem fashion. The modem status lines are properly emulated, but the «termios» settings are not.
Источник
Настройте виртуальные последовательные порты (эмулятор нуль-модема Linux) с помощью tty0tty
Я хочу настроить эмулятор виртуального последовательного порта в Linux. Я хочу, чтобы порты были постоянными, чтобы я мог использовать их при каждом перезапуске. Я пытался использовать socat для этой цели, как в этом случае,
Но я часто сталкиваюсь с проблемами занятости портов во время использования этих VSP (виртуальных последовательных портов) в моих тестовых программах. Кроме того, мне трудно создавать постоянные / постоянные VSP. Теперь я хочу попробовать tty0tty для моих целей. Но есть редко какая-либо документация и как использовать руководство для этого. Кто-нибудь может просветить меня об этом? Пожалуйста, прокомментируйте, если есть решение для socat.
Установка
Загрузите пакет tty0tty из одного из следующих источников:
- tar xf tty0tty-1.2.tgz
- cd tty0tty-1.2/module
- make
- sudo cp tty0tty.ko /lib/modules/$(uname -r)/kernel/drivers/misc/
- sudo depmod
- sudo modprobe tty0tty
- Вы должны увидеть новые последовательные порты в / dev / ( ls /dev/tnt* )
- sudo chmod 666 /dev/tnt*
Теперь вы можете получить доступ к последовательным портам как /dev/tnt0 (1,2,3,4 и т. Д.). Обратите внимание, что последовательные порты связаны между собой. Например, / dev / tnt0 и / dev / tnt1 подключаются, как если бы использовался прямой кабель.
Сохраняется через загрузку
отредактируйте файл / etc / modules (Debian) или /etc/modules.conf
и добавьте следующую строку:
Предупреждение
Обратите внимание, что этот метод не заставит модуль сохраняться при обновлении ядра, поэтому, если вы когда-нибудь обновите свое ядро, убедитесь, что вы собрали tty0tty снова, повторите процесс.
Источник
Виртуальный последовательный порт для Linux
Мне нужно протестировать приложение последовательного порта на Linux, однако моя тестовая машина имеет только один последовательный порт.
есть ли способ, чтобы добавить виртуальный последовательный порт в Linux и тестировать приложение, эмулируя устройство через или скрипт?
примечание: Я не могу переназначить порт, он жестко закодирован на ttys2, и мне нужно проверить приложение, как оно написано.
8 ответов
для этого можно использовать pty («псевдо-телетайп», где последовательный порт является «реальным телетайпом»). С одного конца откройте /dev/ptyp5 , а затем прикрепите программы /dev/ttyp5 ; ttyp5 будет действовать как последовательный порт, но будет отправлять/получать все, что он делает через /dev/ptyp5.
Если вам действительно нужно поговорить с файлом под названием /dev/ttys2 , тогда просто переместите свой старый /dev/ttys2 из Пути и сделать символическую ссылку из ptyp5 to ttys2 .
конечно, вы можете использовать ряд других чем ptyp5 . Возможно, выберите один с большим числом, чтобы избежать дублирования, так как все ваши терминалы входа также будут использовать ptys.
дополняя ответ @slonik.
вы можете протестировать socat для создания виртуального последовательного порта, выполнив следующую процедуру (протестировано на Ubuntu 12.04):
откройте терминал (назовем его терминалом 0) и выполните его:
код выше возвращает:
откройте другой терминал и напишите (Терминал 1):
имя порта этой команды можно изменить согласно к компьютеру. это зависит от предыдущего вывода.
вы должны использовать номер, доступный на выделенной области.
откройте другой терминал и напишите (Терминал 2):
теперь вернемся к терминалу 1, и вы увидите строку «Test».
используйте socat для этого:
существует также tty0tty http://sourceforge.net/projects/tty0tty/ который является реальным эмулятором нулевого модема для linux.
Это простой модуль ядра — небольшой исходный файл. Я не знаю, почему он только опустил большие пальцы на sourceforge, но он хорошо работает для меня. Самое лучшее в этом — это эмуляция аппаратных контактов (RTC/CTS DSR / DTR). Он даже реализует команды TIOCMGET / TIOCMSET и TIOCMIWAIT iotcl!
на недавнем ядре вы можете получить ошибка компиляции. Это легко исправить. Просто вставьте несколько строк в верхней части модуля / tty0tty.C Источник (после включения):
когда модуль загружен, он создает 4 пары последовательных портов. Приборы /dev /tnt0 к/dev / tnt7 где tnt0 соединено к tnt1, tnt2 соединено к tnt3, etc. Вам может понадобиться исправить права доступа к файлам, чтобы иметь возможность использовать устройства.
Я думаю, что я немного поспешила с моим энтузиазмом. А водитель выглядит многообещающе, он кажется нестабильным. Я не знаю точно, но я думаю, что он разбил машину в офисе, над которым я работал из дома. Я не могу проверить, пока не вернусь в офис в понедельник.
второе, что TIOCMIWAIT не работает. Код, похоже, скопирован из некоторого примера кода» tiny tty». Обработка TIOCMIWAIT кажется на месте, но она никогда не просыпается, потому что соответствующий вызов wake_up_interruptible() недостающий.
вчера и сегодня я переписывал драйвер. Было много проблем, но теперь это хорошо работает для меня. По-прежнему отсутствует код для аппаратного управления потоком, управляемого драйвером, но мне это не нужно, потому что я сам буду управлять контактами TIOCMGET/TIOCMSET / TIOCMIWAIT из кода пользовательского режима.
Если кто-то заинтересован в моей версии кода, отправьте мне сообщение, и я отправлю его вам.
вы можете посмотреть Тиббо VSPDL для создания виртуального последовательного порта linux с помощью драйвера ядра — он кажется довольно новым и доступен для загрузки прямо сейчас (бета-версия). Не уверен в лицензии на данный момент, или они хотят, чтобы сделать его доступным коммерчески только в будущем.
есть и другие коммерческие альтернативы, такие как http://www.ttyredirector.com/.
В Open Source,Remserial (GPL) также может делать то, что вы хотите, используя UNIX PTY. Он передает последовательные данные в «сырой форме» в сетевой сокет; STTY-подобная настройка параметров терминала должна быть выполнена при создании порта, изменение их позже, как описано в RFC 2217, похоже, не поддерживается. Вы должны иметь возможность запускать два экземпляра remserial для создания виртуального nullmodem, такого как 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 .
код довольно понятен. Во-первых, вы создаете главный процесс, запустив его ./ главный мастер и он напечатает к 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-устройства с последовательным портом, соедините их вместе (нулевой модем) и фактически имейте два реальных последовательных порта — один для тестируемой программы, один для вашего симулятора.
Источник