如何用PySerial持续读取并解析Ubuntu下USB硬件的十六进制数据?
嘿,我来帮你一步步解决这个串口数据捕获的问题!
1. 让脚本持续打印数据
你的当前脚本只读取一次10000字节就结束了,要实现持续捕获,只需要加个循环就行。这里给你写个带基础异常处理的版本,方便你用Ctrl+C安全退出:
import serial # 初始化串口,注意确认/dev/ttyUB0是正确的设备名,波特率要和硬件完全匹配 ser = serial.Serial('/dev/ttyUB0', 9600, timeout=1) # 加timeout避免程序一直阻塞 try: while True: # 可以根据硬件传输逻辑调整读取字节数,比如每次读16字节,或者读一行(如果硬件带换行分隔) raw_data = ser.read(16) if raw_data: # 避免打印空数据 # 打印原始字节数据 print(f"原始字节: {raw_data}") # 转成可读性更强的十六进制格式(用空格分隔每个字节) hex_data = raw_data.hex(' ') print(f"十六进制格式: {hex_data}\n") except KeyboardInterrupt: print("\n用户手动终止程序") finally: ser.close() # 确保退出时关闭串口,避免占用资源
2. 十六进制数据解析
因为串口返回的是bytes类型,你可以直接对其进行解析:
- 如果只是想查看十六进制字符串,用上面的
hex()方法就足够; - 如果硬件是按特定协议传输(比如固定帧格式、特定字节代表传感器值/状态),可以直接提取字节并转换:
import struct # 举个例子:假设前4字节是大端格式的32位整数 if len(raw_data) >= 4: # 用struct模块解析多字节数值,>I表示大端无符号32位整数 parsed_value = struct.unpack('>I', raw_data[:4])[0] print(f"解析出的整数: {parsed_value}") # 提取单个字节的十进制值 single_byte_value = int(raw_data[0]) print(f"第一个字节的十进制值: {single_byte_value}")
3. 数据保存与分析的选择
这取决于你的具体需求:
- 如果不需要实时分析:把数据保存到文本文件是个不错的选择,事后可以用单独脚本、Excel甚至Python的pandas做深度分析。修改上面的循环,加上文件写入逻辑:
import serial ser = serial.Serial('/dev/ttyUB0', 9600, timeout=1) try: # 用追加模式打开文件,避免覆盖已有数据 with open('serial_capture.log', 'a') as log_file: while True: raw_data = ser.read(16) if raw_data: hex_data = raw_data.hex(' ') + '\n' print(hex_data.strip()) log_file.write(hex_data) log_file.flush() # 强制立即写入文件,避免缓存延迟 except KeyboardInterrupt: print("\n用户手动终止程序") finally: ser.close()
之后你可以写一个单独的分析脚本,读取serial_capture.log文件来处理历史数据。
- 如果需要实时分析:直接在同一个循环里处理数据就好,比如解析后实时判断阈值、统计数据等,这样不用额外写脚本,效率也更高。
最后提醒下:确认你的串口设备名是否正确(常见的是/dev/ttyUSB0,你写的/dev/ttyUB0可能是笔误?),还有波特率、数据位、停止位这些参数必须和硬件完全匹配,否则会读到乱码。
内容的提问来源于stack exchange,提问作者Lauren
相关产品推荐
相关产品推荐

