Auf dieser Seite

Verwendung des SocketCAN-Plugins

Das SocketCAN-Plugin kapselt die Linux-Sockets-API für den Zugriff auf die CAN-Geräte. Diese API besteht aus einer Reihe von Open-Source-CAN-Treibern und einem Netzwerkstack, die von Volkswagen Research zum Linux-Kernel beigesteuert wurden.

Dieses Plugin erfordert einen Linux-Kernel mit SocketCAN-Unterstützung sowie SocketCAN-Gerätetreiber für die verwendete CAN-Hardware.

Verwendung von SocketCAN

Um alle (auch nicht konfigurierten) Netzwerkschnittstellen aufzulisten, kann der Befehl „ ifconfig -a “ verwendet werden.

Um SocketCAN nutzen zu können, müssen die entsprechenden Linux-Kernel-Module geladen und die Netzwerkschnittstelle konfiguriert sein.

Einrichten von echter CAN-Hardware

In diesem Abschnitt wird davon ausgegangen, dass der Gerätetreiber bereits geladen ist (höchstwahrscheinlich automatisch beim Anschließen 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

Um „Bus-Off“-Fehler nach 100 Millisekunden automatisch zu beheben, 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 Arbitrierungsbitrate von 500 kBit/s und eine Datenbitrate von 4 MBit/s einzustellen (für Frames mit Bitrate-Switch-Flag):

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 Testprogramme für die Befehlszeile 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 muss überprüft werden, ob unter QCanBus das gewünschte Plugin bereitgestellt wird:

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

Dabei lautet „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) {
    // Hier erfolgt die Fehlerbehandlung
    qDebug << errorString;
} else {
    device->connectDevice();
}

Dabei ist `can0` der Name der aktiven CAN-Schnittstelle. CAN-Schnittstellen verhalten sich unter Linux 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 zum Schreiben und Lesen von CAN-Frames bereit:

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

Das Lesen kann mithilfe der Methode ` readFrame()` erfolgen. Das Signal ` framesReceived()` wird ausgelöst, sobald 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:

Schlüssel für den KonfigurationsparameterBeschreibung
QCanBusDevice::LoopbackKeyUm den Anforderungen mehrerer Benutzer gerecht zu werden, ist der lokale Loopback standardmäßig aktiviert. Das bedeutet, dass bei jeder Übertragung eines CAN-Frames über den CAN-Bus ein lokales Echo dieses Frames an alle mit diesem CAN-Gerät verbundenen Anwendungen gesendet wird. Ist diese Option aktiviert, werden die dadurch empfangenen Frames mit QCanBusFrame::hasLocalEcho() gekennzeichnet
QCanBusDevice::ReceiveOwnKeyDer Empfang der CAN-Frames auf demselben Socket, der den CAN-Frame gesendet hat, ist standardmäßig deaktiviert. Bei Aktivierung dieser Option erscheinen alle an den CAN-Bus gesendeten CAN-Frames sofort im Empfangspuffer. Dies kann genutzt werden, um zu überprüfen, ob der Versand erfolgreich war. Ist diese Option aktiviert, werden die dadurch empfangenen Frames mit „ QCanBusFrame::hasLocalEcho “ () gekennzeichnet
QCanBusDevice::ErrorFilterKeyEin CAN-Schnittstellentreiber kann sogenannte Fehlermeldungs-Frames erzeugen, die optional auf dieselbe Weise wie andere CAN-Frames an die Anwenderanwendung weitergeleitet werden können. Die möglichen Fehler sind in verschiedene Fehlerklassen unterteilt, die mithilfe der entsprechenden Fehlermaske gefiltert werden können. Die Werte für die Fehlermaske sind 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 sie alle CAN-Bus-Nachrichten akzeptiert.
QCanBusDevice::BitRateKeyLegt die Bitrate der CAN-Bus-Verbindung fest. Die folgenden Bitraten werden unterstützt: 5000, 10000, 20000, 33000, 47000, 50000, 83000, 95000, 100000, 125.000, 250.000, 500.000, 800.000, 1.000.000. Beachten Sie, dass dieser Konfigurationsparameter nur angepasst werden kann, solange der „ QCanBusDevice “ nicht verbunden ist. Um diesen Konfigurationsparameter festzulegen, wird zur Laufzeit die Bibliothek „libsocketcan“ benötigt: http://www.pengutronix.de/software/libsocketcan In der Regel sind Root-Rechte erforderlich, um die Bitrate des CAN-Busses festzulegen.
QCanBusDevice::CanFdKeyDiese Konfigurationsoption legt fest, ob CANFD-Frames gesendet oder empfangen werden dürfen. Standardmäßig 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 “ festzulegen.
QCanBusDevice::ProtocolKeyErmöglicht die Verwendung eines anderen Protokolls innerhalb der Protokollfamilie PF_CAN. Der Standardwert für diese Konfigurationsoption ist CAN_RAW (1).

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)));

In SocketCAN werden ein erweitertes Rahmenformat und eine flexible Datenrate unterstützt.

SocketCAN unterstützt die folgenden zusätzlichen Funktionen:

© 2026 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.