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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容