python-can icon indicating copy to clipboard operation
python-can copied to clipboard

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

Open Dubbels17 opened this issue 1 year ago • 0 comments

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

Dubbels17 avatar Feb 22 '24 13:02 Dubbels17