java 将接收的数据存到数组 再从数组里取出来判断

去旅行吧 2014-01-16 03:03:51
我从串口里读取数据 ,38位一读取,正常时候是没问题的 收到38位,但我的串口发送有时不是38位一发 所以造成我了收到数据不是38位格式的数据,而且分成几次才收到完整的数据。现在我想将这些不完整的数据放到byte[]里 ,然后从byte里取出来这些数据再判断是否是38位合格的数据。
我的代码 :


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();

}

...全文
1904 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
u013502661 2014-01-17
  • 打赏
  • 举报
回复
借鉴一下netty处理此问题的实现
kakashi8841 2014-01-16
  • 打赏
  • 举报
回复
我上面已经给出你代码,你自己看看吧
去旅行吧 2014-01-16
  • 打赏
  • 举报
回复
引用 3 楼 jdgdf566 的回复:
为什么不用有缓冲的reader呢?例如BufferedInputStream
try 
		{
			//inputStream = serialPort.getInputStream();
			inputStream =  new BufferedInputStream(serialPort.getInputStream());
		} catch (IOException e) {} 
我创建流时是用的BufferedInputStream
去旅行吧 2014-01-16
  • 打赏
  • 举报
回复
引用 楼主 xiaopeng187 的回复:
我从串口里读取数据 ,38位一读取,正常时候是没问题的 收到38位,但我的串口发送有时不是38位一发 所以造成我了收到数据不是38位格式的数据,而且分成几次才收到完整的数据。现在我想将这些不完整的数据放到byte[]里 ,然后从byte里取出来这些数据再判断是否是38位合格的数据。 我的代码 :


			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();
					
				}
				
你说的意思是在流里面read的数据都读处理放到temp 从temp 里用read(byte b[], int offset, int length)方法来读 ?这样读的数据会不会有延时问题?
jdgdf566 2014-01-16
  • 打赏
  • 举报
回复
为什么不用有缓冲的reader呢?例如BufferedInputStream
kakashi8841 2014-01-16
  • 打赏
  • 举报
回复
首先你要明白,一般流的数据,读过就没了(具体你可以看看你那个InputStream的实现或者说明),因此,你里面假设你一个38位数据流传过来的时候每次是1位位传,那么这一行代码
 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;
		}
	}

}

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