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

时间:2014-03-25 03:00:01

标签: linux sockets 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端口向侦听客户端发送/接收数据?

3 个答案:

答案 0 :(得分:23)

试试socat。可能的情况:

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

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

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

答案 1 :(得分:2)

您有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()

答案 2 :(得分:1)

该软件将有助于通过TCP https://codepen.io/matt3224/pen/EvWbGe?editors=1010

建立服务器和客户端连接

我用它来通过网络创建虚拟串行通信,但我在计算机上有真正的RS232端口。所以我只是通过网络传输数据。如果您还需要在服务器上创建虚拟COM,请使用虚拟串行端口驱动程序。