Bus CAN Qt
Un Controller Area Network (CAN) es un estándar de bus para vehículos diseñado para permitir que microcontroladores y dispositivos se comuniquen entre sí en aplicaciones sin un ordenador central.
Descripción general
Es un protocolo basado en mensajes, diseñado originalmente para el cableado eléctrico multiplexado dentro de los automóviles, pero también se utiliza en muchos otros contextos.
La API del bus CAN proporciona algunas API comunes para acceder a los dispositivos CAN:
- QCanBus proporciona una API para crear un QCanBusDevice a partir de un plugin elegido.
- QCanBusDeviceInfo proporciona información sobre los dispositivos CAN disponibles.
- QCanBusDevice proporciona una API para acceder directamente al dispositivo CAN.
- QCanBusFrame define una trama CAN que puede ser escrita y leída desde QCanBusDevice.
A partir de Qt 6.5, el módulo proporciona APIs para decodificar valores de señales reales de tramas CAN sin procesar y también para codificar datos de usuario en tramas CAN:
- QCanSignalDescription proporciona reglas para procesar señales CAN.
- QCanMessageDescription proporciona reglas para procesar mensajes CAN. Una descripción de mensaje suele contener varias descripciones de señal.
- QCanUniqueIdDescription proporciona reglas para procesar un identificador único dentro de una trama CAN.
- QCanFrameProcessor utiliza descripciones proporcionadas por las clases QCanMessageDescription, QCanSignalDescription, y QCanUniqueIdDescription para codificar o descodificar tramas CAN.
- QCanDbcFileParser proporciona una API para extraer descripciones de mensajes de archivos DBC.
Nota: Todas las API de codificación y descodificación de tramas CAN son experimentales y están sujetas a cambios.
Plugins de bus CAN
Múltiples proveedores proporcionan dispositivos CAN con diferentes APIs de acceso. El módulo QtSerialBus admite los siguientes conjuntos de plugins de bus CAN:
| Proveedor | Plugin (clave) | Breve descripción |
|---|---|---|
| CAN sobre sockets Linux | SocketCAN (socketcan) | Plugin de bus CAN que utiliza sockets Linux y controladores de código abierto. |
| CAN a través de SAE J2534 Pass-Thru | PassThruCAN (passthrucan) | Complemento de bus CAN que utiliza la interfaz SAE J2534 Pass-Thru. |
| Electrónica SYS TEC | SystecCAN (systeccan) | Complemento de bus CAN que utiliza los adaptadores CAN de SYS TEC. |
| Sistema PEAK | PeakCAN (peakcan) | Complemento de bus CAN que utiliza los adaptadores CAN de PEAK. |
| MHS Elektronik | TinyCAN (tinycan) | Complemento de bus CAN que utiliza los adaptadores CAN de MHS. |
| Vector Informática | VectorCAN (vectorcan) | Complemento de bus CAN que utiliza los adaptadores CAN de Vector. |
| Interfaz CAN virtual | VirtualCAN (virtualcan) | Plugin de bus CAN que utiliza una conexión TCP/IP virtual. |
Implementación de un plugin CAN personalizado
Si los plugins proporcionados por Qt no son adecuados para la plataforma de destino requerida, se puede implementar un plugin de bus CAN personalizado. La implementación sigue la forma estándar de implementar plugins de Qt. El plugin personalizado debe desplegarse en $QTDIR/plugins/canbus.
Cada plugin debe definir una clave, que se utiliza para cargar el plugin. Esto se hace a través de un pequeño archivo json. Por ejemplo, el plugin socketcan utiliza la siguiente plugin.json:
{
"Key": "socketcan"
}Esta clave debe pasarse a QCanBus::createDevice() junto con el nombre de la interfaz del adaptador de bus CAN. QCanBus carga e instanciar el plugin utilizando la interfaz QCanBusFactoryV2 que cada plugin debe implementar como punto de entrada central. La interfaz actúa como una fábrica y su único propósito es devolver una instancia de QCanBusDevice. El nombre de la interfaz mencionado anteriormente se pasa a través del método QCanBusFactory::createDevice() de la fábrica. A continuación se muestra la implementación de fábrica del 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; } };
El siguiente paso es proporcionar una implementación de QCanBusDevice. Como mínimo, se deben implementar las siguientes funciones virtuales puras:
- QCanBusDevice::open()
- QCanBusDevice::close()
- QCanBusDevice::writeFrame()
- QCanBusDevice::interpretErrorFrame()
Los métodos open() y close() se utilizan junto con QCanBusDevice::connectDevice() y QCanBusDevice::disconnectDevice() respectivamente. Consulte la documentación de la función para obtener más información.
QCanBusDevice::writeFrame() es responsable de las comprobaciones de sanidad, como la validez de QCanBusFrame y que el dispositivo sigue conectado. Si se superan las comprobaciones, escribe la trama en el bus CAN. En caso de éxito emite la señal QCanBusDevice::framesWritten(); en caso contrario se llama a QCanBusDevice::setError() con un mensaje de error apropiado. Esta función también puede utilizarse para implementar una operación de escritura asíncrona. Es responsabilidad del implementador del plugin emitir las señales apropiadas en el momento adecuado.
Por último, pero no por ello menos importante, QCanBusDevice::interpretErrorFrame proporciona una forma cómoda de traducir el contenido de una trama de error de bus CAN a una cadena de error legible por humanos.
© 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.