zoukankan      html  css  js  c++  java
  • 获取CAN报文并解析

    一、获得CAN报文的过程

    准备软硬件环境,硬件周立功CAN卡,软件使用ZLGCANTest,安装在电脑上;通过CAN卡连接整车CAN或者调试端口,通过软件交互界面获取CAN报文。

    二、CAN2.0B报文基本格式

    接收到的报文,是一串十六进制的字符,而报文格式定义和位数是按照二进制定义的。29位扩展标识符,报文帧格式如下图所示。表格中,上面一行为字段代号,下面一行表示字段的位数。SA为报文的源地址,有8位。

    三、报文基本组成

    初始能够获得的是帧ID的一串字符,就是前面的29位扩展标识符,通过帧ID找到目标所在行,进而找到数据段。数据段包含的信息,是我们需要的部分。

    IDENTIFIER 11BITS

    SRR

    IDE

    IDENTIFIER EXTENSION 18BITS

     

    R

    DP

    PDU

    FORMAT(PF)

    SRR

    IDE

    PF

    PDU

    SPECIFIC(PS)

    SOURCE

    ADDRESS(SA)

    3

    2

    1

    1

    1

    8

    7

    6

    5

    4

    3

     

     

    2

    1

    8

    7

    6

    5

    4

    3

    2

    1

    8

    7

    6

    5

    4

    3

    2

    1

    8

    7

    6

    5

    4

    3

    2

    1

    0

    9

    8

     

     

    7

    6

    5

    4

    3

    2

    1

    0

    9

    8

    7

    6

    5

    4

    3

    2

    1

    0

    以上为29 标识符的分配表: 

    其中,优先级为3 位,可以有8 个优先级;R 一般固定为0;DP 现固定为0;8 位的PF 为报文的代码;8 位的PS 为目标地址或组扩展;8 位的SA 为发送此报文的源地址。

    四、数据段的组成

    数据段由8个字节组成,对应通信协议中约定的含义。每个字节有2个字符,前边字符代表高4位,后边字符代表低4位。

    例如,一串报文1818D0F3 ce 0d 00 7d 00 6d 1100(ID是1818D0F3)。第1个字节ce中的c为高4位,e为低4位。如果通讯协议规定,第1、2字节表示总电压,而且注明Byte1为低字节,Byte2为高字节,那么解析时就应该为:0dce。

    例如 :

    OUT

    IN

    ID

    周期

    BMS

    仪表/车载终端

    0x18B1D0F4

    200ms

    位置

    数据名

    备注

    BYTE1

    电池总电压低字节

    0.1V/bit

    数据范围:0-10000(0-1000V)

    BYTE2

    电池总电压高字节

    BYTE3

    电池系统电流低字节

    0.1A/bit, 偏移:-400

    数据范围:0-8000(-400~400A)

    BYTE4

    电池系统电流高字节

    BYTE5

    最高电池温度

    1℃/bit,偏移-40℃

    数据范围:0-250(-40℃-210℃)

    BYTE6

    最低电池温度

    BYTE7

    电池系统剩余电量

    1%/bit, 数据范围:0-100(0-100%)

    BYTE8

    电池系统故障

    见附表4-1

     五、具体CAN报文解析过程

    收到的报文为:1818D0F3 ce 0d 00 7d 00 6d 11 00。

    第一、二字节,协议中规定了,1818D0F3  ID帧内,第一、二字节表示电压,并且,高字节表示高字节表示电压数值的高位,低字节表示电压数值的低位,比例因子0.1V。

    数据中0dce代表总电压,转为十进制为3534,乘以0.1 V的单位,则得到总电压值为353.4 V。

    第三、四字节,协议中规定报文的第三、四字节表示总电流,又总电流的单位为0.1 A,偏移量为32000。数据中7d00转为十进制为32000,乘以0.1再减去3200的偏移量0,则说明此时电池组没有被充电或放电,电流为0。

    第六、七字节,协议中规定报文的第六、七字节表示最高单体电池电压及位置。单体电池电压单位为0.01 V,最高4位代表箱号。数据中116d,其中1代表箱号,即最高电池电压在第1箱。16d代表最高电池电压,转为十进制为365,乘以0.01 A的单位,则得到最高电池电压为3.65 V。

     十六进制转换成十进制数的方法,从最低位开始,16的0次方加第一位+16的1次方加第二位数……比如前文中的116d,最高4位代表箱体编号,16^0+1=1,因此箱体号为1;后面的12位代表单体电压,计算方式(16^0+13)+(16^1+6)+(16^2+1)=365,算式中的13是报文中的d。

  • 相关阅读:
    【Java学习系列】第3课--Java 高级教程
    【夯实PHP基础】nginx php-fpm 输出php错误日志
    【夯实Mysql基础】MySQL性能优化的21个最佳实践 和 mysql使用索引
    【架构设计】分布式文件系统 FastDFS的原理和安装使用
    【13】2016.12.13 周二--《小结2016》
    【诗词歌赋】2016.12.15 周四--文言鸿儒《年终的日常》
    【算法】(查找你附近的人) GeoHash核心原理解析及代码实现
    【夯实Nginx基础】Nginx工作原理和优化、漏洞
    【夯实PHP基础】PHP的反射机制
    HTML DOM简易学习笔记
  • 原文地址:https://www.cnblogs.com/schyzhkj/p/13044962.html
Copyright © 2011-2022 走看看