作者:良知犹存

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

总述

    接上篇文章Kwp2000协议的应用(硬件原理使用篇),本篇针对kwp2000协议标准的服务ID详细介绍,以及针对程序实现应答机制,进行介绍。

三、通讯实现过程详解

KWP2000有两种启动方式,5波特率启动和高速启动方式,5波特率基本不使用了,并且我使用过程中是高速初始化的方式,所以下面就按照高速初始化的方式介绍:

在向ECU发送C1 33 F1 81 66 的启动数据之前,还需要进行KWP通信的握手,这时候就需要用到快速初始化,用来告诉ECU有设备准备接入。

Tidle 我在程序实现设置为400ms,>= 300ms

TiniL 我在程序实现设置为25ms, 24~26ms范围内

Twup 我在程序实现设置为50ms,49ms~51ms

 

注意:由于高速初始化需要对TX引脚进行置高置低,所以IO配置成推挽输出比较好,所以发送数据的时候使用模拟串口配置TX引脚进行数据的发送。

 

下面代码展示是堵塞执行,其实已经用状态机实现了,类似的延时状态机之前文章已经描述过,因为篇幅的原因,此处就不多做赘述,需要的人可以看我之前的文章。程序堵塞的优化方法(一)解决程序堵塞的优化方法(二)

u8 KlineFastInit(void){  KLin_RX_CLOSE();/*关闭接收引脚*/  K_OUT_HIGH;       /*TX引脚输出置高*/  Delay_ms(400);  /*保持拉高400ms*/      K_OUT_LOW;    /*TX引脚输出拉低*/  Delay_ms(25);/*保持拉低25ms*/  K_OUT_HIGH; /*TX引脚输出置高*/  Delay_ms(25);/*保持拉高25ms*/   KLin_RX_OPEN();/*打开接收引脚*/  Start_CommunicationKLin();/*向K-line发送 C1 33 F1 81 66 进行启动 */  }

Tres 进行发送与接收之间的判断,通过这个时间可以判断ECU的回应情况,而不至于MCU出现长等待情况,如果出现该时间内数据没有回应,MCU端可以进行ECU重新建立通信的初始化过程。

 

正常情况下一些ECU回复信息 hex:83 F1 11 C1 E9 8F BE

注意了:KB1 KB2 就是我们需要提取的关键词,用来判断ECU是否回复积极响应,不过日本产的三国ECU的关键词是0xE98F,而德尔福和博世ECU的回复关键词是0xEF8F。

BOSH的回复信息 hex:C3 F1 11 C1 EF 8F 04

不过都一样,整条信息最后一位符合累加校验,我们把数据确认是可以用的之后,直接进行关键词判断,对于德尔福、BOSH的接收的信息的不一致,就可以在软件层面忽略,解析判断代码如下:

 

