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
相关产品推荐
相关产品推荐

