以下是使用 Python 实现同时获取并操作 4 个串口,与 WebSocket 进行数据交互的示例代码框架。这个示例使用了 pyserial
库来操作串口(需要提前安装 pyserial
:pip install pyserial
),以及 websocket-client
库来处理 WebSocket 连接(需要安装 websocket-client
:pip 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_listfor 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}")# 发送数据到WebSocketws.send(data_str)time.sleep(0.01) # 适当休眠,避免过于频繁读取占用过多资源except serial.SerialException as e:print(f"串口 {ser.port} 读取数据出错: {e}")breakexcept 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连接已建立")# 为每个打开的串口启动一个线程,用于读取串口数据并发送到WebSocketfor 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个串口,程序退出")
请注意以下几点:
- 上述代码中的
COM1
、COM2
等串口名称需要替换为你实际电脑上可用的串口名称,可以在设备管理器(Windows)或者/dev
目录下(Linux)查看具体的串口设备节点。 ws://your_websocket_server_address
需要替换为真实的 WebSocket 服务器地址,并且确保你的程序所在环境能够访问该服务器。- 代码中处理串口数据发送到 WebSocket 以及 WebSocket 数据发送回串口的逻辑相对简单,在实际应用中,可能需要根据具体的通信协议、数据格式等添加更多的数据处理和判断逻辑,例如根据消息中的特定字段来决定发往哪个具体的串口等。
此外,错误处理部分可以根据实际需求进一步完善,以应对更复杂的异常情况。如果要在实际项目中使用,建议进行充分的测试和调试来保证通信的稳定性和准确性。