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

serial.write()用create_data生成数据发约10次失败,固定字符串正常,求因?

问题分析与解决方案

核心问题

发送随机生成的数据约10次后失败,但固定字符串始终成功,核心原因是串口接收缓冲区未被清空:当cansend命令因数据格式问题执行失败时,会输出错误信息到串口,但代码未读取这些返回内容,导致缓冲区逐渐被填满,最终阻塞后续写入操作。而固定字符串对应的命令始终执行成功,无错误输出,缓冲区不会堆积,因此发送持续正常。

另外,create_data生成的十六进制字符串格式不统一(如0x0、0xf这类单字符十六进制),可能触发cansend解析异常,加速缓冲区溢出。

解决方案

1. 清空串口接收缓冲区

每次发送命令后,读取并丢弃串口返回的所有数据,避免缓冲区堆积:

def master_send():
    com5.write("/app/bin/ip link set can0 down\n".encode())
    time.sleep(0.5)
    com5.write("/app/bin/ip link set can0 up type can bitrate 100000 dbitrate 1000000 fd on\n".encode())
    time.sleep(0.1)

    for i in range(200):
        data = create_data()
        canfd_cmd = f"/app/bin/cansend can0  -b -i 0x100 {data} \n".encode()
        time.sleep(0.1)
        com5.write(canfd_cmd)
        time.sleep(0.02)
        # 新增:读取并清空串口缓冲区
        while com5.in_waiting > 0:
            com5.read(com5.in_waiting)

2. 统一十六进制字符串格式

修改create_data函数,确保生成的每个十六进制字符串都是标准两位数字格式,避免cansend解析错误:

def create_data():
    op_list = []
    for i in range(64):
        op3 = random.randint(0, 255)
        # 生成0x00到0xff的标准格式字符串
        op_list.append(f"0x{op3:02x}")
    canfd_data = ' '.join(op_list)
    return canfd_data

3. 调整命令发送间隔(可选)

适当延长命令发送后的等待时间,确保cansend有足够时间完成执行,避免命令堆积:

# 将原有的time.sleep(0.02)调整为更长时间
time.sleep(0.1)

内容的提问来源于stack exchange,提问作者shengjie song

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:15:11