Android蓝牙开发之数据窜位和数据接收错误以及重组字节数据

时间:2023-01-11 18:03:45
 
 现在是我和开发的接收数据出现了问题,总共会接收4串数据(32个字节),第一条和第二条都不会有错,但是第三条和第四条不知道为什么数据总会出现串位, 
 

要么就是头码跑到后面去,要么就是中间的跑到前面来。

这是之前在处理数据的时候碰到的问题,现在已经解决。

   					byte[] read = new byte[32 - fillIndex];					int bytes = mmInStream.read(read);					for (int j = 0; j < bytes; fillIndex++, j++) {						buffer[fillIndex] = read[j];					}					if (fillIndex == 32) {						byte[] newbyte = new byte[32];						System.arraycopy(buffer, 0, newbyte, 0, 32);						int i = Uitils.Check(newbyte);						if (i == 1 || i == 2) {							System.out.println("头码尾码校验错误");							fillIndex = Uitils.fix(buffer);							continue;						} else if (i == 3) {							System.out.println("高低字節校驗錯誤");						} else {							mHandler.obtainMessage(SetActivity.MESSAGE_READ,									newbyte.length, -1, newbyte).sendToTarget();						}						fillIndex = 0;					}

上面是主要的代码。

Uitils.Check(newbyte)
这个方法只是处理一个校验的代码,可以忽视。


byte[] buffer = new byte[32];
int fillIndex = 0;

这是变量的声明,bytes代表的是每次接受到多少个数据,因为有时候只能接受到2个或者30个都有可能,由于我说接受到的字节有32个字节,所以用fillIndex 这个变量来处理接受到了多少个字节,当获取到32个字节的时候就可以进行处理,比如用handler发送出去。



但是有时候万一出现了一种情况就是如果还是出现了错位,出现一次就改不回来了,这时候就需要自己将数据重组回来,就是Fix方法。


	public static int fix(byte[] result){
boolean temp=false;
int count=0;
int index = 1;
for (; index < result.length; index++) {
switch (count) {
case 0:
if(result[index]==defultbyte[0]){
count++;
}
break;
case 1:
if(result[index]==defultbyte[1]){
count++;
}
else{
count=0;
}
break;
case 2:
if(result[index]==defultbyte[2]){
count++;
}else count=0;
break;
case 3:
if(result[index]==defultbyte[3]){
count++;
}else count=0;
break;
case 4:
temp=true;
break;
}
if(temp)break;
}
int fillIndex=0;
if(count>0){
for (int j=index-count; j < result.length; fillIndex++,j++) {
result[fillIndex]=result[j];
}
}
return fillIndex;
}