使用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::ErrorFilterKey | CAN接口驱动可以生成所谓的“错误消息帧”,可以像其他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支持以下附加功能
- QCanBusDevice::resetController()(需要libsocketcan)
- QCanBusDevice::busStatus()(需要libsocketcan)
© 2024 Qt公司有限。本文档贡献的版权属于各自的所有者。本文档受免费软件基金会发布的GNU自由文档许可协议版本1.3的条款约束。Qt及其相关标志是Qt公司在芬兰及/或全球其他国家的商标。所有其他商标均为其各自所有者的财产。