Sur cette page

Utilisation du plugin SocketCAN

Le plugin SocketCAN encapsule l'API des sockets Linux permettant d'accéder aux périphériques CAN. Cette API est constituée d'un ensemble de pilotes CAN open source et d'une pile réseau fournis par Volkswagen Research au noyau Linux.

Ce plugin nécessite un noyau Linux prenant en charge SocketCAN ainsi que des pilotes de périphériques SocketCAN adaptés au matériel CAN utilisé.

Utilisation de SocketCAN

Pour lister toutes les interfaces réseau (y compris celles qui ne sont pas configurées), vous pouvez utiliser la commande « ifconfig -a ».

Pour utiliser SocketCAN, les modules correspondants du noyau Linux doivent être chargés et l'interface réseau doit être configurée.

Configuration du matériel CAN réel

Cette section part du principe que le pilote de périphérique est déjà chargé (très probablement automatiquement lors de la connexion du matériel CAN).

Paramètres par défaut

Pour configurer le périphérique can0 avec un débit binaire de 250 kbit/s :

sudo ip link set up can0 type can bitrate 250000

Pour récupérer automatiquement après une erreur « bus off » au bout de 100 millisecondes, la commande suivante peut être utilisée :

sudo ip link set up can0 type can bitrate 250000 restart-ms 100

Paramètres CAN FD

Pour configurer le périphérique can0 avec un débit d'arbitrage de 500 kbit/s et un débit de données de 4 Mbit/s (pour les trames avec indicateur de changement de débit) :

sudo ip link set can0 up type can bitrate 500000 dbitrate 4000000 fd on

Configuration d’un bus CAN virtuel

Remarque : pour l'utilisation du protocole CAN FD, la MTU (unité de transmission maximale) doit être réglée sur 72 octets.

sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0 mtu 72

Les programmes de test en ligne de commande utilisés ci-après proviennent du paquet 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

Création de périphériques de bus CAN

Il faut tout d'abord vérifier que QCanBus fournit le plugin souhaité :

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

Où « socketcan » est le nom du plugin.

Ensuite, une connexion à une interface spécifique peut être établie :

QString errorString ;
QCanBusDevice*device = QCanBus::instance()->createDevice(
    QStringLiteral("socketcan"), QStringLiteral("can0"), &errorString);
if (!device) {
    // La gestion des erreurs s'effectue ici
    qDebug << errorString;
} else {
    device->connectDevice();
}

Où can0 est le nom de l’interface CAN active. Les interfaces CAN se comportent comme des interfaces réseau classiques sur les systèmes Linux et peuvent être détectées à l’aide de la commande ` ifconfig`. De plus, la méthode ` availableDevices()` renvoie une liste des périphériques actuellement disponibles.

Le périphérique est désormais ouvert pour l'écriture et la lecture de trames CAN :

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

La lecture peut être effectuée à l’aide de la méthode ` readFrame()`. Le signal ` framesReceived()` est émis lorsqu’au moins une nouvelle trame est disponible pour la lecture :

QCanBusFrame frame = device->readFrame();

SocketCAN prend en charge les configurations suivantes, qui peuvent être contrôlées via la méthode setConfigurationParameter() :

Clé du paramètre de configurationDescription
QCanBusDevice::LoopbackKeyAfin de répondre aux besoins des utilisateurs multiples, la boucle de retour locale est activée par défaut. Cela signifie que chaque fois qu’une trame CAN est transmise sur le bus CAN, un écho local de cette trame est envoyé à toutes les applications connectées à ce périphérique CAN. Si cette option est activée, les trames ainsi reçues sont marquées par QCanBusFrame::hasLocalEcho()
QCanBusDevice::ReceiveOwnKeyLa réception des trames CAN sur le même socket que celui qui a envoyé la trame CAN est désactivée par défaut. Lorsque cette option est activée, toutes les trames CAN envoyées sur le bus CAN apparaissent immédiatement dans le tampon de réception. Cela permet de vérifier si l’envoi a abouti. Si cette option est activée, les trames ainsi reçues sont marquées d’un QCanBusFrame::hasLocalEcho()
QCanBusDevice::ErrorFilterKeyUn pilote d’interface CAN peut générer ce que l’on appelle des trames de message d’erreur qui peuvent, si on le souhaite, être transmises à l’application utilisateur de la même manière que les autres trames CAN. Les erreurs possibles sont réparties en différentes classes d’erreurs qui peuvent être filtrées à l’aide du masque d’erreur approprié. Les valeurs du masque d’erreur sont définies dans linux/can/error.h.
QCanBusDevice::RawFilterKeyCette configuration peut contenir plusieurs filtres de type QCanBusDevice::Filter. Par défaut, la connexion est configurée pour accepter tout message du bus CAN.
QCanBusDevice::BitRateKeyDétermine le débit binaire de la connexion au bus CAN. Les débits binaires suivants sont pris en charge : 5000, 10000, 20000, 33000, 47000, 50000, 83000, 95000, 100000, 125 000, 250 000, 500 000, 800 000, 1 000 000. Notez que ce paramètre de configuration ne peut être modifié que lorsque l’ QCanBusDevice e n’est pas connectée. Pour définir ce paramètre de configuration, la bibliothèque libsocketcan est nécessaire lors de l’exécution http://www.pengutronix.de/software/libsocketcan. En général, des droits d’administrateur sont nécessaires pour définir le débit binaire du bus CAN.
QCanBusDevice::CanFdKeyCette option de configuration détermine si les trames CANFD peuvent être envoyées ou reçues. Par défaut, cette option est désactivée. Elle contrôle l’option CAN_RAW_FD_FRAMES de la socket CAN.
QCanBusDevice::DataBitRateKeyCette configuration n’est pas prise en charge par le plugin socketcan. Il est toutefois possible de définir le débit de données lors de la configuration de l’interface réseau CAN à l’aide de la commande « ip link ».
QCanBusDevice::ProtocolKeyPermet d’utiliser un autre protocole au sein de la famille de protocoles PF_CAN. La valeur par défaut de cette option de configuration est CAN_RAW (1).

Par exemple :

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

Le format de trame étendu et le débit de données flexible sont pris en charge dans SocketCAN.

SocketCAN prend en charge les fonctions supplémentaires suivantes :

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