gpt4 book ai didi

python - 如何从 python-can 接口(interface)中捕获 CAN 总线异常,例如 'Network down'?

转载 作者:行者123 更新时间:2023-11-30 22:39:32 25 4
gpt4 key购买 nike

我有一个小型 python 项目来模拟我构建的支持 CAN 的电子设备。该项目有一个 shell 解释器来与模拟电子设备交互。我现在想捕获从 python-can 运行实例中抛出的异常,并在主 shell UI 中打印友好的错误消息,而不是获取使显示困惑的完整堆栈跟踪。

例如,如果我在未配置 can0 接口(interface)的情况下运行脚本(即在执行 ip link set can0 up type can bitrate 250000 之前),我会得到一个堆栈跟踪如下:

Failed to send: Timestamp:        0.000000        ID: 0541    000    DLC: 8    01 1a c4 13 00 00 e2 04
> Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/usr/lib/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3.6/site-packages/can/notifier.py", line 39, in rx_thread
msg = self.bus.recv(self.timeout)
File "/usr/lib/python3.6/site-packages/can/interfaces/socketcan_native.py", line 341, in recv
packet = capturePacket(self.socket)
File "/usr/lib/python3.6/site-packages/can/interfaces/socketcan_native.py", line 274, in capturePacket
cf, addr = sock.recvfrom(can_frame_size)
OSError: [Errno 100] Network is down

请注意,上面的“>”符号是我的迷你 shell 提示符。看起来很丑,对吧。

我首先尝试派生 SocketcanNative_Bus 并重写 recv() 方法,但随后我的新类被拒绝,因为在 /usr/lib/中进行了检查python3.6/site-packages/can/interfaces/interface.py 根据已知模块列表验证接口(interface)类名称。所以这可能不是正确的方法。

在我尝试任何其他愚蠢的事情之前,python-can是否提供了一些方法来拦截在传输数据包期间或CAN接口(interface)时在Notifier线程中发生的操作系统错误例如,会下降吗?

请注意,由于我使用的是 USB CAN 适配器,因此仅在脚本启动时检查网络状态是没有意义的,因为 CAN 适配器也可能在脚本运行时被拔出。因此,唯一相关的方法是捕获 python-can 模块抛出的异常并在主线程中显示友好的消息。

最佳答案

我仍然不知道这是否是 python-can 开发人员的意图,但这是我最新的工作尝试。我正在重写类 SocketcanNative_Bus 实例(又名 bus)的 recv() 方法:

can.rc['interface'] = 'socketcan_native'
can.rc['channel'] = args[1]

from can.interfaces.socketcan_native import SocketcanNative_Bus
def recv(self, timeout=None):
try:
return SocketcanNative_Bus.recv(self, timeout)
except OSError as e:
print(str(e))
return None

try:
import types
bus = can.interface.Bus()
bus.recv = types.MethodType(recv, bus)

except OSError as e:
print('Error {0}: {1}'.format(e.errno, e.strerror), file=sys.stderr)

我使用 Python 的 types.MethodType() 动态覆盖 bus 实例的方法 recv()。这称为修补,如所述 elsewhere on Stackoverflow .

关于python - 如何从 python-can 接口(interface)中捕获 CAN 总线异常,例如 'Network down'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43139998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com