SocketCAN-Plugin verwenden

Das SocketCAN-Plugin kapselt die Linux-Sockets-API für den Zugriff auf die CAN-Geräte. Diese API ist ein Satz von Open-Source-CAN-Treibern und ein Netzwerk-Stack, der von der Volkswagen-Forschung zum Linux-Kernel beigetragen wurde.

Dieses Plugin benötigt einen Linux-Kernel mit SocketCAN-Unterstützung und SocketCAN-Gerätetreiber für die verwendete CAN-Hardware.

SocketCAN Verwendung

Um alle (auch unkonfigurierten) Netzwerkschnittstellen aufzulisten, kann der Befehl ifconfig -a verwendet werden.

Um SocketCAN zu verwenden, müssen die entsprechenden Linux-Kernel-Module geladen und die Netzwerkschnittstelle konfiguriert sein.

Einrichten von echter CAN-Hardware

Dieser Abschnitt geht davon aus, dass der Gerätetreiber bereits geladen ist (höchstwahrscheinlich automatisch beim Anschluss der CAN-Hardware).

Standardeinstellungen

So stellen Sie das Gerät can0 auf eine Bitrate von 250 kBit/s ein:

sudo ip link set up can0 type can bitrate 250000

Zur automatischen Wiederherstellung bei "Bus-Off"-Fehlern nach 100 Millisekunden kann der folgende Befehl verwendet werden:

sudo ip link set up can0 type can bitrate 250000 restart-ms 100

CAN FD-Einstellungen

Um das Gerät can0 auf eine Arbitrierungs-Bitrate von 500 kBit/s und eine Daten-Bitrate von 4 MBit/s (für Frames mit Bitrate-Switch-Flag) einzustellen:

sudo ip link set can0 up type can bitrate 500000 dbitrate 4000000 fd on

Einrichten eines virtuellen CAN-Busses

Hinweis: Für die Verwendung von CAN FD muss die MTU (Maximum Transmission Unit) auf 72 Byte eingestellt werden.

sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0 mtu 72

Die im Folgenden verwendeten Kommandozeilen-Testprogramme stammen aus dem Paket can-utils:

# Display received CAN messages with absolute timestamps and flags
candump -ta -x vcan0

# Send a CAN FD message with flags BRS and EFI set
cansend vcan0 123##3112233445566778899aabbccddeeff

# Generate random CAN messages
cangen vcan0

Erstellen von CAN-Bus-Geräten

Zunächst ist zu prüfen, ob QCanBus das gewünschte Plugin bereitstellt:

if (QCanBus::instance()->plugins().contains(QStringLiteral("socketcan"))) {
    // plugin available
}

Dabei ist socketcan der Name des Plugins.

Anschließend kann eine Verbindung zu einer bestimmten Schnittstelle hergestellt werden:

QString errorString;QCanBusDevice *device = QCanBus::instance()->createDevice(    QStringLiteral("socketcan"), QStringLiteral("can0"), &errorString);if (!device) { // Fehlerbehandlung geht hier    qDebug << errorString;
} else {  device->connectDevice(); }

Dabei ist can0 der Name der aktiven CAN-Schnittstelle. CAN-Schnittstellen verhalten sich auf Linux-Systemen wie normale Netzwerkschnittstellen und können mit ifconfig ermittelt werden. Außerdem gibt die Methode availableDevices() eine Liste der derzeit verfügbaren Geräte zurück.

Das Gerät ist nun für das Schreiben und Lesen von CAN-Frames geöffnet:

QCanBusFrame frame;
frame.setFrameId(8);
QByteArray payload("A36E");
frame.setPayload(payload);
device->writeFrame(frame);

Das Lesen kann mit der Methode readFrame() durchgeführt werden. Das Signal framesReceived() wird ausgegeben, wenn mindestens ein neuer Frame zum Lesen verfügbar ist:

QCanBusFrame frame = device->readFrame();

SocketCAN unterstützt die folgenden Konfigurationen, die über setConfigurationParameter() gesteuert werden können:

