Sur cette page

Qt CAN Bus

Le réseau CAN (Controller Area Network) est un bus automobile standard conçu pour permettre aux microcontrôleurs et aux appareils de communiquer entre eux dans des applications sans ordinateur hôte.

Vue d'ensemble

Il s'agit d'un protocole basé sur les messages, conçu à l'origine pour le câblage électrique multiplex dans les automobiles, mais qui est également utilisé dans de nombreux autres contextes.

L'API du bus CAN fournit une API commune pour accéder aux dispositifs CAN :

À partir de Qt 6.5, le module fournit des API pour décoder les valeurs réelles des signaux à partir des trames CAN brutes et pour encoder les données utilisateur dans les trames CAN :

Remarque : toutes les API pour le codage et le décodage des trames CAN sont expérimentales et sujettes à modification.

Plugins de bus CAN

De nombreux fournisseurs proposent des dispositifs CAN avec différentes API d'accès. Le module QtSerialBus prend en charge les ensembles suivants de plugins de bus CAN :

FournisseurPlugin (clé)Brève description
CAN sur les sockets LinuxSocketCAN (socketcan)Plugin de bus CAN utilisant des sockets Linux et des pilotes open source.
CAN via SAE J2534 Pass-ThruPassThruCAN (passthrucan)Plugin de bus CAN utilisant l'interface SAE J2534 Pass-Thru.
SYS TEC electronicSystecCAN (systeccan)Backend de bus CAN utilisant les adaptateurs CAN de SYS TEC.
Système PEAKPeakCAN (peakcan)Plugin bus CAN utilisant les adaptateurs CAN PEAK.
MHS ElektronikTinyCAN (tinycan)Plugin de bus CAN utilisant les adaptateurs CAN de MHS.
Vector InformatikVectorCAN (vectorcan)Plugin de bus CAN utilisant les adaptateurs CAN de Vector.
Interface CAN virtuelleVirtualCAN (virtualcan)Plugin de bus CAN utilisant une connexion TCP/IP virtuelle.

Implémentation d'un plugin CAN personnalisé

Si les plugins fournis par Qt ne conviennent pas à la plate-forme cible requise, il est possible d'implémenter un plugin de bus CAN personnalisé. L'implémentation suit la méthode standard d'implémentation des plugins Qt. Le plugin personnalisé doit être déployé sur $QTDIR/plugins/canbus.

Chaque plugin doit définir une clé, qui est utilisée pour charger le plugin. Cela se fait par l'intermédiaire d'un petit fichier json. Par exemple, le plugin socketcan utilise la clé suivante : plugin.json:

{
    "Key": "socketcan"
}

Cette clé doit être transmise à QCanBus::createDevice() avec le nom de l'interface de l'adaptateur de bus CAN. QCanBus charge et instancie le plugin en utilisant l'interface QCanBusFactoryV2 que chaque plugin doit implémenter comme point d'entrée central. L'interface agit comme une usine et son seul but est de retourner une instance QCanBusDevice. Le nom de l'interface mentionné ci-dessus est transmis via la méthode QCanBusFactory::createDevice() de la fabrique. Voici l'implémentation de la fabrique du plugin socketcan:

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

L'étape suivante consiste à fournir une implémentation de QCanBusDevice. Au minimum, les fonctions virtuelles pures suivantes doivent être implémentées :

Les méthodes open() et close() sont utilisées en conjonction avec QCanBusDevice::connectDevice() et QCanBusDevice::disconnectDevice() respectivement. Consultez la documentation de la fonction pour plus de détails sur la mise en œuvre.

QCanBusDevice::writeFrameLa méthode () est chargée de vérifier la validité de l'adresse QCanBusFrame et de s'assurer que le périphérique est toujours connecté. Si les contrôles sont réussis, il écrit la trame sur le bus CAN. En cas de succès, elle émet le signal QCanBusDevice::framesWritten() ; dans le cas contraire, QCanBusDevice::setError() est appelé avec un message d'erreur approprié. Cette fonction peut également être utilisée pour mettre en œuvre une opération d'écriture asynchrone. Il est de la responsabilité de l'implémenteur du plugin d'émettre les signaux appropriés au moment opportun.

Enfin, QCanBusDevice::interpretErrorFrame offre un moyen pratique de traduire le contenu d'une trame d'erreur du bus CAN en une chaîne d'erreur lisible par l'homme.

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