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
相关产品推荐
相关产品推荐