Konfigurationsparameter SchlüsselBeschreibung
QCanBusDevice::LoopbackKeyUm den Anforderungen von Mehrbenutzern gerecht zu werden, ist der lokale Loopback standardmäßig aktiviert. Das bedeutet, dass jedes Mal, wenn ein CAN-Frame auf dem CAN-Bus gesendet wird, ein lokales Echo dieses Frames an alle mit diesem CAN-Gerät verbundenen Anwendungen gesendet wird. Wenn diese Option aktiviert ist, werden die so empfangenen Frames mit QCanBusFrame::hasLocalEcho() markiert.
QCanBusDevice::ReceiveOwnKeyDer Empfang von CAN-Frames auf demselben Socket, der den CAN-Frame gesendet hat, ist standardmäßig deaktiviert. Wenn diese Option aktiviert ist, erscheinen alle CAN-Frames, die an den CAN-Bus gesendet werden, sofort im Empfangspuffer. Dies kann verwendet werden, um zu überprüfen, ob das Senden erfolgreich war. Wenn diese Option aktiviert ist, werden die so empfangenen Frames mit QCanBusFrame::hasLocalEcho() markiert.
QCanBusDevice::ErrorFilterKeyEin CAN-Interface-Treiber kann so genannte Error Message Frames erzeugen, die optional wie andere CAN-Frames an die Benutzeranwendung weitergegeben werden können. Die möglichen Fehler werden in verschiedene Fehlerklassen eingeteilt, die mit Hilfe einer entsprechenden Fehlermaske gefiltert werden können. Die Werte für die Fehlermaske werden in linux/can/error.h definiert.
QCanBusDevice::RawFilterKeyDiese Konfiguration kann mehrere Filter vom Typ QCanBusDevice::Filter enthalten. Standardmäßig ist die Verbindung so konfiguriert, dass jede CAN-Bus-Nachricht akzeptiert wird.
QCanBusDevice::BitRateKeyLegt die Bitrate der CAN-Bus-Verbindung fest. Die folgenden Bitraten werden unterstützt: 5000, 10000, 20000, 33000, 47000, 50000, 83000, 95000, 100000, 125000, 250000, 500000, 800000, 1000000. Beachten Sie, dass dieser Konfigurationsparameter nur eingestellt werden kann, wenn die QCanBusDevice nicht angeschlossen ist. Zum Einstellen dieses Konfigurationsparameters wird zur Laufzeit die Bibliothek libsocketcan benötigt http://www.pengutronix.de/software/libsocketcan. Zum Einstellen der CAN-Bus-Bitrate sind in der Regel Root-Rechte erforderlich.
QCanBusDevice::CanFdKeyDiese Konfigurationsoption bestimmt, ob CANFD-Frames gesendet oder empfangen werden dürfen. In der Voreinstellung ist diese Option deaktiviert. Sie steuert die Option CAN_RAW_FD_FRAMES des CAN-Sockets.
QCanBusDevice::DataBitRateKeyDiese Konfiguration wird vom Socketcan-Plugin nicht unterstützt. Es ist jedoch möglich, die Datenrate bei der Konfiguration der CAN-Netzwerkschnittstelle mit dem Befehl ip link einzustellen.
QCanBusDevice::ProtocolKeyErlaubt die Verwendung eines anderen Protokolls innerhalb der Protokollfamilie PF_CAN. Der Standardwert für diese Konfigurationsoption ist CAN_RAW (1).

Zum Beispiel:

QList<QCanBusDevice::Filter> list;
QCanBusDevice::Filter f;

// only accept odd numbered frame id of type remote request
// frame can utilize extended or base format
f.frameId = 0x1;
f.frameIdMask = 0x1;
f.format = QCanBusDevice::Filter::MatchBaseAndExtendedFormat;
f.type = QCanBusFrame::RemoteRequestFrame;
list.append(f);

device->setConfigurationParameter(QCanBusDevice::RawFilterKey, QVariant::fromValue(list));
device->setConfigurationParameter(QCanBusDevice::ErrorFilterKey,
                                  QVariant::fromValue(QCanBusFrame::FrameErrors(QCanBusFrame::AnyError)));

Erweitertes Rahmenformat und flexible Datenrate werden in SocketCAN unterstützt.

SocketCAN unterstützt die folgenden zusätzlichen Funktionen:

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.