62,635
社区成员




byte[] readBuffer = new byte[38];
byte[] temp = new byte[500];
int size = 0;
boolean flag = false;
try{
while (true){
size = inputStream.read(readBuffer);
//判断读取到的数据是否38位
if(size==38){
//判断数据的开头和结尾是否是规定的格式
if(readBuffer[0]==-88&&readBuffer[37]==26){
for (int i = 0; i < size; i++) {
System.out.print(Integer.toHexString(unsignedByteToInt(readBuffer[i]))+" ");
}
System.out.println();
}else{
//是38位数据但是 不是以a8 开头和1a结尾
for (int i = 0; i < size; i++) {
System.out.print(Integer.toHexString(unsignedByteToInt(readBuffer[i]))+",");
//将数据是38位 但是不是符合格式的数据存到byte里
//temp[i] = readBuffer[i];
}
System.out.println();
flag = true;
}
}else{//如果读取的数据不满38位
for (int i = 0; i < size; i++) {
//将不满的数据放到临时数组里
//temp[i] = readBuffer[i];
System.out.print(Integer.toHexString(unsignedByteToInt(readBuffer[i]))+",");
}
flag = true;
System.out.println();
}
try
{
//inputStream = serialPort.getInputStream();
inputStream = new BufferedInputStream(serialPort.getInputStream());
} catch (IOException e) {}
我创建流时是用的BufferedInputStream size = inputStream.read(readBuffer);
只会是size一直都是1。
因此,你应该是,流里面有多少数据都读出来,然后存入一个你自己用于保存这些数据的,比如上面的temp数组。而temp数组其实相当于是追加数据的方式。你需要用read(byte b[], int offset, int length);的方式来读。那么,这个offset就需要自己记录了。根据read返回的值知道读取了多少数据到数组了,然后增加offset的值。然后temp是否需要自动扩容,就根据你自己情况来定。如果你处理速度可以跟上读取速度,那tmep就不需要扩容了。我现在改个最简单的。你可以试试。
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
public class TestReadData {
/** 一帧的数据 */
private static final int DATA_LENGTH_PRE_FRAME = 38;
private InputStream inStream;
private byte[] buffer;
private int writeIndex;
private int readIndex;
/**
* 读取数据并处理<br/>
* 检查并在有需要的时候整理缓存数据<br/>
* 从流读取数据到缓存<br/>
* 当缓存中存在一帧完整数据时,读出数据并处理
*/
public void readAndProcess(){
while(true){
checkIfNeedMoveData();
try {
int readBytes = inStream.read(buffer, writeIndex, DATA_LENGTH_PRE_FRAME);
if(readBytes!=-1){
writeIndex += readBytes;
}
while(canReadFrame()){
byte[] data = readFrame();
//这里处理你的数据
processYourDataHere(data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void processYourDataHere(byte[] data) {
System.out.print("datas\t: "+Arrays.toString(data));
}
/**
* 读出一帧数据
* @return
*/
private byte[] readFrame(){
byte[] frame = new byte[DATA_LENGTH_PRE_FRAME];
System.arraycopy(buffer, readIndex, frame, 0, DATA_LENGTH_PRE_FRAME);
readIndex += DATA_LENGTH_PRE_FRAME;
return frame;
}
/**
* 当前还能否读出完整的一帧数据
* @return
*/
private boolean canReadFrame(){
return writeIndex-readIndex >= DATA_LENGTH_PRE_FRAME;
}
/**
* 检查是否需要重新整理数据<br/>
* 数组可写入长度已经小于一帧数据长度时。数组可用数据全部“搬”到前面。
*/
private void checkIfNeedMoveData(){
if(buffer.length - writeIndex < DATA_LENGTH_PRE_FRAME){
byte[] temp2 = new byte[buffer.length];
int leftDataLength = writeIndex-readIndex;
System.arraycopy(buffer, readIndex, temp2, 0, leftDataLength);
buffer = temp2;
readIndex = 0;
writeIndex = leftDataLength;
}
}
}