1、在利用Python和Kvaser进行二次开发时,Kvaser官方提供了可以解析原始CAN报文的Python模块 canlib.kvadblib,使用方法如下:

 // pythonmydbc = kvadblib.Dbc("mydbc.dbc")...frame = ch.read(timeout=int(timeout * 1000))bmsg = db.interpret(frame)for bsig in bmsg:bsig.name    #  信号名bsig.value   #  信号物理值

但是,在利用C++进行开发时,我并没有找到可以实现对原始CAN报文进行解析的接口函数(如果您知道相应的接口,还望留言告知),所以自己写了一个。

2、解析原始CAN报文的C++类定义

// 定义原始CAN报文 (沿用Kvaser例程中的定义)
typedef struct {unsigned char data[8];unsigned int dlc;unsigned int flag;unsigned long time;long id;
} CanMessage;// 定义翻译后的CAN报文
struct translatedMsg
{string id; // 报文的IDvector<string> can_signals; // 报文中的信号名称列表vector<double> values; // 与信号名称列表对应的,信号的物理值
};// 定义DBC文件中的message信息
struct message {string msgName; // 报文的名称string ID; // 报文的IDvector<Signal> can_signals; // 报文中的所有信号void reset() {msgName = "";ID = "";can_signals = {};}
};// 定义message中的Signal
class Signal {
public:// Parametersstring SigName; // 信号的名称string Unit; // 单位uint8 StartBit; // 起始bit位uint8 BitLength; // 长度bool ByteOrder; // true: @0 Motorola; false: @1 Intelbool ValueType; // true: + Unsigned; false: - Signeddouble Factor;double Offset;double PhyValue;uint RawValue;uint8 msb;uint8 lsb;// Functions// 默认构造函数Signal() = default;// 利用信号的名称、长度、起始位、byteOrder类型、信号类型(signed/unsigned)、精度、offset等构造Signal对象Signal(string name, uint8 length, uint8 startBit, bool byteOrder, bool valueType, double factor, double offset);// 给定原始data数据,翻译出Signal的物理值PhyValuevoid getPhyValue(uint8 data[8]);private:// Parametersuint8 StartByte; // startbit所在的Byte,MsbByte或LsbByteuint8 MsbByte; // MSB所在的Byteuint8 LsbByte; // LSB所在的Byteuint8 MsbBit_in_byte; // msb在该Byte中的位置uint8 LsbBit_in_byte; // lsb在该Byte中的位置uint8 LSBByteBitUsed;  // msb所在Byte中,有MsbBit_in_byte个bit被该Signal占用uint8 MSBByteBitUsed;  // lsb所在Byte中,有LsbBit_in_byte个bit被该Signal占用// Functionsvoid getMsbLsb();uint8 getByteLocation(uint8 bit);uint getRawValue(uint8 data[8]);uint8 getBit_inByte(uint8 bitLocation, uint8 byteLocation);uint8 getByteRaw(uint8 ByteDate, uint8 StartBit, int8 EndBit);
};// 定义DBC类,该类可以利用给定的DBC文件,对原始的CAN报文进行解析
class DBC : public QThread  // DBC继承自QThread,以便在单独的线程中进行报文解析
{Q_OBJECT  // 为了使用Qt的信号和槽机制,必须在定义类的初始位置添加此语句
public:DBC() = default;DBC(string File); // File形如"D:\\mydbc.dbc"string file; // DBC文件的绝对路径,形如"D:\\mydbc.dbc"void run();void stopRunning();void getInfo(); //用于获得DBC文件的信息string file;vector<message> Messages; // DBC文件中包含的所有messagetranslatedMsg tMsg;public slots:void translateRawMsg(CanMessage msg); // 槽函数,用于翻译接收到的原始CAN报文
private:void translate(string id, uint8 data[8], translatedMsg & tMsg); // 内部函数,被槽函数translateRawMsg调用,并将翻译后的CAN信息拷贝给tMsg。
signals:void sentTranslatedMsg(translatedMsg tMsg); // 该信号,负责将tMsg传递给该信号所连接的槽函数
}

