Auf dieser Seite

Qt-CAN-Bus

Ein Controller Area Network (CAN) ist ein Fahrzeugbus-Standard, der es Mikrocontrollern und Geräten ermöglicht, in Anwendungen ohne Host-Computer miteinander zu kommunizieren.

Übersicht

Es handelt sich um ein nachrichtenbasiertes Protokoll, das ursprünglich für die Multiplex-Verkabelung in Kraftfahrzeugen entwickelt wurde, aber auch in vielen anderen Bereichen zum Einsatz kommt.

Die CAN-Bus-API stellt einige gängige Schnittstellen für den Zugriff auf CAN-Geräte bereit:

Ab Qt 6.5 bietet das Modul APIs zum Dekodieren tatsächlicher Signalwerte aus rohen CAN-Frames sowie zum Kodieren von Benutzerdaten in CAN-Frames:

Hinweis: Alle APIs zum Kodieren und Dekodieren von CAN-Frames sind experimentell und können sich ändern.

CAN-Bus-Plugins

Mehrere Anbieter stellen CAN-Geräte mit unterschiedlichen APIs für den Zugriff bereit. Das Modul „ QtSerialBus “ unterstützt die folgenden Gruppen von CAN-Bus-Plugins:

AnbieterPlugin (Schlüssel)Kurzbeschreibung
CAN über Linux-SocketsSocketCAN (socketcan)CAN-Bus-Plugin unter Verwendung von Linux-Sockets und Open-Source-Treibern.
CAN über SAE J2534 Pass-ThruPassThruCAN (passthrucan)CAN-Bus-Plugin mit der SAE J2534 Pass-Thru-Schnittstelle.
SYS TEC electronicSystecCAN (systeccan)CAN-Bus-Backend unter Verwendung der SYS TEC-CAN-Adapter.
PEAK-SystemPeakCAN (peakcan)CAN-Bus-Plugin unter Verwendung der PEAK-CAN-Adapter.
MHS ElektronikTinyCAN (tinycan)CAN-Bus-Plugin unter Verwendung der MHS-CAN-Adapter.
Vector InformatikVectorCAN (vectorcan)CAN-Bus-Plugin unter Verwendung der Vector-CAN-Adapter.
Virtuelle CAN-SchnittstelleVirtualCAN (virtualcan)CAN-Bus-Plugin unter Verwendung einer virtuellen TCP/IP-Verbindung.

Implementierung eines benutzerdefinierten CAN-Plugins

Sollten die von Qt bereitgestellten Plugins für die gewünschte Zielplattform nicht geeignet sein, kann ein benutzerdefiniertes CAN-Bus-Plugin implementiert werden. Die Implementierung folgt dem Standardverfahren zur Implementierung von Qt-Plugins. Das benutzerdefinierte Plugin muss unter $QTDIR/plugins/canbus bereitgestellt werden.

Jedes Plugin muss einen Schlüssel definieren, der zum Laden des Plugins verwendet wird. Dies erfolgt über eine kleine JSON-Datei. Das „socketcan“-Plugin verwendet beispielsweise den folgenden „ plugin.json “:

{
    "Key": "socketcan"
}

Dieser Schlüssel muss zusammen mit dem Schnittstellennamen des CAN-Bus-Adapters an ` QCanBus::createDevice()` übergeben werden. ` QCanBus ` lädt und instanziiert das Plugin mithilfe der Schnittstelle `QCanBusFactoryV2`, die jedes Plugin als zentralen Einstiegspunkt implementieren muss. Die Schnittstelle fungiert als Factory und dient ausschließlich dazu, eine „ QCanBusDevice “-Instanz zurückzugeben. Der oben genannte Schnittstellenname wird über die Methode „ QCanBusFactory::createDevice()“ der Factory übergeben. Im Folgenden ist die Factory-Implementierung des „socketcan“-Plugins dargestellt:

class SocketCanBusPlugin : public QObject, public QCanBusFactory
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json")
    Q_INTERFACES(QCanBusFactory)

public:
    QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override
    {
        Q_UNUSED(errorMessage);
        return SocketCanBackend::interfaces();
    }

    QCanBusDevice *createDevice(const QString &interfaceName, QString *errorMessage) const override
    {
        Q_UNUSED(errorMessage);
        auto device = new SocketCanBackend(interfaceName);
        return device;
    }
};

Der nächste Schritt besteht darin, eine Implementierung von ` QCanBusDevice` bereitzustellen. Zumindest müssen die folgenden rein virtuellen Funktionen implementiert werden:

Die Methoden „ open “ () und „ close “ () werden jeweils in Verbindung mit „ QCanBusDevice::connectDevice “ () bzw. „ QCanBusDevice::disconnectDevice “ () verwendet. Einzelheiten zur Implementierung finden Sie in der Funktionsdokumentation.

QCanBusDevice::writeFrame() ist für Plausibilitätsprüfungen zuständig, wie z. B. die Gültigkeit von ` QCanBusFrame ` und die Überprüfung, ob das Gerät noch angeschlossen ist. Sofern die Prüfungen erfolgreich waren, schreibt es den Frame auf den CAN-Bus. Bei Erfolg gibt sie das Signal „ QCanBusDevice::framesWritten “ () aus; andernfalls wird „ QCanBusDevice::setError “ () mit einer entsprechenden Fehlermeldung aufgerufen. Diese Funktion kann auch zur Implementierung eines asynchronen Schreibvorgangs verwendet werden. Es liegt in der Verantwortung der Plugin-Implementierer, die entsprechenden Signale zum richtigen Zeitpunkt auszugeben.

Nicht zuletzt bietet „ QCanBusDevice::interpretErrorFrame “ eine bequeme Möglichkeit, den Inhalt eines CAN-Bus-Fehlerframes in eine für Menschen lesbare Fehlerzeichenfolge zu übersetzen.

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