作者:良知犹存

转载授权以及围观:欢迎添加微信:becom_me

总述

接上篇文章,本篇继续对基于PID解析数据,如何依据J1979的标准进行解析数据

先给昨天的文章补上一张故障码对照表,昨天分析了如何读取故障码,但是如何把16bit的hex数据转为我们可以解释的故障码,一般各大厂家的维修手册会有显示,第二就是ECU的协议手册里面会进行描述故障码对应的hex数据。

下面就是部分故障码展示:

四、继续读取ECU常用数据

通过服务ID:0x01 读取整车状态数据:

从上面可以看到支持的整车的数据的ID 有0x20 0x40 0xC0打头的整段ID

或者我们也可以通过向ECU发送相应格式的数据,用来解析能够支持的PID有哪些。

TEST->ECU (设备端发往ECU请求读取转速的数据)hex:C2 33 F1 01 0C F3

读取代码如下:仅供参考


__packed typedef struct{
u8 fmt;
u8 tgt;
u8 src;
u8 sid;
}KlineSend;
u8 KLineReadrpm(void)/*读发动机转速*/
{
KLIN_RecOK = 0;
u8* p1;
  KlineSend *p = (KlineSend*)malloc(20);
  
p->fmt = 0xC2;
p->tgt = 0x33;
p->src = 0xF1;
p->sid = 0x01;
p1=(u8*)&(p->sid);
*++p1= 0x0C;
*++p1=CheckSum((u8*)p, sizeof(KlineSend)+1);
SendBuf_KLin((u8*)p, sizeof(KlineSend)+2);

  free(p);
return 0;
}

ECU ->TEST (ECU 应答设备转速的回复)德尔福hex ::C4 F1 11 41 0C 0000 13

BOSH ECU回应数据格式 hex:C4 F1 11 41 0C 0000 13

虽然数据内容有些不同,但是都是符合kwp2000的数据格式,这样对我们来说我们只需要把握数据整体是否能用,再解析关键字即可,不需要一种ECU写一套代码。

其中解析方式可以参照当前协议中ID支持的标准解析方式,我开发的PID都符合J1979的解析方式,所以我就按照如下表进行解析数据。

汽车现在有新的解析标准,大家可以自行查找,这里给大家描述的是一种方法,至于最终开发的产品,请严格按ECU所符合的标准来操作。

同理:车速的读取信息

tester ->德尔福ECU hex:C2 33 F1 01 0D F4

德尔福ECU-> tester hex:83 F1 10 41 0D 23 F5

读取关键词车速为 0x23

BOSH ECU回应格式为 hex:C3 F1 11 41 0D 00 13

读取关键词车速为 0x00

解析判断代码如下:

    u8 ReceiveReadCommData(u8 *p,u8 len)
{
u16 EngRpm,carSpeed;
switch(*++p)//关键字判断
{
case 0x0C:
    {
      EngRpm=((*(((u8*)p)+1))*256+(*(((u8*)p)+2)))/4;

break;
}
case 0x0D:
{
      carSpeed=*(((u8*)p)+1);
break;
}
    default:
break;   }
return 0;
}

但是有些时间我们会遇到读取过来的数据无法使用,那么我们第一要判断的就是否是服务ID不支持,虽然上面可以看到很多ID的解析方式,甚至ECU都会回应你正确的格式,但是有些时候外部接线以及其他原因,我们获得的数据是无法使用的。

比如车速,如果ECU没有此项功能,ECU则会回复0x12否定代码,示例如下:

tester->:C233F1010DF4

ECU ->: 83F1117F011217

但是有些时候,因为一些原因该功能ECU支持信息回复,但是实际上ECU上硬线并没有连接,所以需要我们及时分辨:

五、读取一体的函数结构

加上昨天现在有几个ID的读取了,昨天没有分享读取的总函数,现在展示一下读取执行的总函数:仅供参考

KlinSendTimTypeDefTab KlineSendTimTab[KlineTask] =
{
  { 0, 0, 3   ,  *Tester        },            //用来与ECU保持长连接
{ 0, 0, 1 , *KLineReadrpm },
{ 0, 0, 1 , *KLineReadSpeed},
{ 0, 0, 15 , *ReadDTC },
{ 1, 0, 20 , *KLineDtcClear },
};
u8 KlineScan(void)
{
if(KlinRcvLen()>3)
{ KlineAnalyz(KlinRcvBuff(), KlinRcvLen());//调用串口接收函数
memset((u8*)KlinRcvBuff(),0x00, 0xff);
}
KLIN_RecOK = 0;
KlinClsRecvd();
}
if (KlineSendIndFlag.flag == 0)
{
if (KlineSendIndFlag.init == 1)
{
      printf("Klin_init\r\n");
KlineFastInit();
KlineSendIndFlag.count = 0;
KlineSendIndFlag.src = 600;
KlineSendIndFlag.flag = 1;
      

(KlineSendIndFlag.cnt > 8)? (KlineSendIndFlag.cnt =0):(KlineSendIndFlag.cnt++);
if(KlineSendIndFlag.cnt>3&&KlineSendIndFlag.cnt<6)
{
KlineSendIndFlag.init =1;
KlineSendIndFlag.count = 0;
KlineSendIndFlag.flag =0;
KlineSendIndFlag.sta=0;/*判断为0*/
}
else{
KlinComInit();
      }            

}
else
{
for (char i = 0; i < sizeof(KlineSendTimTab)/sizeof(KlinSendTimTypeDefTab); i++)
{
if (KlineSendTimTab[i].flag == 0)
{
KlineSendTimTab[i].flag = 1;
KlineSendTimTab[i].count = 0;//计算接收时间长度
KlineSendTimTab[i].p() ;

KlineSendIndFlag.flag = 1;
KlineSendIndFlag.count = 0;
if(KlineSendIndFlag.cnt)KlineSendIndFlag.cnt =0; /*转为0*/
break;
}
}
}
  }
