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

如何使用Python通过pyserial向UART端口发送命令控制机械臂

UART控制机械臂命令发送问题解决方法

常见错误排查

  • 字节串编写错误:你当前代码里的b"\x055\x55"存在格式错误,其中的5是ASCII字符,对应十六进制值为0x35,而非你预期的十六进制数值0x05。如果需要连续发送0x55作为帧头,正确写法应为b"\x55\x55",不要混写ASCII字符和十六进制转义符,更推荐用bytes.fromhex("十六进制字符串")的方式生成命令帧,避免手动拼写出错。
  • 校验和错误:大部分工业机械臂的UART通信协议要求帧尾携带校验和(多为累加和、异或和),手动硬编码命令很容易出现校验和计算错误,导致机械臂接收命令后直接丢弃。建议单独编写校验和计算函数,自动生成合法的命令帧。
  • 串口参数不匹配:你当前使用的9600波特率、8N1配置需要和机械臂的默认通信参数完全一致,部分机械臂默认波特率为115200,不要直接复用通用示例参数。
  • 未读取回执定位问题:发送命令后不要直接结束流程,需要读取机械臂返回的响应帧,响应帧中会明确返回校验错误、参数超限、指令不支持等错误码,可快速定位问题。

正确发送逻辑

  • 不需要拆分命令帧发送:串口是流传输协议,只要字节顺序正确,一次性发送完整帧和拆分发送没有区别,拆分发送反而容易因为间隔过长被机械臂判定为帧超时,直接丢弃数据。
  • 发送前清空串口缓冲区:避免之前的残留数据干扰当前命令的发送和接收。

修正后的代码示例

import serial

# 串口初始化,参数根据机械臂手册调整
ser = serial.Serial(
    port="/dev/ttyUSB0",
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_1,
    bytesize=serial.EIGHTBITS,
    timeout=2
)

def send_command(cmd_hex: str):
    """
    发送命令帧
    :param cmd_hex: 完整命令的十六进制字符串,无空格分隔
    """
    # 清空输入输出缓冲区
    ser.reset_input_buffer()
    ser.reset_output_buffer()
    # 生成字节帧
    cmd_frame = bytes.fromhex(cmd_hex)
    # 发送
    ser.write(cmd_frame)
    # 读取响应,长度根据手册规定的响应帧长度调整
    response = ser.read(10)
    print(f"发送帧:{cmd_frame.hex()},响应帧:{response.hex()}")
    return response

# 示例:发送你需要的命令,注意十六进制字符串不要写错
test_cmd = "55550B0302200302B00409FC03AA"
send_command(test_cmd)

ser.close()

可用工具说明

Python生态中pyserial已经是最成熟的串口操作库,没有额外的通用机械臂UART控制工具,你只需要按照协议规范封装命令即可。调试阶段可以先用minicom、cutecom等桌面串口调试工具手动发送命令,确认命令本身有效后再移植到Python代码中,避免命令错误和代码问题混在一起排查。

内容的提问来源于stack exchange,提问作者Кирилл Кулаков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:54:03