# 虚拟串口测试

# 需求描述

工作上遇到个需求,需要接收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调试工具进行手动模拟

tcp-server

也可以直接用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

监听虚拟串口

Last Updated: 11/18/2024, 4:01:47 PM