【问题标题】:Create a virtual serial port connection over TCP通过 TCP 创建虚拟串行端口连接
【发布时间】:2014-05-02 17:02:18
【问题描述】:

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

应用程序在 linux 服务器上运行。我是使用串行端口的新手,对此主题有一些疑问。

客户

客户端可以与服务器建立 TCP 连接。当我们设置客户端时,我们必须提供服务器的 IP 地址、一个 tcp 端口(通常是 8080)和一个虚拟 com 端口。

然后客户端会自动尝试连接到服务器。

服务器

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

问题

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

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

【问题讨论】:

    标签: linux sockets tcp serial-port virtual-serial-port


    【解决方案1】:

    试试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 服务器端通过 ser2net 使用 RFC2217,在 Windows 端使用 RFC2217 驱动程序(例如 http://www.hw-group.com/products/hw_vsp/index_en.html 单端口版本)。您也可以尝试让http://pyserial.sourceforge.net/ 使用 ser2net。

    【讨论】:

    • 谢谢,这会创建虚拟 com 端口吗?我认为这只是将现有的链接到 tcp 服务器。但是,我已经按照您所说的进行了superuser.com/questions/733552/… 我的问题是我无法写入 com 端口。
    • socat 会创建/dev/virtualcom0,所以这是一个虚拟端口。我正在使用带有VScom NET-CAN 110 设备的socat,它的工作原理就像一个魅力。说明是here
    • 你能说一下windows上的virtualcom0是什么吗?如果我想从windows客户端连接到具有virtualcom0端口的linux,我应该在windwos、COM1、COM2...上选择什么?
    • 如何断开这个网桥?
    • @multiplayer1080 试试killall socat
    【解决方案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()
    

    【讨论】:

      【解决方案3】:

      该软件将帮助通过 TCP http://www.serial-com-port.com/ 建立服务器和客户端连接

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-07
        相关资源
        最近更新 更多