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

现在是我和开发的接收数据出现了问题,总共会接收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;
	}


你可能感兴趣的:(android)