Android 关于SerialPort串口通信接收数据有时候不是完整数据时的解决方法
适用协议帧数据中包含数据长度
private int count = 0; // 已经缓存的数据字节长度
private final int SIZE = 1024;
private byte[] buffer = new byte[SIZE];
private byte[] cabuffer = new byte[SIZE];
private byte[] data;
private int datalenght = 0;
public void write(byte[] b, int length) {
if (count + length > SIZE) {
return;
}
System.arraycopy(b, 0, buffer, count, length);
count += length;
}
public boolean read() {
int pos = 0;
int data_len = count - pos;
boolean ret = false;
while (data_len >= 7) {// 7一帧完整的数据的最小长度
// 找到起始符并且是一个合法的包
if (buffer[pos] == (byte) 0x00) {//帧头
if (!isPartialObject(buffer, pos, data_len)) {
int object_size = getObjectSize(buffer);
if (cabuffer != null) {
datalenght = object_size;
System.arraycopy(buffer, pos, cabuffer, 0, object_size);
}
pos += object_size;
ret = true;
break;
} else {
// 如果只收到一个包的部分数据,等待下一包, 组合成完整的数据
break;
}
}
pos++;
data_len = count - pos;
}
// 处理了部分数据,把有效数据移动到缓冲区的最前面
// 这些数据也有可能是垃圾数据,直到下一个起始符,下一次处理会处理掉这些数据.
System.arraycopy(buffer, pos, buffer, 0, count - pos);
count -= pos;
return ret;
}
public boolean isPartialObject(byte[] buffer, int pos, int data_len) {
int object_size = getObjectSize(buffer);// 一帧数据长度
if (data_len < object_size) {
return true;
}
return false;
}
// 真实数据长度
public int getObjectSize(byte[] buffer) {
return buffer[x] & 0xFF;
}
...串口数据读取
byte[] buffer = new byte[1024];
int size = inputStream.read(buffer); //读取数据的大小
if(size >0){
write(buffer,size);
while (read()){
data = new byte[datalenght ];
System.arraycopy(cabuffer, 0, data , 0, datalenght);//data一帧完整的数据
};
}