QT CAN编程2 - SocketCAN插件使用

2020-04-10  本文已影响0人  YottaYuan

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支持以下附加功能:

上一篇下一篇

猜你喜欢

热点阅读