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

32

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

该应用程序运行在Linux服务器上。我对使用串口不熟悉,有一些关于这个主题的问题。

客户端

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

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

服务器

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

问题

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

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

3个回答

45

试试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配合使用。


谢谢,这会创建虚拟串口吗?我认为这只是将现有的串口链接到TCP服务器。然而,我已经按照您在此处所说的做了http://superuser.com/questions/733552/how-to-send-message-to-virtual-serial-port-created-with-socat 我的问题是我无法写入串口。 - DarkLeafyGreen
socat将创建/dev/virtualcom0,因此这是一个虚拟端口。我正在使用socat与一款VScom NET-CAN 110设备,并且它的工作非常顺利。使用说明在这里 - yegorich
1
你能说一下在Windows上virtualcom0是什么吗?如果我想从Windows客户端连接到Linux,该怎么选择才能连接到虚拟串口0呢?应该选择COM1、COM2还是其他的呢? - DarkLeafyGreen
我该如何断开这个桥接? - Marlord
1
@multiplayer1080 尝试执行 killall socat - yegorich
显示剩余2条评论

4

你可能拥有socat、ser2net和其他程序,但我的经验非常糟糕...无法正常工作。我写了这个小的Python程序,可能会很有用。更新端口(port)、波特率(baudrate)...然后使用任何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()

1

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

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


注意:这不是免费软件,截至我评论时只有14天的试用期。 - Thagomizer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接