# 虚拟串口测试
# 需求描述
工作上遇到个需求,需要接收tcp server端口的数据,解析后发送至固定的串口,然后将代码集成到硬件中。
# 处理环境
- 操作系统:windows
- 编程语言:python3
- 使用工具:SocketTool、sscom5.13.1、vspd-v6.9版本
# 解决思路
# 首先编写基本的需求代码
import socket
import serial
from scipy.signal import savgol_filter
# 服务器的IP地址和端口号
serverIP = "127.0.0.1"
serverPort = 2101
# 串口配置
serialPort = 'COM3' # 串口设备的名称 (windows 示例)
baudRate = 115200 # 波特率,需要与串口设备的配置一致
def main():
# 创建一个 TCP 客户端套接字
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 打开串口
ser = serial.Serial(serialPort, baudRate)
try:
# 连接到tcp server
clientSocket.connect((serverIP, serverPort))
while True:
# 从服务器接收数据,一直等待从服务器发送的数据
data = clientSocket.recv(1024) # 1024 是接收缓冲区的大小,可以根据实际情况调整
line = data.decode('utf-8') # 转为utf8编码
# 具体处理流程省略
dataToSend = handleOriginData(line)
dataToSend = dataToSend.encode('utf-8')
# 发送数据到串口
ser.write(dataToSend)
# print(dataBuffer,curData)
if not data:
break
except Exception as e:
print("连接或接收数据时出错: " + str(e))
finally:
# 关闭客户端套接字
clientSocket.close()
# 关闭串口
ser.close()
# 运行主函数
main()
# 模拟TCP Server
可以用TCP调试工具进行手动模拟
也可以直接用GPT 写一个小脚本
import socket
import time
import math
import random
def generate_data():
current_time = time.strftime("%Y%m%d%H%M%S", time.gmtime())
amplitude = 10.0 # 振幅
frequency = 2 * math.pi / 1800 # 每秒2π/1800,即30分钟一个周期
noise = random.uniform(-0.5, 0.5) # 添加一定的噪声
value = amplitude * math.sin(frequency * time.time()) + noise + 100
data = f"{current_time},{value:.3f}"
return data
def start_server(host, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
server_socket.bind((host, port))
server_socket.listen()
print(f"Server listening on {host}:{port}")
while True:
conn, addr = server_socket.accept()
with conn:
print(f"Connected by {addr}")
while True:
data = generate_data()
conn.sendall(data.encode())
time.sleep(1)
if __name__ == "__main__":
host = "127.0.0.1" # 你可以修改为你想要的主机地址
port = 2101 # 你可以修改为你想要的端口号
start_server(host, port)
# 模拟虚拟串口
首先需要在windows设备上模拟虚拟串口对,如COM1、COM3,(linux系统中串口名称为文件路径)
然后需要监听串口对中的一个串口COM1,代码中将数据发送至COM3
← 在线编程文档