Python跨模块调用py文件函数返回值异常问题排查
问题根因
代码无法正常运行是3个核心错误导致的:
read_bus函数接收了bus_device入参但完全没有使用,函数内直接调用未定义的bus对象,运行第一行就会触发NameError,根本走不到后续读数据逻辑- 异常捕获分支没有初始化
string变量,一旦读总线过程中报错,执行return string时会再次触发变量未定义错误,拿不到任何有效返回值 - 总线接收逻辑没有超时退出机制,如果对应vcan0接口一直没有报文,程序会卡在while无限循环里假死
修复方案
首先安装CAN通讯依赖库:
pip install python-can
修复后的newcanmonitor.py
import can def read_bus(bus_device, timeout=5): """Read data from `bus_device` until get a valid can message""" # 初始化总线实例,传入的设备参数在这里生效 bus = can.interface.Bus(channel=bus_device, bustype='socketcan') string = "" message = None # 增加超时控制,避免程序死循环 recv_retry_count = 0 while recv_retry_count < timeout / 0.2: message = bus.recv(0.2) if message: break recv_retry_count += 1 else: # 超时未收到报文直接返回错误信息 return f"ERR: No message received on bus {bus_device}" try: string = "{}:ID={}:LEN={}".format("RX", message.arbitration_id, message.dlc) for x in range(message.dlc): string += ":{:02x}".format(message.data[x]) except Exception as e: string = f"ERR: Parse message failed - {str(e)}" finally: # 用完关闭总线连接 bus.shutdown() return string
main.py可直接沿用原有逻辑,也可增加简单的结果判断
import newcanmonitor xy = newcanmonitor.read_bus('vcan0') print(xy)
注意事项
- 运行代码前先确认vcan0虚拟CAN接口已经在系统中创建并启动,否则总线初始化会直接失败
- 如果对接硬件CAN设备,只需要把
bustype参数改成对应硬件的适配类型,再补充对应硬件的初始化参数即可
内容的提问来源于stack exchange,提问作者deepsdog
相关产品推荐
相关产品推荐

