Python CAN / SLCAN Sende- und Empfangsbeispiel

SLCAN ist ein CAN-Schnittstellenprotokoll, das über serielle Kommunikation arbeitet. Es wird oft verwendet, um sich über USB mit CAN-Schnittstellen zu verbinden.

Das folgende Beispiel verwendet die python-can-Bibliothek, um CAN-Nachrichten über SLCAN zu senden und zu empfangen.

Die grundlegende Absicht ist, zwei separate CAN-Adapter zu haben (wie der sehr günstige FYSETC UCAN mit der slcan-Firmware)

Installieren Sie zuerst die python-can-Bibliothek:

install_python_can.sh
pip install python-can

Sender-Beispiel

Dieser Code verbindet sich mit /dev/ttyACM0 und sendet wiederholt eine einzelne CAN-Nachricht:

slcan_sender.py
#!/usr/bin/env python3
import can
import time

# Konfiguration für das SLCAN-Gerät
slcan_device = '/dev/ttyACM0'
baud_rate = 500000  # Stellen Sie die geeignete Baudrate für Ihr Setup ein

# CAN-Bus-Instanz mit der SLCAN-Schnittstelle erstellen
bus = can.interface.Bus(interface='slcan', channel=slcan_device, bitrate=baud_rate)

# Eine einfache CAN-Nachricht definieren
can_id = 0x123  # CAN-ID
data = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]  # 8 Bytes Daten

# CAN-Nachricht erstellen
message = can.Message(arbitration_id=can_id, data=data, is_extended_id=False)

try:
    while True:
        # CAN-Nachricht senden
        bus.send(message)
        print(f"Sent: {message}")

        # Eine Sekunde warten vor dem Senden der nächsten Nachricht
        time.sleep(1)

except KeyboardInterrupt:
    print("Stopped by user")

except can.CanError as e:
    print(f"CAN error: {e}")

Beispielausgabe

slcan_sender_output.txt
Sent: Timestamp:        0.000000    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Sent: Timestamp:        0.000000    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Sent: Timestamp:        0.000000    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Sent: Timestamp:        0.000000    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Sent: Timestamp:        0.000000    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Sent: Timestamp:        0.000000    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Sent: Timestamp:        0.000000    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Sent: Timestamp:        0.000000    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08

Empfänger-Beispiel

Dieser Code verbindet sich mit /dev/ttyACM1 und lauscht auf eingehende CAN-Nachrichten (und gibt sie auf der Kommandozeile aus):

slcan_receiver.py
#!/usr/bin/env python3
import can

# Konfiguration für das SLCAN-Gerät
slcan_device = '/dev/ttyACM1'
baud_rate = 500000  # Stellen Sie die geeignete Baudrate für Ihr Setup ein

# CAN-Bus-Instanz mit der SLCAN-Schnittstelle erstellen
bus = can.interface.Bus(interface='slcan', channel=slcan_device, bitrate=baud_rate)

try:
    print("Listening for CAN messages on", slcan_device)
    while True:
        # Eine Nachricht vom CAN-Bus lesen
        message = bus.recv()

        if message is not None:
            print(f"Received: {message}")

except KeyboardInterrupt:
    print("Stopped by user")

except can.CanError as e:
    print(f"CAN error: {e}")

Beispielausgabe

slcan_receiver_output.txt
Listening for CAN messages on /dev/ttyACM1
Received: Timestamp: 1722300573.156834    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Received: Timestamp: 1722300573.157226    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Received: Timestamp: 1722300573.157592    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Received: Timestamp: 1722300573.157937    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Received: Timestamp: 1722300573.979205    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Received: Timestamp: 1722300574.979508    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Received: Timestamp: 1722300575.979660    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Received: Timestamp: 1722300576.979969    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08
Received: Timestamp: 1722300577.980201    ID:      123    S Rx                DL:  8    01 02 03 04 05 06 07 08

Check out similar posts by category: Python, CAN