Qt CAN总线
控制器局域网(CAN)是一种汽车总线标准,它允许微控制器和设备在没有主机计算机的应用程序中进行通信。
概述
它是一种基于消息的协议,最初设计用于汽车内多路电气布线的多功能,但也用于许多其他环境。
CAN总线API提供了一些公共API,用于访问CAN设备
- QCanBus提供了一个API,可以从选择的插件创建一个QCanBusDevice。
- QCanBusDeviceInfo提供了有关可用CAN设备的信息。
- QCanBusDevice为直接访问CAN设备提供了API。
- QCanBusFrame定义了一个可以从QCanBusDevice写入和读取的CAN帧。
从Qt 6.5开始,该模块提供了API来解码原始CAN帧中的实际信号值,并将用户数据编码到CAN帧中
- QCanSignalDescription提供了处理CAN信号的规则。
- QCanMessageDescription提供了处理CAN消息的规则。消息描述通常包含多个信号描述。
- QCanUniqueIdDescription提供了处理CAN帧内唯一标识符的规则。
- QCanFrameProcessor使用QCanMessageDescription、QCanSignalDescription和QCanUniqueIdDescription类提供的描述来编码或解码CAN帧。
- QCanDbcFileParser提供了一个API,可用于从DBC文件中提取消息描述。
注意:所有编码和解码CAN帧的API都是实验性的,并可能发生变化。
CAN总线插件
多个供应商提供了具有不同API访问的CAN设备。QtSerialBus模块支持以下CAN总线插件集
供应商 | 插件(键) | 简要描述 |
---|---|---|
CAN通过Linux套接字 | SocketCAN (socketcan ) | 使用Linux套接字和开源驱动程序的CAN总线插件。 |
CAN通过SAE J2534 Pass-Thru | PassThruCAN (passthrucan ) | 使用SAE J2534 Pass-Thru接口的CAN总线插件。 |
SYS TEC电子 | SystecCAN (systeccan ) | 使用SYS TEC CAN适配器的CAN总线后端。 |
PEAK-System | PeakCAN (peakcan ) | 使用PEAK CAN适配器的CAN总线插件。 |
MHS电子 | TinyCAN (tinycan ) | 使用MHS CAN适配器的CAN总线插件。 |
Vector Informatik | VectorCAN (vectorcan ) | 使用Vector CAN适配器的CAN总线插件。 |
虚拟CAN接口 | VirtualCAN (virtualcan ) | 使用虚拟TCP/IP连接的CAN总线插件。 |
实现自定义CAN插件
如果Qt提供的插件不适合所需的平台,可以实现自定义的CAN总线插件。实现方式遵循实现Qt插件的标准方式。自定义插件必须部署到$QTDIR/plugins/canbus
。
每个插件必须定义一个键,该键用于加载插件。这通过一个小的json文件完成。例如,socketcan插件使用以下plugin.json
文件
{ "Key": "socketcan" }
此键必须与CAN总线适配器的接口名称一起传递给QCanBus::createDevice()。QCanBus通过QCanBusFactoryV2接口加载数据和实例化插件,该接口是每个插件必须实现的主要入口点。该接口作为工厂使用,它的唯一目的是返回一个QCanBusDevice实例。下面是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; } };
下一步是提供QCanBusDevice的一个实现。至少需要实现以下纯虚函数
- QCanBusDevice::open()
- QCanBusDevice::close()
- QCanBusDevice::writeFrame()
- QCanBusDevice::interpretErrorFrame()
方法的open和close与QCanBusDevice::connectDevice和QCanBusDevice::disconnectDevice配合使用。请检查函数文档以获取实现细节。
QCanBusDevice::writeFrame()负责进行如QCanBusFrame的有效性和设备是否仍然连接的健全性检查。如果所有检查通过,它将帧写入CAN总线。成功时发出QCanBusDevice::framesWritten()信号;否则调用QCanBusDevice::setError()并带上合适的错误信息。此函数还可以用来实现异步写入操作。插件实现者负责在适当的时间发出合适的信号。
最后但同样重要的是,QCanBusDevice::interpretErrorFrame提供了一个方便的API,将CAN总线错误帧的内容转换为人类可读的错误字符串。
© 2024 The Qt Company Ltd. 这里包含的文档贡献权归各自所有者所有。这里提供的文档是根据Free Software Foundation发布的GNU自由文档许可协议版本1.3条款许可的。Qt和相关标志是The Qt Company Ltd在芬兰和其他国家/地区的商标。所有其他商标均为各自所有者的财产。