Qt CAN总线

控制器局域网(CAN)是一种汽车总线标准,它允许微控制器和设备在没有主机计算机的应用程序中进行通信。

概述

它是一种基于消息的协议,最初设计用于汽车内多路电气布线的多功能,但也用于许多其他环境。

CAN总线API提供了一些公共API,用于访问CAN设备

从Qt 6.5开始,该模块提供了API来解码原始CAN帧中的实际信号值,并将用户数据编码到CAN帧中

注意:所有编码和解码CAN帧的API都是实验性的,并可能发生变化。

CAN总线插件

多个供应商提供了具有不同API访问的CAN设备。QtSerialBus模块支持以下CAN总线插件集

供应商插件(键)简要描述
CAN通过Linux套接字SocketCAN (socketcan)使用Linux套接字和开源驱动程序的CAN总线插件。
CAN通过SAE J2534 Pass-ThruPassThruCAN (passthrucan)使用SAE J2534 Pass-Thru接口的CAN总线插件。
SYS TEC电子SystecCAN (systeccan)使用SYS TEC CAN适配器的CAN总线后端。
PEAK-SystemPeakCAN (peakcan)使用PEAK CAN适配器的CAN总线插件。
MHS电子TinyCAN (tinycan)使用MHS CAN适配器的CAN总线插件。
Vector InformatikVectorCAN (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的一个实现。至少需要实现以下纯虚函数

方法的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在芬兰和其他国家/地区的商标。所有其他商标均为各自所有者的财产。