PySerial如何实现uint8串口读写 匹配Matlab串口通信逻辑
Matlab串口代码迁移PySerial适配方案
你当前代码运行结果和Matlab不一致,核心是PySerial与Matlab串口API的传参、返回值规则存在差异,和串口硬件配置无关。以下是两个问题的对应实现方式:
1. 等效实现Matlab fwrite(s,30,'uint8') 单字节数值发送
Matlab的fwrite(obj, val, 'uint8')逻辑是将传入整数编码为1个无符号8位字节发送。PySerial的write()方法仅接受字节类对象作为入参,直接传入整数30、18属于非法传参,不会按预期发送单字节数据。
等效写法为将整数封装为单字节bytes对象再发送:
# 发送十进制30,完全等效fwrite(s,30,'uint8') s.write(bytes([30])) # 发送十进制18,完全等效fwrite(s,18,'uint8') s.write(bytes([18]))
如果需要发送多字节uint8序列,直接将所有数值按顺序放入列表传入bytes()即可,例如bytes([82,101,97,100,121])就是对应字符串"Ready"的5字节编码。
2. 等效实现Matlab st = fread(s,5) 读取与十进制展示
Matlab的fread(obj, n)默认逻辑为读取n个字节,返回长度为n的uint8数组,每个元素为对应字节的0-255十进制整数值。
PySerial的s.read(n)虽然会在超时时间内读取最多n个字节,但返回值为bytes类型,直接打印会显示ASCII转义后的字符,和Matlab的输出格式不一致。要拿到完全一致的十进制数值序列,只需将返回的bytes对象转为整数列表即可:
# 读取5字节,返回[82,101,97,100,121]格式的十进制序列,完全等效Matlab的st = fread(s,5) st = list(s.read(5)) print(st)
如果需要实现Matlab中判断返回长度的逻辑,直接判断转换后列表的len()即可。
对齐Matlab逻辑的完整修正代码
以下代码完全复现原Matlab代码的重试连接、采集逻辑,串口参数和行为与原Matlab代码完全一致:
import serial import time # 初始化串口,参数与Matlab端完全对齐 s = serial.Serial( port='COM3', baudrate=115200, timeout=2 ) s.set_buffer_size(rx_size=10**6, tx_size=10**6) print("serial is open: ", s.is_open) # 循环重试连接,直到读到有效响应 st = [] while len(st) < 1: s.write(bytes([30])) time.sleep(0.1) st = list(s.read(5)) print(st) # 发送开始采集指令 s.write(bytes([18])) # 循环读取采集数据 while True: st = list(s.read(131)) print(st) # 后续数据处理逻辑可在此处添加
补充说明
- 如果不需要十进制数值展示,仅需做字节级数据解析,可直接使用
s.read(n)返回的原始bytes对象,无需转换为列表 - 若出现读取字节数不足预期的情况,优先排查设备端响应逻辑、接线稳定性,当前代码的串口配置与Matlab端完全一致,不存在参数不匹配问题
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

