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

MD49电机驱动器转速读取至树莓派失败,寻求解决方法

问题描述

在树莓派上对接MD49电机驱动器搭建PID控制器,目前已实现电机转速设置(SET_SPEED_1函数)和编码器数据读取(GET_ENCODER_1函数)功能,但调用GET_SPEED_1函数读取1号电机转速时,返回结果为none,无法正常获取数据。相关代码如下:

import serial 
import struct 

# 设置电机转速,功能正常
def SET_SPEED_1(speed):
    strSpeed = struct.pack("B",speed)
    writeBytes("\x00\x31" + strSpeed)

# 读取编码器数据,功能正常
def GET_ENCODER_1():
    writeBytes("\x00\x23")
    encByte = struct.unpack("B",port.read())
    encByte += struct.unpack("B",port.read())
    encByte += struct.unpack("B",port.read())
    encByte += struct.unpack("B",port.read())
    encoder = (encByte[0] << 24) + (encByte[1] << 16) + (encByte[2] << 8) + encByte[3]
    return encoder

# 读取转速的函数(存在问题)
def GET_SPEED_1():   
    writeBytes("\x00\x21")
    speed = struct.unpack("B", port.read())

注:命令以同步字节0开头,其后为命令及数据字节。


问题分析与修复

核心问题1:函数无返回值

当前GET_SPEED_1仅定义了变量speed,但没有return语句,调用时必然返回None,这是直接导致结果异常的原因。

核心问题2:数据读取格式与长度错误

根据MD49协议规范,GET_SPEED_1命令(0x21)返回的是2字节有符号整数(范围-32768~32767),而非单字节无符号数。需要调整读取逻辑:

  • 读取2个字节而非1个
  • 使用对应格式解析有符号短整数(MD49默认用小端字节序,对应struct格式符<h)

可选优化:提升串口读取可靠性

直接调用port.read()可能因缓冲区数据未就绪导致读取失败,建议添加长度校验和超时处理。

修复后的GET_SPEED_1函数

def GET_SPEED_1():   
    writeBytes("\x00\x21")
    # 读取2个字节的转速数据,确保拿到完整响应
    speed_data = port.read(2)
    if len(speed_data) != 2:
        # 读取失败时返回默认值或抛出异常,根据需求调整
        return 0
    # 解析为小端有符号短整数,匹配MD49协议
    speed = struct.unpack("<h", speed_data)[0]
    return speed

额外注意事项

  • 确保port是已正确初始化的串口对象,示例:
    port = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
    
  • 确认writeBytes函数实现正确,示例:
    def writeBytes(data):
        port.write(bytearray(data, 'latin-1'))
    

内容的提问来源于stack exchange,提问作者Ali Hamdoun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:45:49