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 250000Um „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 100CAN-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 onEinrichten 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 72Die 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 vcan0Erstellen 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 Konfigurationsparameter | Beschreibung |
|---|---|
| QCanBusDevice::LoopbackKey | Um 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::ReceiveOwnKey | Der 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::ErrorFilterKey | Ein 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::RawFilterKey | Diese Konfiguration kann mehrere Filter vom Typ „ QCanBusDevice::Filter “ enthalten. Standardmäßig ist die Verbindung so konfiguriert, dass sie alle CAN-Bus-Nachrichten akzeptiert. |
| QCanBusDevice::BitRateKey | Legt 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::CanFdKey | Diese 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::DataBitRateKey | Diese 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::ProtocolKey | Ermö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:
- QCanBusDevice::resetController() (erfordert libsocketcan)
- QCanBusDevice::busStatus() (erfordert libsocketcan)
© 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.