python 获取串口,监听串口数据,通过websocket发送数据进行相关操作。

以下是使用 Python 实现同时获取并操作 4 个串口,与 WebSocket 进行数据交互的示例代码框架。这个示例使用了 pyserial 库来操作串口(需要提前安装 pyserialpip install pyserial),以及 websocket-client 库来处理 WebSocket 连接(需要安装 websocket-clientpip install websocket-client)。

以下是代码示例:

import serial
import time
import threading
import websocket


# 配置4个串口的相关参数,根据实际情况修改端口名、波特率等
serial_ports = [
    {'port': 'COM1', 'baudrate': 9600},  # 示例串口1配置,替换COM1为实际端口
    {'port': 'COM2', 'baudrate': 9600},  # 示例串口2配置
    {'port': 'COM3', 'baudrate': 9600},  # 示例串口3配置
    {'port': 'COM4', 'baudrate': 9600}  # 示例串口4配置
]

ser_list = []  # 用于存放打开的串口对象


# 打开串口的函数
def open_serials():
    global ser_list
    for port_info in serial_ports:
        try:
            ser = serial.Serial(port_info['port'], port_info['baudrate'])
            ser_list.append(ser)
            print(f"成功打开串口 {port_info['port']}")
        except serial.SerialException as e:
            print(f"打开串口 {port_info['port']} 失败: {e}")


# 从串口读取数据并发送到WebSocket的函数,每个串口一个线程来处理读取
def read_serial_and_send_ws(ser, ws):
    while True:
        try:
            if ser.in_waiting:
                data = ser.read(ser.in_waiting)  # 读取串口所有可用数据
                # 这里可以根据实际需要对读取到的数据进行处理,比如解码等
                data_str = data.decode('utf-8', errors='ignore')
                print(f"从串口 {ser.port} 读取到数据: {data_str}")
                # 发送数据到WebSocket
                ws.send(data_str)
            time.sleep(0.01)  # 适当休眠,避免过于频繁读取占用过多资源
        except serial.SerialException as e:
            print(f"串口 {ser.port} 读取数据出错: {e}")
            break
        except websocket.WebSocketConnectionClosedException as e:
            print(f"WebSocket连接已关闭,无法发送数据: {e}")
            break


# WebSocket接收数据后发送到对应串口的函数
def on_message(ws, message):
    for ser in ser_list:
        # 这里需要有某种机制来判断消息该发往哪个串口,比如消息中带有特定标识等
        # 简单起见,这里示例只是向所有串口都发送接收到的数据
        try:
            ser.write(message.encode('utf-8'))
            print(f"向串口 {ser.port} 发送WebSocket消息: {message}")
        except serial.SerialException as e:
            print(f"向串口 {ser.port} 发送数据失败: {e}")


# WebSocket连接建立时的回调函数
def on_open(ws):
    print("WebSocket连接已建立")
    # 为每个打开的串口启动一个线程,用于读取串口数据并发送到WebSocket
    for ser in ser_list:
        t = threading.Thread(target=read_serial_and_send_ws, args=(ser, ws))
        t.start()


# 创建WebSocket连接对象,并设置相关回调函数
ws = websocket.WebSocketApp("ws://your_websocket_server_address",
                            on_open=on_open,
                            on_message=on_message)


if __name__ == "__main__":
    open_serials()
    if len(ser_list) == 4:
        # 启动WebSocket的消息循环,开始监听
        ws.run_forever()
    else:
        print("未能成功打开全部4个串口,程序退出")

请注意以下几点:

  1. 上述代码中的 COM1COM2 等串口名称需要替换为你实际电脑上可用的串口名称,可以在设备管理器(Windows)或者 /dev 目录下(Linux)查看具体的串口设备节点。
  2. ws://your_websocket_server_address 需要替换为真实的 WebSocket 服务器地址,并且确保你的程序所在环境能够访问该服务器。
  3. 代码中处理串口数据发送到 WebSocket 以及 WebSocket 数据发送回串口的逻辑相对简单,在实际应用中,可能需要根据具体的通信协议、数据格式等添加更多的数据处理和判断逻辑,例如根据消息中的特定字段来决定发往哪个具体的串口等。

此外,错误处理部分可以根据实际需求进一步完善,以应对更复杂的异常情况。如果要在实际项目中使用,建议进行充分的测试和调试来保证通信的稳定性和准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码熊崽的编程森林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值