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。

  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/schyzhkj/p/13044962.html
Copyright © 2011-2022 走看看