繁体   English   中英

通过 TCP 创建虚拟串口连接

[英]Create a virtual serial port connection over TCP

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

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

客户

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

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

服务器

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

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

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

试试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,反之亦然。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM