如何使用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,提问作者Кирилл Кулаков
相关产品推荐
相关产品推荐

