通过 TCP 创建虚拟串口连接

问题描述 投票:0回答:4

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

该应用程序运行在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
4个回答
49
投票

尝试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 一起使用。


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

1
投票

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

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


0
投票

为此,我使用 Electronic Team 的串行转以太网连接器。我使用的是 Windows,但该网站说也有 Linux 版本可用。

© www.soinside.com 2019 - 2024. All rights reserved.