基于蓝牙的车载OBD系统

本文介绍了一个使用Android智能设备通过蓝牙自动搜索并连接OBD设备的项目。重点在于实现自动匹配功能,因某些Android设备无屏幕,解析ELM327模块数据的代码也被详细讨论。
摘要由CSDN通过智能技术生成

本人做的一点小东西,自认为还有点用处,随便写点,希望做车载系统的同行有帮助,好了,废话也不多说了,直接进入主题吧。

本项目主要功能是android智能设备开启蓝牙后自动搜索OBD的蓝牙设备,并且自动匹配,自动匹配很重要,因为有的android设备并没有屏幕。至于蓝牙怎么连接就多说了,

看官方文档吧,这里主要给出主要解析ELM327模块数据的代码。

 

 @Override
				public void run(){
			   
				  while(true){
					
						// read until '>' arrives
						try {
							 byte b = 0; 
							StringBuilder res = new StringBuilder();
							while((char) (b = (byte) mmInputStream.read()) !='>')
						    {
							  if ((char) b != ' ')
							  {
								res.append((char) b);
							  }
						    }
							rawData = res.toString().trim();
							
							mybuffer.clear();
							int spaceindex=rawData.indexOf('\r');//搜索"\r"字符的索引位置
							
							rawData=rawData.substring(spaceindex+1);
							String[] ress =rawData.split("\r");
							rawData=null;
							StringBuilder resss = new StringBuilder();
							for (String r : ress) {
								String k = r.replace("\r", "");//遍历所有ress里面所有的元素,去掉
								resss.append(k);
							}
							rawData=resss.toString().trim();
						if(!rawData.equals("?")){//首先检测是否能够解析发出的命令,不能解析就返回“?”
							String mode = "0x"+rawData.substring(0,2);
							
							int Mode = 0;
							int PID = 0;
							String isAtOrObd=rawData.substring(0, 2);
							if(isAtOrObd.equals("41")||isAtOrObd.equals("42")||isAtOrObd.equals("43")||isAtOrObd.equals("44")||isAtOrObd.equals("45")||isAtOrObd.equals("46")||isAtOrObd.equals("47")||isAtOrObd.equals("48")||isAtOrObd.equals("49"))
							{
								
								Mode=Integer.decode(mode)-64;//解析出模式
								
							    
							switch(Mode) {
							case 01:{
								String pid =  "0x"+rawData.substring(2,4);
							    PID = Integer.decode(pid);
							    int begin = 0;
								int end = 2;
								while (end <= rawData.length()) {
									String temp = "0x" + rawData.substring(begin, end);
									mybuffer.add(Integer.decode(temp));
									begin = end;
									end += 2;
								}
								switch(PID){
								  case 01:{
									// read string each two chars
									
										int mil = mybuffer.get(2);
										if ((mil & 0x80) == 128){
											isHaveTroubleCode = true;
											}
										codeCount = mil & 0x7F;//获取故障码数
										Message msg2=new Message();
										msg2.obj="
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值