return 0;
}

这就是我分享的kwp2000解析,还有很多细节操作,实际开发和文字描述上还是差距很多,如有需要欢迎大家联系我与我交流,添加我的微信:become_me。

更多分享,扫码关注我

Kwp2000协议的应用(程序后续篇)的更多相关文章

  1. Kwp2000协议的应用(程序原理篇)

    作者:良知犹存 转载授权以及围观:欢迎添加微信:becom_me 总述     接上篇文章Kwp2000协议的应用(硬件原理使用篇),本篇针对kwp2000协议标准的服务ID详细介绍,以及针对程序实现 ...

  2. 如何禁止DELETE、PUT、OPTIONS、TRACE、HEAD等协议访问应用程序 .

    原文:http://linder.iteye.com/blog/735435   简介 WebDAV (Web-based Distributed Authoring and Versioning)是 ...

  3. ArcGIS API for Silverlight加载google地图(后续篇)

    原文:ArcGIS API for Silverlight加载google地图(后续篇) 之前在博客中(http://blog.csdn.net/taomanman/article/details/8 ...

  4. Xcode6 运行程序后,右侧Debug区域的Memory显示空白解决方法

    http://chenyh-blog.com/%E8%9B%8B%E7%96%BC%E7%9A%84%E5%86%85%E5%AD%98-%E7%AC%AC%E4%B8%89%E7%AF%87-sdw ...

  5. WPF发布程序后未授予信任的解决办法

    WPF发布程序后未授予信任的解决办法 基于浏览器的WPF应用程序由于需要比较高的操作权限,所以在项目的安全性属性中选择了“这是完全可信的应用程序”选项.可是,在发布部署后,在其他电脑上打开xbap文件 ...

  6. android如何添加桌面图标和卸载程序后自动删除图标

    android如何添加桌面图标和卸载程序后自动删除桌面图标,这是一个应用的安装与卸载过程对桌面图标的操作,下面与大家分享下具体是如何实现的,感兴趣的朋友可以参考下哈 1:创建图标如下 Intent i ...

  7. C#根据域名查询IP(CMD命令参数输入或者启动程序后再输入查询)

    有时因为需要,希望知道域名的IP,那用C#怎么实现呢?以下是实现代码 using System; using System.Collections.Generic; using System.Linq ...

  8. 新建.Net Core应用程序后引用项一直黄色感叹号怎么办?

    我们在vs中创建.Net Core应用程序后,引用项可能出现黄色感叹号,正常情况下,这种黄色感叹号时能在项目创建成功之后迅速消失的,可也有些时候一直不消失,怎么办? 我们可以选中异常的项目,然后右键菜 ...

  9. Windows批处理 调用程序后 不等待子进程 父进程继续执行命令

    从DOS过来的老鸟应该都知道批处理,这个功能在WINDOWS中仍然保留着.批处理 说白了就是把一系列DOS命令写在一个文本文件里,然后把这个文件命名为XXX.bat(WINXP以后的系统也可以命名为* ...

随机推荐

  1. JDK动态代理案例与原理分析

    一.JDK动态代理实现案例 Person接口 package com.zhoucong.proxy.jdk; public interface Person { // 寻找真爱 void findlo ...

  2. TCP VS UDP

    摘要:计算机网络基础 引言 网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP,本文将介绍下这两者以及它们之间的区别. 一.TCP/I ...

  3. Azure Terraform(四)状态文件存储

    一,引言 我们都知道在执行部署计划之后,当前目录中就产生了名叫 "" 的 Terraform 的状态文件,该文件中记录了已部署资源的状态.默认情况下,在执行部署计划后,Terraf ...

  4. CentOS | python3.7安装指南

    前言: centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同 可通过 python --V 或 python --version 查看系统自带的python版本 有一些系统 ...

  5. AvaloniaUI体验

    公司的原有的PC端WPF产品有跨平台需求,无奈微软自己的xamarin对wpf的支持当前尚未达到能支撑产品的成熟度,于是经过搜索,发现了一个号称用WPF实现跨平台的第三方图形库AvaloniaUI. ...

  6. sa-token 之权限验证

    权限验证 核心思想 所谓权限验证,验证的核心就是当前账号是否拥有一个权限码 有:就让你通过.没有:那么禁止访问 再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包括我需要检测的那 ...

  7. Leetcode53. 最大子序列和

    问题 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 代码 贪心算法 核心思想就是检查之前 i-1 的元素和,如果小于零就舍弃--对应下面第六行 ...

  8. SAP中的密码输入框

    在SAP中的密码输入框,可分为两种情况: 1.用selection语句书写的选择屏幕上的密码输入框 实现的方式就是在AT SELECTION-SCREEN OUTPUT事件中写入如下代码: LOOP ...

  9. 1.2V升压5V和2.4V升压5V芯片,适用于镍氢电池产品

    一节镍氢电池1.2V升压5V电路芯片,两节镍氢电池2.4V升压到5V的电源芯片 PW5100具有宽范围的输入工作电压,从很低的0.7V到5V电压. PW5100输出电压固定3V,3.3V,5V可选固定 ...

  10. 手机QQ空间自动点赞登录

    学以致用~使用 Appium 模拟人类操控手机行为 V2.0在手机上运行,目前实现以下功能: 1.小黑屋模式,一分钟内给好友发100条消息然后进了好友的小黑屋 2.定时发消息提醒对象多喝热水~ 3.对 ...