OBD_II协议,CAN总线数据协议,诊断私有协议(个人理解,不对的的地方,请指出)【一】

1. OBD_II协议介绍
          [OBD-II介绍(转)](https://blog.csdn.net/Touxon/article/details/109185559)
          ISO 9141-2 ,4 ISO 14230-4 , ISOSAE J1850,ISO 15765-4
 2. OBD_II读故障码
            服务$03-请求与排放有关的诊断故障码.
            服务$07-请求当前或最后完成的驾驶循环中与排放有关的诊断故障码
            服务$0A-请求与排放有关的永久状态诊断故障码(在上面新增:ISO 15765-4 义 诊断服务定义)
          [故障码库(转)](http://www.360doc.com/content/10/1215/22/4685270_78518591.shtml)
          [识别故障码干货(转)](https://www.sohu.com/a/254819660_428861)
          OBD_II故障码主要是针对发动机的故障码库(P码),汽车里面有PBCU码,分别对应关系是
          P码:发动机故障码
          B码:车身故障码
          C码:底盘相关故障码
          U码:网关相关的故障码
          例子:
          P0002:燃油量调节器控制 -电路范围/性能故障
          kwp2000协议(ISO14229)
          TX:80(帧头) 10(目标地址) f1(源地址) 01(有效数据长度) 03(服务ID) CS(检验和)
          RX:80(帧头) F1(目标地址) 10(源地址) 03(有效数据长度) 43(服务ID的肯定回答) [02  00](具体数据)  CS(检验和)
        RX的有效数据:第一位的高4位 :0--3:显示P码   4--7:显示B码(第一个数据减去0x40)   8--11:显示C码(第一个数据减去0x80)   12-15:显示U码(第一个数据减去0xC0)   
        依上面的逻辑读取的故障码是P0200,查询故障码库可以发现故障码是"燃油量调节器控制 -电路范围/性能故障"
        如果返回的有效数据:[42 00],故障码显示为B0200(0x42-0x40=0x02),具体什么意义需要去故障码表中查询
        
 3. 清除故障码
     服务$04-清除/复位与排放有关的诊断信息
     命令:
     TX:80(帧头) 10(目标地址) f1(源地址) 01(有效数据长度) 04(服务ID) CS(检验和)
     RX:80(帧头) F1(目标地址) 10(源地址) 01(有效数据长度) 44(服务ID的肯定回答) CS(检验和)
    
 4. 读数据流
     服务$01-请求当前动力系统诊断数据.
     局部ID:外部测试设备请求来自车辆的支持的 PID($00,$20,$40,$60,$80,$A0)
     ![询问请求ID](https://img-blog.csdnimg.cn/150af2eff8df4d8da31d10607da6ec79.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YiY5a2m5LiK,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
    实车采集的数据:
    08 07 DF 02 01 00 00 00 00 00 00 ;Times: 2931644 us SID 01 PID 00    
     08 07 E8 06 41 00 BE 1F A8 13 00 ;Times: 899 us             //BE 1F A8 13            
 
     08 07 DF 02 01 10 00 00 00 00 00 ;Times: 141329 us     //PID:10 空气流量
     08 07 E8 04 41 10 00 EA 00 00 00 ;Times: 1031 us 
 
     08 07 DF 02 01 0C 00 00 00 00 00 ;Times: 62966 us         //PID:0C Engine speed 发动机转速
     08 07 E8 04 41 0C 0C B2 00 00 00 ;Times: 532 us 
 
     08 07 DF 02 01 0D 00 00 00 00 00 ;Times: 181738 us     //PID:0D Vehicle speed    车速
     08 07 E8 03 41 0D 00 00 00 00 00 ;Times: 571 us 
 
     08 07 DF 02 01 04 00 00 00 00 00 ;Times: 199405 us     //PID:04 Calculated LOAD Value 引擎负载计算
     08 07 E8 03 41 04 38 00 00 00 00 ;Times: 2485 us 
 
     08 07 DF 02 01 10 00 00 00 00 00 ;Times: 197363 us     //PID:10 空气流量
     08 07 E8 04 41 10 00 DB 00 00 00 ;Times: 1200 us 

命令例子:
        TX:80 10 F1 02 01(SID服务ID) 00(局部ID)  CS
        RX:80  F1 10 06 41(SID服务ID的肯定回答) 00(局部ID) [FF FF FF FF](具体数据) CS
        具体数据是0XFFFFFFFF,则表示0x01~0x20都支持,这里是是从高位到低位
        第一个:0xFF           1        1       1      1         1       1       1         1
                     PID             0x01  0x02  0x03 0x04 0x05   0x06  0x07   0x08
        第二个:0xFF           1        1       1      1         1       1       1         1
                          PID        0x09  0x0A  0x0B 0x0C 0x0D   0x0E  0x0F   0x10    
        第三个:0xFF           1        1       1      1         1       1       1         1
                          PID         0x11  0x12  0x13 0x14 0x15   0x16  0x17   0x18
        第四个:0xFF           1        1       1      1         1       1       1         1
                        PID          0x19  0x1A  0x1B 0x1C 0x1D   0x1E  0x1F   0x20
           
    如果那一位为0,该PID对应的数据ECU(发动机电路板)不支持.
    用于确定支持 PID21-40 的 PID  20  PID
    命令则如下:
    TX:80 10 F1 02 01(SID服务ID) 20(局部ID)  CS
    RX:80  F1 10 06 41(SID服务ID的肯定回答) 20(局部ID) [FF FF FF FF](具体数据) CS
    具体数据是0XFFFFFFFF,则表示0x01~0x20都支持,这里是是从高位到低位
        第一个:0xFF           1        1       1      1         1       1       1         1
                         PID         0x21  0x22  0x23 0x24 0x25   0x26  0x27   0x28
        第二个:0xFF           1        1       1      1         1       1       1         1
                          PID        0x29  0x2A  0x2B 0x2C 0x2D   0x2E  0x2F   0x30    
        第三个:0xFF           1        1       1      1         1       1       1         1
                          PID         0x31  0x32  0x33 0x34 0x35   0x36  0x37   0x38
        第四个:0xFF           1        1       1      1         1       1       1         1
                        PID          0x39  0x3A  0x3B 0x3C 0x3D   0x3E  0x3F   0x40
   
局部和对应的算法:[PID算法(转)](https://wenku.baidu.com/view/4248576e9b89680202d8255f.html)
     ![车速计算](https://img-blog.csdnimg.cn/6c16748e04c74ab2aebeac2eecc0d9ef.png#pic_center)

     TX:08 07 DF 02 01 0D 00 00 00 00 00 ;Times: 181738 us     //PID:0D Vehicle speed    车速
     RX:08 07 E8 【03】(SID+PID+数据长度) 【41 0D】(SID+PID) 【20】(数据) 00 00 00 00 ;Times: 571 us 
          看上面的图片车速是一个字节,则RX里面 0x20,换成10进制,车速就是32,其他的数据也是类似,根据链接中算法来计算

这里文档如下:
    1.OBD_II故障码库
    2.SAE J1979-2007中文.pdf
(未完待续)

你可能感兴趣的:(c++)