串口数据缓存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 ...
随机推荐
- img标签在div中水平垂直居中--两种实现方式
第一种方式: text-align:center; vertical-align:middle; div{ text-align: center; vertical-align:middle;widt ...
- 设计模式(二) 策略模式Strategy
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,我个人的理解是,具有相同行为不同的行为模式,比如走路,有人速度3m/s,有人100m/s,把他们的具体行走和对象本身 ...
- python--DenyHttp项目(2)--ACM监考客户端1.0版
修复了: 360搜索可以使用的漏洞 更新版本,上一版本复制的Hosts文件保留的漏洞 #coding:gbk import os import sys from subprocess import * ...
- 【新发现】不用苹果开发账号就能申请ios证书真机调试
虽然xcode现在可以免证书进行测试了,但众多跨平台开发者,如果还没注册苹果开发者账号. 想安装到自己非越狱手机测试是无能为力了. 不过新技术来了,只需要普通免费的苹果账号无需付费成为开发者就可以申请 ...
- 百度之星2017初赛A轮 1001 小C的倍数问题
小C的倍数问题 Accepts: 1990 Submissions: 4931 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
- js单页hash路由原理与应用实战
什么是路由? 通俗点说,就是不同的URL显示不同的内容 什么是单页应用? 单页,英文缩写为SPA( Single Page Application),就是把各种功能坐在一个页面内. 那所谓的单页路由应 ...
- BaseAction 使用
public class AreaAction extends BaseAction<Area> { @Autowired private AreaService areaService; ...
- python---------函数练习题
2.写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作 # 方法一 # import os # def fun(): #y为要修改的内容,z为修改的结果 # y=in ...
- MATLAB中多行注释以及取消的快捷键
多行注释:Ctrl+R 取消注释:Ctrl +T
- iOS9中关于 NSURLSession/NSURLConnection HTTP load failed 的解决办法
最近为了新的存管app上线,忙了近一个月,重新过了一段996的日子,今天终于可以喘口气,继续更新博客了.本文记录一下在iOS 9中发送https请求遇到的问题及解决办法,希望通过本文,可以对ATS的配 ...