You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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电平兼容)。

快速排查步骤

  1. 先测试UART连通性:执行print(uart.read(1)),如果返回None,检查波特率、接线或接收机绑定状态。
  2. 验证数据类型:打印type(uart.read(1)),必须显示<class 'bytes'>。
  3. 核对帧长度:用len(channel_bytes)确认读取的字节数是否等于预期的通道数据长度(比如16通道是32字节)。

内容的提问来源于stack exchange,提问作者Allan Liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:30:52