hardbyte / hardbyte/python-can

slcan interface needs some time-tweaking (Possible solution provided)

Abierto
#1,746 0 comentarios 0 reacciones 0 asignados Ver en GitHub
bug
Lenguaje dominante
Python
Estrellas
1.6k
Forks
697
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

### Describe the bug
Messages are truncated while using send command.
Messages are truncated while using close command.

### To Reproduce
Code as example. Requires python-can and pyserial modules.
Windows PC and CANable with original firmware: https://github.com/normaldotcom/canable-fw
Counter-interface: PCAN USB dongle and oscilloscoop

Problem 1: When looping messages within the "with can.Bus", one can see on the scope that the messages are corrupted/truncated.
Problem 2: When looping messages main, one can see that the last message in the "with can.Bus" is truncated.

Possible solution:
End the _write-function with: "time.sleep(3.0e-5)"
Begin the close-function with: "time.sleep(3.0e-5)"

Additional information, experimentally obtained:
10kbps: total fail (!)
20kpbs: requires 5.0e-3 seconds
50kpbs: requires 2.0e-3 seconds
83kpbs: requires 2.0e-3 seconds
100kpbs: requires 6.0e-4 seconds
125kpbs: requires 6.0e-4 seconds
250kpbs: requires 5.0e-5 seconds
500kpbs: requires 3.0e-5 seconds
750kpbs: other side (PCAN in this case) has no setting for 750, it has 800 which is not compatible
1000kpbs: requires 4.0e-6 seconds or even lower

### Expected behavior
Truncated messages: seen on a oscilloscoop. PCAN viewer tels me stuffing errors. The error will result in resending infinite retrying messages.

### Additional context
OS and version: Windows 11
Python version: Python 3.12
python-can version: 4.3.1
pyserial version: 3.5
python-can interface/s (if applicable): slcan
Hardware interface: CANable 2.0 Pro
IDE: PyCharm recent version
Oscilloscope: Rigol DS1000-series
Counter-interface: PCAN USB isolated version and PCAN-View software

Possible solution:
End the _write-function with: "time.sleep(3.0e-5)"
Begin the close-function with: "time.sleep(3.0e-5)"

Traceback and logs

None

See code example.

```
def send_one():
with can.Bus(interface="slcan", channel="COM7@115200", bitrate=500000, sleep_after_open=0.0) as bus:
msg = can.Message(
arbitration_id=0x555, data=[0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55], is_extended_id=False
)

try:
j = 0
while j < 2:
bus.send(msg)
j = j + 1
except can.CanError:
print("Message NOT sent")

if __name__ == "__main__":
i = 0
while i < 2:
send_one()
i = i + 1
```

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.