u8 ReceiveECUStartCommunication(u8 *p, u8 len){  p++;//移动八位  显示第二位数据的地址  if ((BigtoLittle16(*(u16*)(p)) == 0xEF8F)||  (BigtoLittle16(*(u16*)(p)) == 0xE98F))//关键字判断 通过大小端转化函数  {      printf("Kline-StartCommunication!\r\n");  }  return 0;}


通讯一旦建立之后我们就可以进行对ECU读取想要的数据。比如读或者删除整车故障码,车辆编号,水温,车速,转速,油压等各种车身上提供的传感器数据。

 

这是对应的服务ID,通过ID这个关键词我们可以进行读取所需的不同种类的车身信息

 

例如我要读取车身的故障码,由上图可知故障码属于ID:0x03的服务ID类中

这时候我就向ECU发送数据 hex:C1 33 F1 03 E8

__packed typedef struct{  u8 fmt;                   u8 tgt;                   u8 src;                 u8 sid;               }KlineSend;u8 ReadDTC(void)  KlineSend *p = (KlineSend*)malloc(20);  p->fmt = 0xC1;  p->tgt = 0x33;  p->src = 0xF1;  p->sid = 0x03;  //cheksum = 0xE8  ((u8*)p)[sizeof(KlineSend)] = CheckSum((u8*)p, sizeof(KlineSend));  SendBuf_KLin((u8*)p, sizeof(KlineSend)+1);  free(p);  return 0;}

 

假设回来数据为 hex:87 F1 11 43 0562 0000 0000 33

(BOSH ECU 回传数据大致为 hex>:C7 F1 11 43 0118 0107 0000 2D )故障码信息是随意写的

u8 ReceiveECUReadDTCByStatus(u8 *p, u8 len){  u8 lenth = 0;  ++p;  --len;//刚好的故障码长度  for (u8 i = 0; i<3; i++)  {    if (*(u16*)&(p[i * 2]) != 0x0000)    {      lenth += 2;//两个字节为一组    }  }  for (u8 i = 0; i<lenth / 2; i++)  {    printf(".DT_%d,0x%04X\r\n",i,BigtoLittle16(*(u16*)&((p[i * 2]))));  }  return 0;}

解析逻辑执行如下:仅供参考

__packed typedef struct{  u8 fmt;                   u8 tgt;                  u8 src;                u8 sid;                  }KlineSecondFORMAT;__packed typedef struct{  u8 sid;                  u8(*f)(u8*, u8);        }KlineAnalyzTypeDef;  uint8_t CheckSum(uint8_t* data, uint8_t len)// V{  uint8_t i;  uint8_t sum;  sum = 0;  for(i = 0; i < len; i++)  {    sum += data[i];  }  return sum;}KlineAnalyzTypeDef KlineAnalyzTab[] ={  { 0xC1, ReceiveECUStartCommunication},    //启动通讯  { 0x43, ReceiveECUReadDTCByStatus },};u8 KlineAnalyz(u8 *p,u8 lenth){  KlineSecondFORMAT*p1;  p1 = (KlineSecondFORMAT*)p;  while(lenth)  {    u8 len = p1->fmt & 0x3F;    if (len != 0)    {      if (p[len + sizeof(KlineSecondFORMAT)-1] != CheckSum(p, len + sizeof(KlineSecondFORMAT)-1))        return 1;//返回错误        for (int i = 0; i < sizeof(KlineAnalyzTab) / sizeof(KlineAnalyzTypeDef); i++)        {          if (p1->sid == KlineAnalyzTab[i].sid)          {            KlineAnalyzTab[i].f(&(p1->sid), len);            break;          }        }        lenth = lenth -(len+ sizeof(KlineSecondFORMAT));        p1=(KlineSecondFORMAT*)((u8*)p1+(len+ sizeof(KlineSecondFORMAT)));      }  return 0;  }

这就是我分享的kwp2000解析,里面代码是实践过的,还有很多细节因为篇幅与时间的原因就不多写了,如果大家有什么更好的思路,欢迎分享交流哈。

更多分享,扫码关注我

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

  1. Kwp2000协议的应用(硬件原理使用篇)

    作者:良知犹存 转载授权以及围观:欢迎添加微信:becom_me 发现K线没有过多的文章描述,作为一个开发过K线的人,不写些文章帮助后来的人岂不是太浪费开发经验了呢. 总述     KWP2000是一 ...

  2. 【如何快速的开发一个完整的iOS直播app】(原理篇)

    原文转自:袁峥Seemygo    感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...

  3. iOS:app直播---原理篇

    [如何快速的开发一个完整的iOS直播app](原理篇) 转载自简书@袁峥Seemygo:http://www.jianshu.com/p/7b2f1df74420   一.个人见解(直播难与易) 直播 ...

  4. 如何快速的开发一个完整的iOS直播app(原理篇)

    目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的iOS直播app](采集篇) 前言 大半年没写博客了,但 ...

  5. 微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)

    1.点评 对于IM系统来说,如何做到IM聊天消息离线差异拉取(差异拉取是为了节省流量).消息多端同步.消息顺序保证等,是典型的IM技术难点. 就像即时通讯网整理的以下IM开发干货系列一样: <I ...

  6. TCP协议、算法和原理

    TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获. 关于TCP这个协议的细节,我还是推荐你 ...

  7. 推荐-zabbix原理篇

    推荐-zabbix原理篇(1) 提交 我的留言 加载中 已留言 本文大纲 snmp介绍 监控流程 开源监控工具zabbix zabbix监控功能的实现 支持数据库存储类型 Zabbix架构中的组件 Z ...

  8. Cesium原理篇:3最长的一帧之地形(2:高度图)

           这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面.        此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维 ...

  9. 基于GBT28181:SIP协议组件开发-----------第四篇SIP注册流程eXosip2实现(一)

    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3945294.html. 上章节讲解了利用自主开发的组件SIP组件l ...

随机推荐

  1. Spring 抽象的缓存包 spring-cache

    项目实战 用户信息查询接口中,使用@Cacheable注解  绑定相关信息接口中,使用@CachePut更新用户信息到缓存 更新用户信息接口中,使用@CacheEvict删除缓存信息 使用步骤 添加依 ...

  2. 在Docker下搭建MySQL双主双重集群(单机展示,与多机原理一致)

    前言 Docker的安装部署&在Docker下MySQL的安装与配置 https://www.cnblogs.com/yumq/p/14253360.html 在Docker进行单机主从复制M ...

  3. nacos统一配置中心源码解析

    配置文件想必大家都很熟悉,无论什么架构 都离不开配置,虽然spring boot已经大大简化了配置,但如果服务很多 环境也好几个,管理配置起来还是很麻烦,并且每次改完配置都需要重启服务,nacos c ...

  4. 十八般武艺玩转GaussDB(DWS)性能调优:路径干预

    摘要:路径生成是表关联方式确定的主要阶段,本文介绍了几个影响路径生成的要素:cost_param, scan方式,join方式,stream方式,并从原理上分析如何干预路径的生成. 一.cost模型选 ...

  5. (十九)hashlib模块

    hashlib模块用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 注意:md5和sha25 ...

  6. QPainter 绘制图像接口

    阅读本文大概需要 3 分钟 我们在开发软件的过程中,绘制图像功能必不可少,使用 Qt 绘制图像时非常简单,只需要传递几个参数就可以实现功能,在 Qt 中绘制图像的 api有好几个 void drawI ...

  7. 一文读懂 Kubernetes APIServer 原理

    前言 整个Kubernetes技术体系由声明式API以及Controller构成,而kube-apiserver是Kubernetes的声明式api server,并为其它组件交互提供了桥梁.因此加深 ...

  8. 图像分割论文 | DRN膨胀残差网络 | CVPR2017

    文章转自:同作者个人微信公众号[机器学习炼丹术].欢迎交流沟通,共同进步,作者微信:cyx645016617 论文名称:'Dilated Residual Networks' 论文链接:https:/ ...

  9. 我在华为OD的275天

    目录 0 - 时间线 1 - 为什么会去华为 OD 2 - 华为 OD 的工作内容 3 - OD 与华为自有员工的对比 4 - 那,到底要不要去华为 OD? 5 - 网传的 OD 转华为正编,真的假的 ...

  10. C++11中string与数值类型的转换

    C++中string与数值类型的相互转换记录 string转int.double.long string s = "123.456"; // string -> int co ...