Sur cette page

Bus CAN Qt

Un réseau CAN (Controller Area Network) est une norme de bus automobile conçue pour permettre aux microcontrôleurs et aux périphériques de communiquer entre eux dans des applications ne disposant pas d’ordinateur hôte.

Présentation

Il s'agit d'un protocole basé sur des 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 des interfaces communes pour accéder aux périphériques CAN :

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

Remarque : toutes les API d’encodage et de décodage des trames CAN sont expérimentales et susceptibles d’être modifiées.

Plug-ins de bus CAN

Plusieurs fournisseurs proposent des périphériques CAN dotés d’API d’accès variées. Le module QtSerialBus prend en charge les ensembles suivants de plugins de bus CAN :

FournisseurPlugin (clé)Brève description
CAN via 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.
PEAK-SystemPeakCAN (peakcan)Module d'extension pour bus CAN utilisant les adaptateurs CAN de 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 bus CAN utilisant une connexion TCP/IP virtuelle.

Implémentation d’un plug-in CAN personnalisé

Si les plug-ins fournis par Qt ne sont pas adaptés à la plate-forme cible requise, il est possible d’implémenter un plug-in de bus CAN personnalisé. L’implémentation suit la procédure standard d’implémentation des plug-ins Qt. Le plug-in personnalisé doit être déployé sur $QTDIR/plugins/canbus.

Chaque plugin doit définir une clé, qui sert à charger le plugin. Cela s'effectue via 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 plug-in à l’aide de l’interface `QCanBusFactoryV2`, que chaque plug-in doit implémenter en tant que point d’entrée central. L’interface fait office d’usine et son seul but est de renvoyer une instance de ` QCanBusDevice `. Le nom d’interface mentionné ci-dessus est transmis via la méthode ` QCanBusFactory::createDevice()` de l’usine. Voici l’implémentation de l’usine 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 respectivement en conjonction avec ` QCanBusDevice::connectDevice()` et ` QCanBusDevice::disconnectDevice()`. Consultez la documentation des fonctions pour plus de détails sur leur implémentation.

QCanBusDevice::writeFrame() est chargée des vérifications de cohérence, telles que la validité de l'QCanBusFrame et la connexion du périphérique. Si les vérifications sont réussies, elle écrit la trame sur le bus CAN. En cas de succès, elle émet le signal QCanBusDevice::framesWritten() ; dans le cas contraire, la fonction QCanBusDevice::setError() est appelée avec un message d’erreur approprié. Cette fonction peut également être utilisée pour implémenter une opération d’écriture asynchrone. Il incombe aux développeurs du plugin d’émettre les signaux appropriés au moment opportun.

Enfin, la fonction ` 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’utilisateur.

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