python与stm32串口通信遇到的问题

本文介绍了一个使用Python的示例代码,通过Serial库进行串口通信,控制多个舵机和动作组。然而,代码中出现了一个ValueError,指出在调用move_servos函数时参数类型检查错误。作者寻求帮助解决这个关于参数类型转换的问题。
摘要由CSDN通过智能技术生成
import serial
import struct

# 定义串口通信参数
SERIAL_PORT = 'COM5'  # 替换为你的串口名称
BAUDRATE = 9600  # 波特率
TIMEOUT = 1  # 秒

# 定义指令集
CMD_MULT_SERVO_MOVE = 0x03  # 控制多个舵机的转动
CMD_FULL_ACTION_RUN = 0x06  # 动作组运行
CMD_FULL_ACTION_STOP = 0x07  # 停止正在运行的动作
CMD_FULL_ACTION_ERASE = 0x08  # 擦除动作组
CMD_BLE_SERVO_DOWNLOAD = 0x25  # 通过蓝牙下载动作组

# 初始化串口
ser = serial.Serial(SERIAL_PORT, BAUDRATE, timeout=TIMEOUT)

def build_data_packet(cmd, params):
    """
    构建数据包。
    :param cmd: 指令码
    :param params: 参数列表
    :return: 打包后的数据
    """
    length = len(params) + 2  # 2为指令和长度本身占用的字节
    packet = bytearray([0x55, 0x55, length])  # 帧头和数据长度
    packet.extend(struct.pack('B',cmd))  # 指令
    for param in params:
        if isinstance(param, int):
            packet.extend(struct.pack('B', param))  # 参数
        else:
            raise ValueError("参数必须是整数类型")  # 参数
    checksum = sum(packet) & 0xFF  # 计算校验和
    packet.append(checksum)  # 添加校验和
    return packet

def send_data_packet( packet ):
    """
    发送数据包。
    :param packet: 打包后的数据
    """
    ser.write(packet)

def move_servos( servo_count, time, servo_ids, positions ):
    """
    控制多个舵机的转动。
    :param servo_count: 要控制舵机的个数
    :param time: 执行时间(秒)
    :param servo_ids: 舵机ID列表
    :param positions: 舵机角度列表
    """
    params = [servo_count, int(time), int(time >> 8)]  # 时间的低8位和高8位
    params.extend([servo_id, pos, pos >> 8] for servo_id, pos in zip(servo_ids, positions))
    packet = build_data_packet(CMD_MULT_SERVO_MOVE, params)
    send_data_packet(packet)

def run_full_action( action_number, times ):
    """
    动作组运行。
    :param action_number: 动作组编号
    :param times: 执行次数(无限次则为0)
    """
    params = [action_number, int(times), int(times >> 8)]
    packet = build_data_packet(CMD_FULL_ACTION_RUN, params)
    send_data_packet(packet)

def stop_full_action():
    """
    停止正在运行的动作。
    """
    packet = build_data_packet(CMD_FULL_ACTION_STOP, [])
    send_data_packet(packet)

def erase_full_action():
    """
    擦除动作组。
    """
    packet = build_data_packet(CMD_FULL_ACTION_ERASE, [0x00])  # 保留参数
    send_data_packet(packet)

# 示例:移动两个舵机
move_servos( 1,1, [1], [45])

# 示例:运行动作组
# run_full_action(1, 1)
#
# # 示例:停止所有动作
# stop_full_action()
#
# # 示例:擦除动作组
# erase_full_action()

# 关闭串口
ser.close()

 上面是利用AI写的代码,但是在pycharm中运行后出现了以下错误

Traceback (most recent call last):
  File "C:\Users\adminster\Desktop\机器臂\pythonProject\text.py", line 83, in <module>
    move_servos( 1,1, [1], [45])
  File "C:\Users\adminster\Desktop\机器臂\pythonProject\text.py", line 55, in move_servos
    packet = build_data_packet(CMD_MULT_SERVO_MOVE, params)
  File "C:\Users\adminster\Desktop\机器臂\pythonProject\text.py", line 33, in build_data_packet
    raise ValueError("参数必须是整数类型")  # 参数
ValueError: 参数必须是整数类型

错误中说在move_servos( 1,1, [1], [45])  这句语句中的前两个参数不是整数,但这个明明就是整数,请求大佬帮我看看。

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值