通过TCP创建虚拟串行端口连接

Upv*_*ote 13 sockets linux tcp serial-port virtual-serial-port

我正在开发一个应该能够写入虚拟串行端口并通过网络从远程客户端通过同一端口接收数据的应用程序.

该应用程序在Linux服务器上运行.我是使用串口的新手,我对这个主题有一些疑问.

客户端

客户端可以建立到服务器的TCP连接.当我们设置客户端时,我们必须提供服务器的IP地址,tcp端口(通常为8080)和虚拟COM端口.

然后,客户端将自动尝试连接到服务器.

服务器

服务器有一个虚拟的COM端口,我们在客户端配置中设置相同(例如COM1).当服务器上的应用程序将数据写入此端口时,应将数据发送到通过tcp连接的所有客户端.来自客户端的响应通过TCP发送回服务器,服务器可以通过虚拟串行端口读取它.

在Windows上,我使用了一个虚拟串口连接器http://www.eterlogic.com/Products.VSPE.html来完成大部分工作.但是我想在linux机器上解决这个问题.

我的问题是,如何创建一个连接了虚拟串口的TCP服务器,并通过TCP端口向侦听客户端发送/接收数据?

yeg*_*ich 24

试试socat.可能的情况:

socat  pty,link=/dev/virtualcom0,raw  tcp:192.168.254.254:8080&
Run Code Online (Sandbox Code Playgroud)

socat创建到192.168.254.254:8080的TCP连接,因此将写入/ dev/virtualcom0的所有内容都将转发到192.168.254.254:8080,反之亦然.

另一种方法是在Linux服务器端通过ser2net使用RFC2217,在Windows端使用RFC2217驱动程序(例如http://www.hw-group.com/products/hw_vsp/index_en.html单端口版本).您也可以尝试使用http://pyserial.sourceforge.net/来使用ser2net.


小智 5

你有 socat 和 ser2net 以及其他程序,但我的体验非常糟糕......无法正常工作。我已经完成了这个小Python程序,可能很有用。更新端口、波特率...然后使用任何 TCP 客户端。如果不想使用 is 作为自动可执行脚本,请删除第一行

#!/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()
Run Code Online (Sandbox Code Playgroud)