hardbyte / hardbyte/python-can

no response from Kvaser after a long delay between messages

未关闭
#2,017 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
bug
主要语言
Python
星标
1.6k
派生
697
PR 合并指标
30 天内没有已合并 PR

描述

### Describe the error

When using the **Kvaser interface via python-can**, the CAN bus can automatically stop transmitting received frames (`bus.recv()` returns `None`) after a long period of downtime, even if:

* The CAN bus is still physically active,
* ECU responses are present on the wire (externally verified),
* "bus.send()" continues to run successfully without errors,
* Kvaser driver statistics report `status=ok` and no bus shutdown status.

As a result, python-can reports **false “no response” timeouts**, while valid responses exist on the CAN bus.

This happens without causing an exception and does not require a forced reinitialization of the bus to recover.

---

### For playback

1. Use python-can with **Kvaser leaf light v2** or **Kvaser U100**.
2. Open the CAN bus and connect to it in the normal mode (sending a request → receiving a response).
3. Leave the system in standby mode for a long time (about 1-5 minutes):

* The application is running,
* the tire is open,
* The Kvaser is connected,
* The control unit is connected and turned on.
4. After the waiting period has expired, send a new CAN request.

Observed behavior:

* `bus.send()` completed successfully.
* `bus.recv(timeout)` returns the value `None` until the timeout expires.
* Python exception is not generated.
* External monitoring confirms that ECU responses are present on the bus.

The problem occurs periodically, but can be fixed after sufficient downtime.

---

### Expected behavior

`bus.recv()` must continue to return incoming CAN frames after periods of downtime until:

* the tire is open,
* The hardware is connected,
* The driver does not report a bus shutdown or a passive status with an error.

At a minimum, python-can must either:

* automatic recovery or
* returns a clear error indicating that the reception descriptor has become invalid.

---

### Additional context

This is apparently due to ** inactivity of the Kvaser receive descriptor or internal buffering behavior** after a long downtime.

Observed characteristics:

* Kvaser Driver Statistics Report ('canGetBusStatistics', `canReadStatus'):

* `status=ok`
* "Bus load=0.0%"
* no overspending, no bus shutdown
* However, the function `bus.recv()` does not return any frames.
* Forced bus shutdown and reinitialization restore normal operation.

---

Operating system and version:
Windows 10 / Windows 11 (x64) (tested on both)

Python version:
Python 3.9

python-can version:
4.5.0/4.6.1 (tested on both)

python-can interface/s:
`kvaser`

---

Feedback and logs

*The Python feedback function does not start.*

Example of a diagnostic log collected after the timeout:

```
[KvaserSnap:frame_write]
statistics=std_data: 0, std_remote: 0, ext_data: 0, ext_remote: 0,
err_frame: 0, bus loading: 0.0%, overspending: 0 status=ok
```

Additional note:

* `bus.recv(timeout=0)` returns the value "None" again
* An external CAN analyzer confirms that the ECU responses are simultaneously present on the bus

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。