Создайте соединение виртуального последовательного порта через TCP
Я разрабатываю приложение, которое должно иметь возможность записи в виртуальный последовательный порт и получать данные через тот же порт от удаленных клиентов по сети.
Приложение работает на сервере Linux. Я новичок в использовании последовательных портов, и у меня есть несколько вопросов по этой теме.
клиенты
Клиент может установить TCP-соединение с сервером. Когда мы настраиваем клиента, мы должны предоставить IP-адрес сервера, TCP-порт (обычно 8080) и виртуальный COM-порт.
Затем клиент автоматически попытается подключиться к серверу.
сервер
На сервере есть виртуальный com-порт, который мы установили в конфигурации клиента (например, COM1). Когда приложение на сервере записывает данные в этот порт, данные должны быть отправлены всем клиентам, подключенным через tcp. Ответ от клиентов отправляется через TCP обратно на сервер, который может прочитать его через виртуальный последовательный порт.
Вопрос
В Windows я использовал разъем виртуального последовательного порта http://www.eterlogic.com/Products.VSPE.html который выполнял большую часть работы. Однако я хочу решить эту проблему на машинах Linux.
У меня вопрос: как я могу создать TCP-сервер, к которому подключен виртуальный последовательный порт и который может отправлять / получать данные через этот порт по TCP для прослушивающих клиентов?
2 ответа
Попробуй сокат. Возможный сценарий:
socat pty,link=/dev/virtualcom0,raw tcp:192.168.254.254:8080&
socat создает TCP-соединение с 192.168.254.254:8080, так что все, что будет записано в /dev/virtualcom0, будет перенаправлено на 192.168.254.254:8080 и наоборот.
Другой подход заключается в использовании RFC2217 через ser2net на стороне сервера Linux и драйвера RFC2217 на стороне Windows (например, http://www.hw-group.com/products/hw_vsp/index_en.html версия с одним портом). Вы также можете попробовать заставить http://pyserial.sourceforge.net/ работать с ser2net.
У вас есть socat, ser2net и другие программы, но мой опыт очень плох... не работает должным образом. Я сделал эту небольшую программу на Python, может быть полезно. Обновите порт, скорость передачи... затем используйте любой клиент tcp. Удалите первую строку, если не хотите использовать ее как автоматически исполняемый скрипт
#!/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()
Программное обеспечение поможет установить соединение с сервером и клиентом через TCP http://www.serial-com-port.com/
Я использую его для создания виртуальной последовательной связи по сети, но у меня есть настоящий порт RS232 на компьютере. Поэтому я просто передаю данные по сети. Если вам нужно создать виртуальный COM на сервере, используйте драйвер виртуального последовательного порта.