QT CAN编程2 - SocketCAN插件使用
QT - SocketCAN插件使用
SocketCAN插件封装了用于访问CAN设备的Linux套接字API。该API是一组由大众汽车研究公司(Volkswagen Research)向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
sudo ip link set can0 up
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 发送带有标志BRS和EFI的CAN FD消息
cansend vcan0 123##3112233445566778899aabbccddeeff
# Generate random CAN messages 生成随机的CAN消息
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总线的所有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 通常,需要root用户权限来设置CAN总线比特率。 |
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)