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

server/2024/12/16 10:56:01/

以下是使用 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_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个串口,程序退出")

请注意以下几点:

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

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


http://www.ppmy.cn/server/150613.html

相关文章

canvas给图片与文本加水印

先弄出一个canvas <!DOCTYPE html> <html> <head> <title>Canvas API 示例</title> </head> <body> <canvas id"myCanvas" width"200" height"200" style"border:1px solid #000000;"&…

Python-pptx库简介

目录 一、Python-pptx 库概述 二、安装 Python-pptx 库 三、创建演示文稿 四、添加文本内容 五、添加形状 六、添加图片 七、添加图表 八、保存演示文稿 九、示例演示文稿 十、总结 在Python编程中&#xff0c;处理演示文稿是一项常见的任务。Python-pptx库为我们提供…

idea启动时报错“类文件具有错误版本61.0,应为55.0”

启动Springcloud项目时&#xff0c;idea启动时报错“类文件具有错误版本61.0&#xff0c;应为55.0”。 jdk版本和spring版本不匹配&#xff0c; 网上通常的解决方案是降低spring版本&#xff0c;需要在pom.xml文件里修改一下依赖的spring版本。 我不想降低,安装jdk17后还需要…

微信小程序横屏页面跳转后,自定义navbar样式跑了?

文章目录 问题原因&#xff1a;解决方案&#xff1a; 今天刚遇到的问题&#xff0c;横屏的页面完成操作后跳转页面后&#xff0c;自定义的tabbar样式乱了&#xff0c;跑到最顶了&#xff0c;真机调试后发现navbar跑到手机状态栏了&#xff0c;它正常应该跟右边胶囊一行。 知道问…

游戏引擎学习第43天

仓库 https://gitee.com/mrxiao_com/2d_game 介绍运动方程 今天我们将更进一步&#xff0c;探索运动方程&#xff0c;了解真实世界中的物理&#xff0c;并调整它们&#xff0c;以创建一种让玩家感觉愉悦的控制体验。这并不是在做一个完美的物理模拟&#xff0c;而是找到最有趣…

RCE 命令注入 过滤cat绕过方式

过滤cat 查看当前目录 根据题目可以知道cat被过滤了&#xff0c;并不能简单的得到flag 使用单引号绕过 127.0.0.1|cat flag_1429188548629.php 使用双引号绕过 127.0.0.1|c""at flag_1429188548629.php 利用Shell 特殊变量绕过 127.0.0.1|c$at flag_14291885…

黑马 Cpp qt相关笔记

什么是QT QT是一个跨平台的C图像用户界面应用程序框架QT在1991年由奇趣科技开发QT的优点 跨平台,几乎支持所有平台接口简单&#xff0c;容易上手一定程度上简化了内存回收机制有很好的社区氛围可以进行嵌入式开发 QWidget QT注意事项 命名规范 类名 首字母大写&#xff0c;单…

7-3 最大子段和问题

分数 30 作者 王东 单位 贵州师范学院 最大子段和问题。给定由n个整数组成的序列&#xff0c;求序列中子段的最大和&#xff0c;若所有整数均为负整数时定义最大子段和为0。 输入格式: 第一行输入整数个数n&#xff08;1≤n≤1000&#xff09;&#xff0c;再依…