Python控制2F夹爪使用pyserial写入时报unicode字符串不支持错误
错误原因
- TypeError类型错误:你当前使用的是Python3环境,
pyserial库的ser.write()方法仅支持传入字节(bytes)类型参数,你代码中直接传入的是Unicode字符串,不符合参数要求,因此触发类型报错。 - 偶发通信端口报错:主要有两个常见原因:
- 代码中存在无限
while(True)循环,程序运行后永远不会执行后续打开夹爪的逻辑,也不会主动释放串口资源,下次运行时就会出现端口占用报错 - 使用
ser.readline()读取设备响应,而2F夹爪的Modbus RTU响应没有换行标识,readline()会等待到超时才返回,频繁超时容易触发底层通信异常
- 代码中存在无限
- 逻辑错误:无限循环后的打开夹爪代码永远无法被执行,不符合控制预期。
修复方案
- 所有
ser.write()传入的指令字符串前添加b前缀,声明为字节字面量,符合pyserial的参数要求 - 移除无意义的无限循环,调整夹爪控制逻辑顺序
- 增加串口资源释放逻辑和异常捕获,避免端口占用
- 调整串口读取逻辑,适配Modbus RTU协议的响应格式
修复后完整代码
import serial import time import binascii try: # 初始化串口,开启前先判断是否已占用,先关闭再打开 ser = serial.Serial( port='COM8', baudrate=9600, timeout=1, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS ) if ser.is_open: ser.close() ser.open() counter = 0 while counter < 1: counter = counter + 1 # 字符串前加b转为字节类型 ser.write(b"\x09\x10\x03\xE8\x00\x03\x06\x00\x00\x00\x00\x00\x00\x73\x30") # 读取8字节标准Modbus响应,替换readline data_raw = ser.read(8) print(data_raw) data = binascii.hexlify(data_raw) print("Response 1 ", data) time.sleep(0.01) ser.write(b"\x09\x03\x07\xD0\x00\x01\x85\xCF") data_raw = ser.read(7) print(data_raw) data = binascii.hexlify(data_raw) print("Response 2 ", data) time.sleep(1) # 关闭夹爪 print("Close gripper") ser.write(b"\x09\x10\x03\xE8\x00\x03\x06\x09\x00\x00\xFF\xFF\xFF\x42\x29") data_raw = ser.read(8) print(data_raw) data = binascii.hexlify(data_raw) print("Response 3 ", data) time.sleep(2) # 打开夹爪 print("Open gripper") ser.write(b"\x09\x10\x03\xE8\x00\x03\x06\x09\x00\x00\x00\xFF\xFF\x72\x19") data_raw = ser.read(8) print(data_raw) data = binascii.hexlify(data_raw) print("Response 4 ", data) time.sleep(2) except Exception as e: print(f"运行出错:{e}") finally: # 无论是否报错都释放串口资源 if ser.is_open: ser.close() print("串口已释放")
内容的提问来源于stack exchange,提问作者kausthub narayan
相关产品推荐
相关产品推荐

