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

Python控制2F夹爪使用pyserial写入时报unicode字符串不支持错误

错误原因
  1. TypeError类型错误:你当前使用的是Python3环境,pyserial库的ser.write()方法仅支持传入字节(bytes)类型参数,你代码中直接传入的是Unicode字符串,不符合参数要求,因此触发类型报错。
  2. 偶发通信端口报错:主要有两个常见原因:
    • 代码中存在无限while(True)循环,程序运行后永远不会执行后续打开夹爪的逻辑,也不会主动释放串口资源,下次运行时就会出现端口占用报错
    • 使用ser.readline()读取设备响应,而2F夹爪的Modbus RTU响应没有换行标识,readline()会等待到超时才返回,频繁超时容易触发底层通信异常
  3. 逻辑错误:无限循环后的打开夹爪代码永远无法被执行,不符合控制预期。
修复方案
  1. 所有ser.write()传入的指令字符串前添加b前缀,声明为字节字面量,符合pyserial的参数要求
  2. 移除无意义的无限循环,调整夹爪控制逻辑顺序
  3. 增加串口资源释放逻辑和异常捕获,避免端口占用
  4. 调整串口读取逻辑,适配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 22:06:04