接触串口很久了,一直以来将都是将串口读取出来的数组转换成字符串通过string.contains()查找是否包涵目标数组,自己感觉low到爆,所以写了一个byte-buffer,测试还是蛮好用的。希望借鉴和大神补充改正。

import java.util.Scanner;

public class BufTest {

    public static void main(String aeg[]){
new BufTest().run();
} private Scanner sn=new Scanner(System.in);
private Buffer buf=new Buffer(100,new byte[]{(byte) 0xaa,(byte) 0xee,(byte) 0xdd} ,new byte[]{(byte) 0xee,(byte) 0xaa,(byte) 0xdd}); public void run(){
while(true){
System.out.println("---------------------------INPUT---------------------------");
passString(sn.next());
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.print("checkOut:");
printBytes(buf.checkOut());
System.out.println();
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
for(int i=0;i<buf.bufSize;i++)System.out.print("========");
System.out.println();
for(int i=0;i<buf.bufSize;i++)System.out.print(" "+(Integer.toHexString(buf.getByte(i)&0xff))+"\t|");
System.out.println();
for(int i=0;i<buf.bufSize;i++)System.out.print("========");
System.out.println();
}
} /*输入16进制格式字符串 "aa/ee/dd/ff/ee/aa/dd"
*转为byte组存进buffer
*/
public void passString(String arg){
String args[]=arg.split("/");
byte bs[]=new byte[args.length];
for(int i=0;i<bs.length;i++){
try {
bs[i]=(byte) Integer.parseInt(args[i], 16);
} catch (Exception e) {
bs[i]=0;
}
}
buf.putIn(bs);
} /*将符合查找结果显示*/
public void printBytes(byte bs[]){
if(bs!=null)
for(int i=0;i<bs.length;i++)
System.out.print(Integer.toHexString(bs[i]&0xff)+" ");
} public class Buffer{ public int bufSize;
public byte buf[];
public byte head[];
public byte foot[];
public int wIndex=1;
public int rIndex=0; public Buffer(int bufSize,byte head[],byte foot[]){
this.bufSize=bufSize;
this.buf=new byte[bufSize];
this.head=head;
this.foot=foot;
} public byte getByte(int index){
return buf[index];
} public void putIn(byte bs[]){
for(int i=0;i<bs.length&&putIn(bs[i]);i++);
} public boolean putIn(byte b){
if(canWrit(wIndex)){
buf[wIndex]=b;
wIndex=moveNext(wIndex);
return true;
}
return false;
} /*查找第一个符合头部的位置*/
public byte[] checkOut(){
if(head==null)return null;
int index=rIndex;
while(canRead(index)){
if(findNext(index,head,true))return findHead(index);
index=moveNext(index);
}
return null;
} /* 递归查找在下一个尾部之间是否含有另一个头部
* 如果有就讲读起始位置移到下一个头部
* 如果没有查找尾部
*/
public byte[] findHead(int index){
index=moveNext(index,head.length);
while(canRead(index)){
if(findNext(index,head,false)){
rIndex=index;
return findHead(rIndex);
}
index=moveNext(index);
}
return findFoot(rIndex);
} /* 查找尾部
* 如果找到尾部就截取头部到尾部的数组
* 如果没有找到返回null
*/
public byte[] findFoot(int index){
if(foot==null)return null;
index=moveNext(index,foot.length);
while(canRead(index)){
if(findNext(index,foot,false)){
return getPart(moveNext(index,foot.length));
}
index=moveNext(index);
}
if(!canWrit(wIndex))rIndex=wIndex-1;
return null;
} /* 返回从读起始位置到当前位置的数组
* 并将读起始位置置为当前截至位置
*/
public byte[] getPart(int endIndex){
if(rIndex==endIndex)return null;
int i=0,size=getSize(endIndex);
byte part[]=new byte[size];
while(rIndex!=endIndex&&i<size){
rIndex=moveNext(rIndex);
part[i]=buf[rIndex];
i++;
}
return part;
} /*返回将要读取的数组大小*/
public int getSize(int endIndex){
if(endIndex>bufSize||
(endIndex>wIndex&&endIndex<rIndex)||
(endIndex>rIndex&&endIndex>wIndex)||
(endIndex<rIndex&&endIndex<wIndex)
)return 0;
return (rIndex>endIndex)?bufSize-rIndex+endIndex:endIndex-rIndex;
} /*位置加一*/
public int moveNext(int index){
index++;
return index%=bufSize;
} /*位置加size*/
public int moveNext(int index,int size){
index+=size;
return index%=bufSize;
} /*是否可写*/
public boolean canWrit(int index){
index=moveNext(index);
return index!=rIndex;
} /*是否可读*/
public boolean canRead(int index){
index=moveNext(index);
return index!=wIndex;
} /* 返回当前位置是否等于将要比对的数组*/
public boolean findNext(int index,byte erq[],boolean isHead){
for(int i=0;i<erq.length;i++){
index=moveNext(index);
if(index!=wIndex){
if(buf[index]!=erq[i]){
if(isHead)rIndex=moveNext(rIndex, i++);
return false;
}
}else{
return false;
}
}
return true;
}
} }

