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

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

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

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

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

8 ответы

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

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

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

В Linux вы можете использовать системные вызовы openpty / forkpty. Видеть справочная страница — Мэтью Смит

как создать пару виртуальных последовательных портов с помощью инструмента командной строки? — Linjunhalida

обратите внимание, что многие параметры последовательного порта, например скорость передачи, четность, управление потоком hw, размер символа (?), не реализованы в pty, поэтому невозможно протестировать ваше приложение на наличие ошибок последовательной передачи. — Дима Тиснек

Это полезно, но описывает псевдотерминалы BSD «старого стиля». Псевдотерминалы UNIX 98 «нового стиля» работают несколько иначе — см. pts справочная страница для подробностей. — Крэйг МакКуин

@LaszloPapp Прошу прощения, я все время лгал — Мэтью Смит

Вы можете протестировать 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):

имя порта этой команды может быть изменено в зависимости от компьютера. это зависит от предыдущего вывода.

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):

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

ответ дан 10 мар ’15, в 08:03

Читайте также:  Графические оболочки alt linux

Это сработало для меня лучше, чем ответ slonik, потому что он автоматически назначается файлам виртуального COM-порта и не эхо. — гбмхантер

Если вы хотите, чтобы имя файла воспроизводилось, используйте link=/path/to/link после каждого объявления устройства (после echo = 0). Таким образом, его можно использовать в автоматизированных тестах. (как это делает слоник в своем ответе) — Patrick B.

Это сработало именно так, как упоминалось. Мне помогло спасибо. — nim118

Чтобы создать pty, который подключается к реальному последовательному порту: socat -d -d pty,raw,echo=0 /dev/ttyUSB5,raw,echo=0 . — Пэнхэ Гэн

могу ли я создать последовательный порт с такими именами, как /dev/ttyS0 вместо /dev/pts/1 ? — мрид

Для этого используйте socat:

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

У меня это сработало, протестировано с minicom! Кажется, что вход в один терминал отражается на обоих (так что он снова появится и на входном терминале). — гбмхантер

У меня нет такого же поведения эха . minicom имеет функцию «локального эха» . но когда она отключена, она работает точно так же, как настоящий последовательный порт. Спасибо за чаевые. — cptHammer

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

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

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

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

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

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

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

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

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

Читайте также:  Linux process file system

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

Источник

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

sudo apt-get install socat

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.

VirtualSerialPort (последним исправлял пользователь pc-212-51-221-162 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

Источник

Create a virtual serial port connection over TCP

I am developing an application that should be able to write to a virtual serial port and receive data through the same port from remote clients over network. The application runs on a linux server. I am new in using serial ports and I have some questions on this topic. Clients The client can establish a TCP connection to a server. When we setup a client, we have to provide the IP address of the server, a tcp port (usually 8080) and a virtual com port. The client then will automatically try to connect to the server. Server The server has a virtual com port, the same we set in the client config (e.g. COM1). When an application on the server writes data to this port, the data should be send to all clients connected via tcp. The response from the clients is send over TCP back to the server which can read it over the virtual serial port. Question On windows I used a virtual serial port connector http://www.eterlogic.com/Products.VSPE.html which did most of the work. However I want to solve this problem on linux machines. My question is, how can I create a TCP server that has a virtual serial port attached and can send/receive data through this port over TCP to listening clients?

Читайте также:  One time password linux

3 Answers 3

socat pty,link=/dev/virtualcom0,raw tcp:192.168.254.254:8080& 

socat creates TCP connection to 192.168.254.254:8080, so that everything, that will be written to /dev/virtualcom0 will be forwarded to 192.168.254.254:8080 and vice versa.

Another approach would be to use RFC2217 via ser2net on Linux sever side and RFC2217 driver on Windows side (for example http://www.hw-group.com/products/hw_vsp/index_en.html single port version). You can also try to get http://pyserial.sourceforge.net/ to work with ser2net.

Thanks, does this create the virtual com port? I think this just links an existing one to the tcp server. However, I already did what you say here superuser.com/questions/733552/… my problem is that I cannot write to the com port.

socat would create /dev/virtualcom0 , so this is a virtual port. I’m using socat with a VScom NET-CAN 110 device and it is working like a charm. The instructions are here.

and can you say what virtualcom0 would be on windows? If I want to connect from windows client to linux that has virtualcom0 port, what should I select on windwos, COM1, COM2.

you have socat and ser2net and other programs but my experience is very bad. not working properly. I’ve done this small python program, can be useful. Update port, baudrate. then use any tcp client. Remove first line if don’t want to use is as auto executable script

#!/usr/bin/python import socket import sys import serial #open serial port ser = serial.Serial('/dev/ttyAMA0', 115200, timeout=0) #create socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) #bond to the port. Don't use localhost to accept external connections server_address = ('', 2105) print('starting up on <> port <>'.format(*server_address)) sock.bind(server_address) #listen sock.listen(1) #loop while True: #waits for a new connection print('waiting for a connection') connection, client_address = sock.accept() try: print('connection from', client_address) #continously send from serial port to tcp and viceversa connection.settimeout(0.1) while True: try: data = connection.recv(16) if data == '': break ser.write(data) except KeyboardInterrupt: connection.close() sys.exit() except Exception as e: pass received_data = ser.read(ser.inWaiting()) connection.sendall(received_data) except Exception as e: print e finally: #clean up connection connection.close() 

Источник

Оцените статью
Adblock
detector