如何用Raspberry Pi Pico+MicroPython读取DSMX数据转舵机指令?
Raspberry Pi Pico读取DSMX数据的TypeError问题解决
错误原因
TypeError: object with buffer protocol required 本质是ustruct.unpack()需要**字节对象(bytes)**作为输入,但你传入的是不符合要求的类型(比如字符串、None或未正确读取的UART数据)。
修正后的完整代码
以下是适配DSMX协议的MicroPython代码,针对Pico的UART读取优化:
from machine import UART, Pin import ustruct # 初始化UART:根据你的接线调整引脚,波特率确认你的接收机参数(常见115200) uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1), bits=8, parity=None, stop=1) # DSMX帧配置:以16通道接收机为例,帧头0x0F,总长度1(头)+16*2(通道)=33字节 FRAME_HEADER = 0x0F FRAME_LENGTH = 33 def parse_dsmx_channels(): while True: # 缓存足够数据再读取,避免截断 if uart.any() >= FRAME_LENGTH: # 读取帧头并验证 header_byte = uart.read(1) if header_byte and header_byte[0] == FRAME_HEADER: # 读取剩余帧数据 channel_bytes = uart.read(FRAME_LENGTH - 1) if channel_bytes: # 小端解析16个16位无符号整数(DSMX通道值范围通常1000-2000) channels = ustruct.unpack('<' + 'H'*16, channel_bytes) print("通道数据:", channels) # 这里可以添加舵机控制逻辑,比如将channels值转换为PWM输出 parse_dsmx_channels()
核心注意事项
- UART读取逻辑:DSMX是二进制帧协议,不能用
uart.readline()(针对文本换行),必须用uart.read(n)读取固定长度字节。 - 帧参数匹配:如果是8通道接收机,帧长度改为1+8*2=17字节,unpack格式改为
<HHHHHHHH。 - 数据类型校验:每次读取后先判断返回值是否为bytes,避免None传入ustruct导致错误。
- 硬件检查:确认发射机与接收机已绑定,Pico引脚与接收机RX/TX正确连接(注意3.3V电平兼容)。
快速排查步骤
- 先测试UART连通性:执行
print(uart.read(1)),如果返回None,检查波特率、接线或接收机绑定状态。 - 验证数据类型:打印
type(uart.read(1)),必须显示<class 'bytes'>。 - 核对帧长度:用
len(channel_bytes)确认读取的字节数是否等于预期的通道数据长度(比如16通道是32字节)。
内容的提问来源于stack exchange,提问作者Allan Liu
相关产品推荐
相关产品推荐

