【VB开源代码栏目提醒】:网学会员,鉴于大家对VB开源代码十分关注,论文会员在此为大家搜集整理了“如何开发标准的汽车OBD2诊断程序及相关应用层协议下载 - 毕业设计”一文,供大家参考学习!
如何开发标准的汽车OBD2诊断程序及相关应用层协议下载 开发标准OBD2诊断程序要准备的资料及硬件 1、因TL718已经为你建立了物理层、数据链层和部分应用层的协议所以只要OBD2标准应用层协议文本ISO15031-5 或 SAE J1979这两个协议是相同的内容。
这里可下载 SAEJ1979-2002 670KB ISO15031-5 3.46MB 2、TL718诊断接口 1 套或用TL718芯片自建电路。
3、家用PC机电脑一台。
4、安装软件Accessport调试软件及VC或
VB、BC等你喜欢的开发
软件。
5、符号OBD2标准的汽车发动机电脑一块或汽车一台 准备好以上这些你就可以开始你的OBD2标准程序开发了 TL718基本信息 TL718芯片的技术数据手册 TL718通过一个UART串口与单片机、PDA或PC RS232通讯在有的新的PC机上已没有装备RS232串口可以通过虚拟串口实现与TL718通讯例USB TO RS232、以太网TO RS232、或蓝牙 TO RS232等等。
------- RS232 ------ OBD2电缆 ---------- PC TL718汽车诊断口 ------- ------ ---------- 不管使用怎样的物理连接你可以使用超级终端或串口调试工具直接通过键盘发送和接收字符。
在使用串口调试软件前首先必须设置正确的COM端口号和正确的波特率。
一般为9600波特率PIN60V或38400波特率PIN6VCCPP OC设置默认值。
串口设置为8个数据位校验位0 停止位 1位。
如果设置错误将不能和TL718正常通讯。
所有从TL718的响应以一个回车符0X0D及一个可选的换行符0X0A结束。
正确连接打开电源后。
TL718将驱动测试LED灯闪亮3次后发送 TL718 starting 〉 如果正确收到以上信息代表串口及连接设置正确。
第二行“〉”符号代表TL718为空闲状态可以立即从RS232接收数据。
如果没有收到“〉”符号就向TL718发送数据可能引起数据丢失。
而发生不正确的响应。
PC从串口向TL718发送的指令格式 TL718有2种格式的命令 1、OBD连接命令与车辆发生通讯。
2、内部命令全部以AT开头不与辆发生通讯。
发送必须以0x0d回车符结束的ASCII码字符回车符后面的字符被TL718丢弃。
TL718内部命令以“AT”开头后面跟可见字符。
不可见字附及空格被忽视。
OBD命令只能包含16进制的ASCII码0-9a-fA-F空格被忽略。
如果发送的指令不能被TL718有效解释TL718将返回一个“”表明发送指令无效。
当TL718处理OBD命令时TL718连续监视RTS引脚及RS232输入其中任何一个情况发生TL718将中断当前的OBD命令使它快速返回提示符“〉”等待接收新的命令。
大小写字符都能被TL718接收空格被忽略。
比喻命令“ATZ”、“atz”、“at z”都是一样的。
比喻我们向TL718发送一个复位指令只要向RS232串口发送ASCII字符“ATZ”0x0d回车符 TL718 Starting ATZ ELM327 v1.2 注ATZ指令返回 ELM327 V1.2是为了使用现成的国外OBD观软件所以用了这个返回信息。
返回本芯片信息用“ATI”指令。
ATI TL718 v1.0 返回芯片编号用 ATS指令这个编号升级硬件和提供保修服务时需要 ATS CodeNumb:98764323 TL718的OBD命令 如果你向TL718发送的指令以16进制数的ASCII开头则TL718认为是OBD命令TL718接收后把成对的ASCII码16进制数转换成单个字节的16进制数据发送到车辆电脑数据总线。
OBD命令实际是被嵌入到数据消息包内后发送到数据总线上的大多数标准要求在每个数据消息包内包含三字节的头及最后一个数据校验字节。
TL718自动添加了这些附加的字节这些默认的值对OBD2诊断模式请求指令都不需要更改但如果你想要更改这些头字节值可以用内部命令“ATSH XXXXXX”更改。
大部分OBD指令长度只有一个字节或2个字节TL718充许发送的最长度是对应标准规定的字节超出部分将被丢弃。
发出的OBD指令不能出现单个的数字16进制数必须成对发送比喻0不可能发送单个的“0”必须发送“00”如果出现单个数字TL718认为指令格式错误将返回一个“”。
由于OBD汽车诊断标准都使用16进制所以TL718接收发送的数据也是16进制的。
例15的代表的十进制值是21 当发送完OBD2命令后TL718等待从总线接收OBD消息如果接收到地址的消息并且地址匹配则TL718就把数据从RS232发送给PC如果TL718接收到的消息和发送的地址不匹配则忽略该消息。
但也可以通过ATBD内部命令查看该接收到的消息包。
如果直到等待时间P2MAX ATST命令的设置值默认值100ms结束没有接收到匹配地址的数据则TL718返回“NO DATA”如果接收到数据并且地址匹配则复位计时间继续等待直到等待时间溢出。
OBD2标准诊断模式 开发OBD2诊断程序必须掌握ISO 15031-5 SAE J1979定义的九种诊断模式对于英文不是很好的朋友本站有个中文的说明 可以参考 OBD2的九种诊断模式 更详细的内容还是要看 ISO15031-5标准文本15031–5 给出了可供选择的所有参数的标准定义包括存储格式、单位和文字描述等信息。
每个参数都有一个参数标识PID与之相对应。
OBD系统输出信息的模式/服务 Mode 1: 请求动力系当前数据 Mode 2: 请求冻结祯数据 Mode 3: 请求排放相关的动力系诊断故障码 Mode 4: 清除/复位排放相关的诊断信息 Mode 5: 请求氧传感器监测测试结果 Mode 6: 请求非连续监测系统OBD测试结果 Mode 7: 请求连续监测
系统OBD测试结果 Mode 8: 请求控制车载系统测试或者部件 Mode 9: 读车辆和标定识别号 每个模式后面紧跟一个参数标识PID表示后面是什么参数每个模式的PID 00 是ISO15031定义专用的参数每个符合标准的电脑必须支持这个参数标识。
代表该模式对其他PID是否支持。
用Accessport 进行OBD2诊断 与车辆数据通讯 OBD2命令的格式 1、 上图是OBD2的诊断指令的消息包的完整格式极大部分厂商专用的功能也是这种格式TL718能自动设定了Header/ID/PCI/CHECKSUM这部分数据对于标准的OBD2诊断程序你都几乎不用关心修改它。
想了解有关内容它们分别定义在ISO14230-2、J1850 、IS9141-2 和ISO15765-2数据链层定义的文本内。
TL718自动检测数据总线的物理连接能在协议1-9间自动搜寻当前车辆的协议搜寻到后自动返回数据。
当然也可手工设定到某个特定的协议。
TL718不搜寻A-F协议因为A-F协议它们没有象OBD2一样有一个统一的ISO15031应用层协议那样的话自动
搜索变得毫无意义。
2、ISO15031SAE J1979是应用层的协议同样它也不用关心使用什么样的物理层协议TL718自动连接你编程时只要发送数据和接收及处理接收回来的数据计算或显示。
所以这么多种物理连接以统一标准规定的数据包来发送接收我们编程处理变得相对简单。
下面我们来讨论OBD2指令。
3、这里我们只要关心数据消息包的7字节数据data byte部分就可以了 ISO15031-5定义 字节 意义 1 MODE 代表请求数据的类型 2 PID 参数标识 3-7 根据不同的MODE及PID ISO15031-5有详细的定义 如上图所示连接好线路及打开车匙到ON不要起动车辆。
不用做任何设定只要你向TL718发送指令TL718自动返回车辆响应的数据。
例 1 图所示“0100”代表ISO15031-5定义MODE 01 PID 00 指令。
01 00 41 00 BF 9F B9 90 第1个字节 41 代表 Mode 01 0140标准定义 第2个字节 00 代表 PID 00 3-6字节是车辆发送回来关于 MODE 01 PID 00 请求返回来的数据 表示模式00 所支持其他PID01---PID32标识的按位定义的数据 1代表支持 0代表不支持。
例 2请求读取发动机水温 MODE 01 PID 05 我们只要简单的向车辆发送0105指令 0105 41 05 7B 41代表MODE 01 05代表 PID 05 7B是水温值 10进制数值是71611123 水温是123-4080度 例 3读取发动机转速rpm MODE 01 PID 0C 同样只要向TL718发送010C 01 0C 41 0C 1A F8 1AF8是2字节的16进制值转换为10进制数是6904每格1/4 rpm 转速是6904/41726 rpm 注以上数据的转换及格式在ISO15031-5内有详细定义 读OBD2故障码DTCs Diagnostic Trouble Codes 读故障码是诊断仪最
常用的功能这里只是简单的说明一下详细内容请查阅ISO15031-5文本 一般情况下可直接用MODE 03读取当前故障码但这里我们 先用MODE 01 PID 01读取现在有多少个故障码存在ECU内 01 01 41 01 81 07 65 04 41 01 前面已说明是对MODE 01 PID 01的响应
代码 81 代表当前的故障码数这个10进制数值是129不是代表有129个故障码 81它的最高位MSB 代表是否点亮故障指灯低7位代表了故障码的数量 16进制算法应是 0x81 0x7F 0x01 所以是一个故障码。
也可是10进制数值直接减128 即129-1281 所以81代表了故障灯点亮有一个故障码81后面的数据请参考标准文本和读故障码没有关系。
在这个例子中TL718只返回了一行数据但是如果有另外的控制模块也附合响应条件有可能返回多行信息。
比喻常见的发动机电脑和自动波箱控制电脑同时返回信息就会有2行信息要确认是哪一个电脑返回的是哪一行 信息必须设置返回OBD消息保的三字节头AT H1内部命令打开查看消息头字节中的第三个字节源地址确定 是那个电脑模块返回的消息包。
这里先不讨论在另外章节来详细讨论多消息包数据。
现在已经读了有多少个故障码下一步读实际的故障码是什么。
用OBD2诊断模式MODE 03读取只要简单地向TL718发送03 03 可能的返回信息数据如下 43 01 33 00 00 00 00 注如果故障码数量多于3或多个电脑模块会返回多行消息包 43是对MODE 03 请求的响应0340另外的6个字节是故障
代码2个字节代表一个故障码。
这里有3个代表故障码的数据0133 0000 0000“0000”是ISO15031在这个模式下返回的填充数据 不是实际的故障码。
故障码含义ISO定义二字节故障码例0133的第一个数如下表所示 现在来分析上面的故障码 0133 第一个数字“0”按上表用“P0”代替。
0133就代表是故障码P0133。
同样如果收到的是D016则“D”用U1代替则故障
代码就时U1016 如果收到是1131则代换后故障
代码是P1131。
故障码的定义详细请看 SAE J2012 - 2002 SAE J2012 -2002.rar 190kB 注ISO15765 CAN故障码消息包和J11850、ISO9141 ISO14230返回的信息有稍不同 编写
程序时要注意ISO 15765 返回的信息第二个数据代表的是电脑模块有多少个故障码DTCs 详细看ISO15031-5内定义。
清除故障
代码 OBD2诊断模式MODE04 是复位ECU的一个功能同时也清触故障
代码执行后ECU将 1、复位故障
代码的数量为0 2、删除所有的故障
代码 3、删除存储的冻结桢数据 4、删除所有O2传感器听测试数据 5、删除模式MODE06 和 MODE 07的数据信息 复位后你的汽车由于复位了一些数据短时间内可能会引起
工作异常。
为了防止不小心复位ECU ISO15031-5要求所有的扫描工具诊断仪在发送MODE 04指令前必须加一个“确认信息”。
TL718不监视发送信息的内容是否是复位指令。
04 44 发送04指令后车辆ECU接收成攻将立即复位以上内容 并发回一个MODE 04的响应信息440440。
一般的流程 结束语 1. ISO14230 ISO9141要求通讯前的初始化过程、及连接后要求有一个周期性的握手信号这些TL718都已经自动完成OBD2标准的诊断程序都不用更改。
怎样更改这些参数 OBD总线的初始化及握手消息 1. 看完这些内容就可开始你的OBD2开发。
实际上厂商专用的诊断功能程序差不多也是这么简单。
为什么叫专用是因为它没有公开应用层的协议。
开发时比我们OBD2开发多少一个过程。
就是怎样用TL718从专用的设备中读得专用的诊断指令也就是应用层协议。
在开发专用功能的诊断仪中讨论这个
问题。
2. OBD2其他的诊断模式这里不再说明诊断方法都是一样的。
详细内容查看ISO15031-5或SAE J1979。
3. 多试多做你会发现开发诊断程序原来如此简单。
4. OBD2诊断程序源
代码 OBD2诊断程序实例
代码