使用SocketCAN插件

SocketCAN插件封装了用于访问CAN设备的Linux套接字API。这个API是一套由大众汽车研究向Linux内核贡献的开源CAN驱动和网络栈。

此插件需要带有SocketCAN支持的Linux内核以及用于所用CAN硬件的SocketCAN设备驱动程序。

SocketCAN使用

要列出所有(包括未配置的)网络接口,可以使用命令ifconfig -a

要使用SocketCAN,必须加载相应的Linux内核模块并配置网络接口。

设置真实CAN硬件

本节假设设备驱动程序已经加载(最可能是在连接CAN硬件时自动加载)。

默认设置

要将设备can0的比特率设置为250 kBit/s

sudo ip link set up can0 type can bitrate 250000

要自动在100毫秒后从“总线关闭”错误中恢复,可以使用以下命令

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

CAN FD设置

要将设备can0的仲裁比特率设置为500 kBit/s,数据比特率为4 MBit/s(对于有比特率切换标志的帧)

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

设置虚拟CAN总线

注意:对于CAN FD的使用,MTU(最大传输单元)必须设置为72字节。

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

以下使用的命令行测试程序来自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

创建CAN总线设备

首先需要检查QCanBus提供了所需的插件

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

其中socketcan是插件名称。

接下来,可以建立一个到特定接口的连接

QString errorString;
QCanBusDevice *device = QCanBus::instance()->createDevice(
    QStringLiteral("socketcan"), QStringLiteral("can0"), &errorString);
if (!device) {
    // Error handling goes here
    qDebug << errorString;
} else {
    device->connectDevice();
}

其中can0是活动的CAN接口名称。CAN接口在Linux系统中类似于常规网络接口,可以使用ifconfig来发现。还有,availableDevices()方法返回当前可用的设备列表。

设备现在可以用于写入和读取CAN帧

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

可以使用readFrame()方法进行读取。当至少有一个新帧可供读取时,会发出framesReceived()信号

QCanBusFrame frame = device->readFrame();

SocketCAN支持以下配置,可以通过setConfigurationParameter()进行控制

配置参数键描述
QCanBusDevice::LoopbackKey为了满足多用户的需求,本地回环默认启用。这意味着,每当在CAN总线上发送CAN帧时,都会向与该CAN设备连接的所有应用程序发送该帧的本地回显。如果启用此选项,则因此接收到的帧将使用QCanBusFrame::hasLocalEcho()进行标记
QCanBusDevice::ReceiveOwnKey默认禁用在同一套接字接收发送的CAN帧。启用此选项时,发送到CAN总线的所有CAN帧将立即出现在接收缓冲区中。这可以用来检查发送是否成功。如果启用此选项,接收到的帧将以QCanBusFrame::hasLocalEcho()标记
QCanBusDevice::ErrorFilterKeyCAN接口驱动可以生成所谓的“错误消息帧”,可以像其他CAN帧一样可选地传递给用户应用。可能的错误被分为不同的错误类别,这些类别可以使用适当的错误掩码进行过滤。错误掩码的值在linux/can/error.h中定义。
QCanBusDevice::RawFilterKey此配置可以包含多个QCanBusDevice::Filter类型的过滤器。默认配置设置为接受任何CAN总线消息。
QCanBusDevice::BitRateKey确定CAN总线连接的比特率。支持以下比特率:5000、10000、20000、33000、47000、50000、83000、95000、100000、125000、250000、500000、800000、1000000。请注意,此配置参数只能在QCanBusDevice未连接时调整。要设置此配置参数,需要运行时库libsocketcan http://www.pengutronix.de/software/libsocketcan。通常,设置CAN总线比特率需要root权限。
QCanBusDevice::CanFdKey此配置选项确定是否可以发送或接收CANFD帧。默认情况下,此选项已禁用。它控制CAN套接字的CAN_RAW_FD_FRAMES选项。
QCanBusDevice::DataBitRateKey此配置不支持socketcan插件。但是,可以通过使用ip link命令配置CAN网络接口来设置数据速率。
QCanBusDevice::ProtocolKey允许在PF_CAN协议族内使用其他协议。此配置选项的默认值为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)));

SocketCAN支持扩展帧格式和灵活的数据速率。

SocketCAN支持以下附加功能

© 2024 Qt公司有限。本文档贡献的版权属于各自的所有者。本文档受免费软件基金会发布的GNU自由文档许可协议版本1.3的条款约束。Qt及其相关标志是Qt公司在芬兰及/或全球其他国家的商标。所有其他商标均为其各自所有者的财产。