En esta página

Uso del plugin SocketCAN

El plugin SocketCAN encapsula la API de sockets de Linux para acceder a los dispositivos CAN. Esta API es un conjunto de controladores CAN de código abierto y una pila de red aportada por Volkswagen Research al kernel de Linux.

Este plugin requiere un Kernel Linux con soporte SocketCAN y controladores de dispositivo SocketCAN para el hardware CAN utilizado.

Uso de SocketCAN

Para listar todas las interfaces de red (incluidas las no configuradas), se puede utilizar el comando ifconfig -a.

Para utilizar SocketCAN, se deben cargar los módulos correspondientes del Kernel de Linux y se debe configurar la interfaz de red.

Configuración del hardware CAN real

En esta sección se asume que el controlador de dispositivo ya está cargado (probablemente de forma automática al conectar el hardware CAN).

Configuración por defecto

Para configurar el dispositivo can0 a una tasa de bits de 250 kBit/s:

sudo ip link set up can0 type can bitrate 250000

Para recuperarse automáticamente de los errores "bus off" después de 100 milisegundos, se puede utilizar el siguiente comando:

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

Ajustes CAN FD

Para ajustar el dispositivo can0 a una velocidad de bits de arbitraje de 500 kBit/s y una velocidad de bits de datos de 4 MBit/s (para tramas con indicador de conmutación de velocidad de bits):

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

Configuración de un bus CAN virtual

Nota: Para el uso de CAN FD, la MTU (unidad de transmisión máxima) debe establecerse en 72 bytes.

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

Los programas de prueba de línea de comandos que se utilizan a continuación proceden del paquete 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

Creación de dispositivos de bus CAN

En primer lugar es necesario comprobar que QCanBus proporciona el plugin deseado:

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

Donde socketcan es el nombre del plugin.

A continuación, se puede establecer una conexión con una interfaz específica:

QString errorString;QCanBusDevice *device = QCanBus::instance()->createDevice( QStringLiteral("socketcan"), QStringLiteral("can0"), &errorString);if (!device) { // La gestión de errores va aquí    qDebug << errorString;
} else {  device->connectDevice(); }

Donde can0 es el nombre de la interfaz CAN activa. Las interfaces CAN actúan como interfaces de red normales en sistemas Linux y pueden descubrirse utilizando ifconfig. Además, el método availableDevices() devuelve una lista de los dispositivos disponibles actualmente.

El dispositivo está ahora abierto para escribir y leer tramas CAN:

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

La lectura puede realizarse mediante el método readFrame(). La señal framesReceived() se emite cuando al menos una nueva trama está disponible para su lectura:

QCanBusFrame frame = device->readFrame();

SocketCAN soporta las siguientes configuraciones que pueden ser controladas a través de setConfigurationParameter():

Clave del parámetro de configuraciónDescripción
QCanBusDevice::LoopbackKeyPara satisfacer las necesidades de múltiples usuarios, el bucle de retorno local está activado por defecto. Esto significa que cada vez que se transmite una trama CAN en el bus CAN, se envía un eco local de esta trama a todas las aplicaciones conectadas a este dispositivo CAN. Si esta opción está activada, las tramas así recibidas se marcan con QCanBusFrame::hasLocalEcho()
QCanBusDevice::ReceiveOwnKeyLa recepción de las tramas CAN en el mismo socket que estaba enviando la trama CAN está desactivada por defecto. Al activar esta opción, todas las tramas CAN enviadas al bus CAN aparecen inmediatamente en el búfer de recepción. Esto se puede utilizar para comprobar si el envío se ha realizado correctamente. Si esta opción está habilitada, las tramas por tanto recibidas se marcan con QCanBusFrame::hasLocalEcho()
QCanBusDevice::ErrorFilterKeyUn controlador de interfaz CAN puede generar las denominadas tramas de mensajes de error que, opcionalmente, pueden pasarse a la aplicación de usuario del mismo modo que otras tramas CAN. Los posibles errores se dividen en diferentes clases de error que pueden filtrarse utilizando la máscara de error apropiada. Los valores para la máscara de error se definen en linux/can/error.h.
QCanBusDevice::RawFilterKeyEsta configuración puede contener múltiples filtros del tipo QCanBusDevice::Filter. Por defecto, la conexión está configurada para aceptar cualquier mensaje de bus CAN.
QCanBusDevice::BitRateKeyDetermina la velocidad de bits de la conexión de bus CAN. Se admiten las siguientes velocidades de bits 5000, 10000, 20000, 33000, 47000, 50000, 83000, 95000, 100000, 125000, 250000, 500000, 800000, 1000000. Tenga en cuenta que este parámetro de configuración sólo puede ajustarse mientras QCanBusDevice no está conectado. Para ajustar este parámetro de configuración, se necesita la librería libsocketcan en tiempo de ejecución http://www.pengutronix.de/software/libsocketcan Normalmente, se necesitan derechos de root para ajustar la tasa de bits del bus CAN.
QCanBusDevice::CanFdKeyEsta opción de configuración determina si se pueden enviar o recibir tramas CANFD. Por defecto, esta opción está desactivada. Controla la opción CAN_RAW_FD_FRAMES del socket CAN.
QCanBusDevice::DataBitRateKeyEsta configuración no está soportada por el plugin socketcan. Sin embargo, es posible establecer la velocidad de transmisión de datos al configurar la interfaz de red CAN mediante el comando ip link.
QCanBusDevice::ProtocolKeyPermite utilizar otro protocolo dentro de la familia de protocolos PF_CAN. El valor por defecto para esta opción de configuración es CAN_RAW (1).

Por ejemplo:

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

SocketCAN admite un formato de trama ampliado y una velocidad de transmisión de datos flexible.

SocketCAN admite las siguientes funciones adicionales:

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