Kvaser、C++、Qt编写监控界面(三)相关推荐

  1. 利用kvaser和Python编写监控界面(1)

    连接Kvaser,输出设备的连接状态 1.首先,在Kvaser官网下载pycanlib.zip并解压 2.然后,在命令行窗口进入pycanlib的解压路径.利用pip install canlib-x ...

  2. Qt编写主界面顶部和左侧导航

    界面效果: 资源文件 :  Qt编写主界面顶部和左侧导航代码及资源文件 (http://www.qtcn.org/bbs/read-htm-tid-65515.html) 1.工程目录 2.main. ...

  3. Qt编写监控Onvif综合示例(支持云台/预置位/抓图/事件订阅等)

    一.功能特点 广播搜索设备,支持IPC和NVR,依次返回. 可选择不同的网卡IP进行对应网段设备的搜索. 依次获取Onvif地址.Media地址.Profile文件.Rtsp地址. 可对指定的Prof ...

  4. Qt编写的开源帖子集合(懒人专用)

    回顾自己学习Qt以来九年了,在这九年多时间里面,从本论坛学习不到不少的东西,今天特意整了一下自己开源过的资源的帖子,整理一起方便大家直接跳转下载,不统计不知道,一统计吓一跳,不知不觉开源了这么多代码, ...

  5. Qt编写项目作品大全(自定义控件+输入法+大屏电子看板+视频监控+楼宇对讲+气体安全等)...

    一.自定义控件大全 (一).控件介绍 超过150个精美控件,涵盖了各种仪表盘.进度条.进度球.指南针.曲线图.标尺.温度计.导航条.导航栏,flatui.高亮按钮.滑动选择器.农历等.远超qwt集成的 ...

  6. Qt编写安防视频监控系统(支持win/linux/mac/海康/大华/宇视/264/265等)

    一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...

  7. Qt编写安防视频监控系统18-云台控制

    一.前言 云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂 ...

  8. Qt编写视频监控管理平台(支持海康/大华/宇视/华为/天地伟业/H264/H265等)

    一.前言 海康大华等厂家自己的客户端软件,基本上都是支持自家的设备,不支持其他家的摄像机和硬盘录像机,并不是因为技术上做不到,这些大厂要实现支持兼容其他的家的(他们家的服务端或者收费的都是支持其他家的 ...

  9. Qt编写安防视频监控系统65-子模块9数据调试

    一.前言 数据调试模块,用于显示通信串口的数据,自定义不同颜色显示,可以勾选过滤某个串口进行数据查看,也可以选择所有数据,还可以勾选暂停显示复选框用来暂停打印显示信息.数据调试可以很方便的查看串口收发 ...

  10. Qt编写安防视频监控系统68-兼容Qt4到Qt6

    一.前言 为了从Qt4.7兼容到Qt6.2及后续版本,着实花了不少精力,前提也是对自定义控件大全和各种跨平台的轮子组件全部做成了兼容Qt4到Qt6,这样只剩下UI这块需要兼容就好办多了,各个击破战略, ...

最新文章

  1. 从jQuery的缓存到事件监听
  2. 标准功能模块组件 -- 内部联络单组件,内部邮件组件,提高多人异地协同办公效率...
  3. 【Android 逆向】修改 Android 系统文件 ( Android 逆向中需要经常修改的文件和目录 | 在 root 后的设备中获取 / 目录的 rw 权限后注意事项 )
  4. python常用单词下载_python编程词汇
  5. hdu 2196(经典树形dp)
  6. pip更换源 windows10_Conda及Pip换源处理
  7. Android开发之选项菜单(optinosMenu)
  8. P1850-换教室【数学期望,dp,Floyd】
  9. 校招刷题---java选择题笔记05
  10. leetcode刷题笔记(3)(python)
  11. Asp.net实现MVC处理文件的上传下载删除功能实例教程
  12. 计算机验收标准和验收方法,【超详细】综合布线系统验收标准及内容
  13. 一只小野鸭的超能量(超有启发性)
  14. 华为OD机试真题目录(Java JavaScript)
  15. nginx配置前端网站
  16. R作图配色---颜色提取及色彩搭配
  17. PspTerminateProcess 结束冰刃进程
  18. c++ 实现计算立方体面积体积 并 判断两个立方体是否相等 (类和对象学习)
  19. 如何在linux服务器下载文件夹,linux服务器怎么下载文件到本地
  20. jsp servlet mysql项目_JSP+Servlet+JDBC+mysql实现的个人日记本系统

热门文章

  1. 高通平台Android源码bootloader分析之sbl1(二)
  2. Apache HttpClient4使用教程
  3. 使用srvany.exe把程序安装成windows服务
  4. matlab gui图标,matlab GUI
  5. win10、win7安装SQLServer2000最详细教程
  6. Echart词云图自定义形状,少词显示不全,配置项相关设置
  7. 基于单片机的温度监测系统设计(#0411)
  8. Three.js编辑器editor使用详解
  9. EDEM - Fluent - CFD风道耦合
  10. 计算机考试模拟软件双击为什么打不开,win7系统双击“计算机”打不开的解决方法...