Sur cette page

Utilisation du plugin SocketCAN

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

Ce plugin nécessite un noyau Linux supportant SocketCAN et des pilotes de périphériques SocketCAN pour le matériel CAN utilisé.

Utilisation de SocketCAN

Pour lister toutes les interfaces réseau (y compris celles qui ne sont pas configurées), la commande ifconfig -a peut être utilisée.

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 suppose 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 régler le périphérique can0 sur un débit de 250 kBit/s :

sudo ip link set up can0 type can bitrate 250000

Pour récupérer automatiquement les erreurs "bus off" après 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 régler le périphérique can0 sur un débit d'arbitrage de 500 kBit/s et un débit de données de 4 MBit/s (pour les trames avec drapeau de commutation 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 de CAN FD, le MTU (Maximum Transmission Unit) doit être réglé 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 dans ce qui suit 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 dispositifs de bus CAN

Dans un premier temps, il est nécessaire de vérifier que QCanBus fournit le plugin souhaité :

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

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 se fait ici    qDebug << errorString;
} else {  device->connectDevice() ; }

can0 est le nom de l'interface CAN active. Les interfaces CAN agissent comme des interfaces réseau normales sur les systèmes Linux et peuvent être découvertes à l'aide de ifconfig. La méthode availableDevices() renvoie également une liste des périphériques actuellement disponibles.

Le périphérique est maintenant ouvert à 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 par la méthode setConfigurationParameter() :

Clé du paramètre de configurationDescription de la configuration
QCanBusDevice::LoopbackKeyPour répondre aux besoins des utilisateurs multiples, le bouclage local est activé 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 dispositif CAN. Si cette option est activée, les trames 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 au bus CAN apparaissent immédiatement dans le tampon de réception. Cela permet de vérifier si l'envoi a réussi. Si cette option est activée, les trames reçues sont marquées par QCanBusFrame::hasLocalEcho()
QCanBusDevice::ErrorFilterKeyUn pilote d'interface CAN peut générer des " Error Message Frames " qui peuvent éventuellement ê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 à l'adresse 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 n'importe quel message du bus CAN.
QCanBusDevice::BitRateKeyDétermine le débit binaire de la connexion au bus CAN. Les débits suivants sont pris en charge : 5000, 10000, 20000, 33000, 47000, 50000, 83000, 95000, 100000, 125000, 250000, 500000, 800000, 1000000. Notez que ce paramètre de configuration ne peut être ajusté que lorsque le site QCanBusDevice n'est pas connecté. Pour définir ce paramètre de configuration, la bibliothèque libsocketcan est nécessaire au moment de l'exécution http://www.pengutronix.de/software/libsocketcan Généralement, les droits de root sont nécessaires pour définir le débit du bus CAN.
QCanBusDevice::CanFdKeyCette option de configuration détermine si des 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 supportée par le plugin socketcan. Cependant, il est 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, la valeur par défaut de cette option de configuration est CAN_RAW (1) :

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