串口数据缓存java版
接触串口很久了,一直以来将都是将串口读取出来的数组转换成字符串通过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版的更多相关文章
- 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token
一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...
- 微信支付java版V3验证数据合法性
[TOC] 1. 微信支付java版V3验证数据合法性 概要:使用微信支付接口时,微信会返回或回调给商户XML数据,开发者需要验证微信返回的数据是否合法. 特别提醒:商户系统对于支付结果通知的内容一定 ...
- java实现数据缓存
摘抄自java并发实战 有时候需要对数据缓存.用Map缓存数据比较合适.但是由于对吞吐量,一致性,计算性能的要求,对数据进行缓存的设计还是需要慎重考虑的. 一.利用HashMap加同步 (1)说明 把 ...
- java之ibatis数据缓存
使用IBatis作数据缓存 1.SqlMapConfig.xml中<settingscacheModelsEnabled="true" //设置为trueenhancemen ...
- java读写串口数据
本博文参考自https://www.cnblogs.com/Dreamer-1/p/5523046.html 最近接触到了串口及其读写,在此记录java进行串口读写的过程. 1.导入串口支持包 需要下 ...
- java——包装类数据缓存 ==号详解
Java对部分经常使用的数据采用缓存技术,即第一次使用该数据则创建该数据对象并对其进行缓存, 当再次使用等值对象时直接从缓存中获取,从而提高了程序执行性能.(只对常用数据进行缓存) Java中只是对部 ...
- 「小程序JAVA实战」小程序数据缓存API(54)
转自:https://idig8.com/2018/09/22/xiaochengxujavashizhanxiaochengxushujuhuancunapi52/ 刚开始写小程序的时候,用户信息我 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
随机推荐
- ABP+AdminLTE+Bootstrap Table权限管理系统第七节--登录逻辑及abp封装的Javascript函数库
经过前几节,我们已经解决数据库,模型,DTO,控制器和注入等问题.那么再来看一下登录逻辑.这里算是前面几节的一个初次试水. 首先我们数据库已经有的相应的数据. 模型和DTO已经建好,所以我们直接在服务 ...
- NYOJ 252 01串(斐波那契数列变形)
01串 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...
- Python3+迭代器与生成器
转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...
- Oracle进阶研究问题收集
1. buffer busy waits http://www.itpub.net/thread-1801066-1-4.html 2. 深入理解oracle log buffer http://ww ...
- 【转】C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- 多态性(C#)
在面向对象编程中继承性和多态性是重要机制,前面我为大家分享了我对“类的继承”的理解,哪么今天我就跟大家分享下我对“多态性(C#)”的理解. 首先我们先来看看多态的定义,同一操作作用于不同的对象,可以有 ...
- JMeter请求执行次数设置
今天介绍下JMeter如何控制请求执行次数 主要有两种方式: 方式一:通过循环控制器控制每个请求的执行次数 例如:脚本执行规律是这样的,login-->customerPage-->sea ...
- 设计模式的征途—20.备忘录(Memento)模式
相信每个人都有后悔的时候,但是人生并无后悔药,有些错误一旦发生就无法再挽回,有些事一旦错过就不会再重来,有些话一旦说出口也就不可能再收回,这就是人生.为了不让自己后悔,我们总是需要三思而后行.这里我们 ...
- ASP.NET Core 使用Cookie验证身份
ASP.NET Core 1.x提供了通过Cookie 中间件将用户主体序列化为一个加密的Cookie,然后在后续请求中验证Cookie并重新创建主体,并将其分配给HttpContext.User属性 ...
- 谈谈Golang中goroutine的调度问题
goroutine的调度问题,同样也是我之前面试的问题,不过这个问题我当时并不是很清楚,回来以后立马查阅资料,现整理出来备忘. 有一些预备知识需要说明,就是操作系统中的线程.操作系统中的线程分为两种: ...