串口数据缓存java版的更多相关文章

  1. 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token

    一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...

  2. 微信支付java版V3验证数据合法性

    [TOC] 1. 微信支付java版V3验证数据合法性 概要:使用微信支付接口时,微信会返回或回调给商户XML数据,开发者需要验证微信返回的数据是否合法. 特别提醒:商户系统对于支付结果通知的内容一定 ...

  3. java实现数据缓存

    摘抄自java并发实战 有时候需要对数据缓存.用Map缓存数据比较合适.但是由于对吞吐量,一致性,计算性能的要求,对数据进行缓存的设计还是需要慎重考虑的. 一.利用HashMap加同步 (1)说明 把 ...

  4. java之ibatis数据缓存

    使用IBatis作数据缓存 1.SqlMapConfig.xml中<settingscacheModelsEnabled="true" //设置为trueenhancemen ...

  5. java读写串口数据

    本博文参考自https://www.cnblogs.com/Dreamer-1/p/5523046.html 最近接触到了串口及其读写,在此记录java进行串口读写的过程. 1.导入串口支持包 需要下 ...

  6. java——包装类数据缓存 ==号详解

    Java对部分经常使用的数据采用缓存技术,即第一次使用该数据则创建该数据对象并对其进行缓存, 当再次使用等值对象时直接从缓存中获取,从而提高了程序执行性能.(只对常用数据进行缓存) Java中只是对部 ...

  7. 「小程序JAVA实战」小程序数据缓存API(54)

    转自:https://idig8.com/2018/09/22/xiaochengxujavashizhanxiaochengxushujuhuancunapi52/ 刚开始写小程序的时候,用户信息我 ...

  8. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  9. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

随机推荐

  1. css 实现三角形、圆形

    .div { width:0px; height:0px; border:100px solid red; border-color:red red transparent transparent; ...

  2. Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介

    在大数据程序流行的今天,许多程序都面临着共同的难题:程序输入数据趋于无限大,抵达时间又不确定.一般的解决方法是采用回调函数(callback-function)来实现的,但这样的解决方案很容易造成“回 ...

  3. 【有意思的BUG】客户端无厘头 已连网的场景初始化太慢 未连网的场景异常崩溃

    客户端 已连网的场景初始化太慢 当在未连接internet的时候,打开某些APP,会比较迅速地初始化进入到主页面. 但是当我在已经连接了internet的时候,打开某些APP,有些会初始化很久!!!! ...

  4. 浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化

    本文出处:http://www.cnblogs.com/wy123/p/7374078.html(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误 ...

  5. 金明的预算方案 NOIP 2006 提高组

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱 ...

  6. python编码问题一点通

    一.了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的, ...

  7. Spark Streaming 调优指南

    SparkStreaming是架构在SparkCore上的一个"应用",SparkStreaming主要由DStreamGraph.Job的生成.数据的接收和导入以及容错四大模块组 ...

  8. 写java代码遇到的一些问题

    记录一些做论文实验写代码时遇到的问题. 数据库SQL语句方面: 1.java通过JDBC连接MySql数据库方法 参见:http://hzy3774.iteye.com/blog/1689525 2. ...

  9. ES2017异步函数现已正式可用

    欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~​ ES2017标准已于2017年6月份正式定稿了,并广泛支持最新的特性:异步函数.如果你曾经被异步 JavaScript 的逻辑 ...

  10. windows管理命令

    执行msi程序 msiexec /package mysql-installer-community-5.7.18.0.msi rem 管理员DOS窗口执行这个命令,开始卸载mysql 杀死进程 ta ...