接触串口很久了,一直以来将都是将串口读取出来的数组转换成字符串通过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. 转:SpringMVC浅谈

    因为项目文案需要,于是乎翻阅spring相关资料.顿觉该篇不错详尽易懂,特转载之. 转载出处: http://blog.csdn.net/gane_cheng/article/details/5278 ...

  2. 【机器学习笔记之二】决策树的python实现

    本文结构: 是什么? 有什么算法? 数学原理? 编码实现算法? 1. 是什么? 简单地理解,就是根据一些 feature 进行分类,每个节点提一个问题,通过判断,将数据分为几类,再继续提问.这些问题是 ...

  3. [ZYNQ-7]PS处理PL外部中断的简单实例的剖析 (参考米联miz702n)

    Zynq的ARM通过GIC中断控制器来接收核仲裁所有的中断.由于中断向量表只有4Bytes大小,仅仅正好存放一条跳转语句,因此当产生一个外部中断时,中断处理的大致过程:PC内容保存到LR_IRQ用于中 ...

  4. Coursera scala课程第一周答案

    Exercise 1: Pascal's Triangle The following pattern of numbers is called Pascal's triangle. 1 1 1 1 ...

  5. 二分图最大匹配:匈牙利算法的python实现

    二分图匹配是很常见的算法问题,一般用匈牙利算法解决二分图最大匹配问题,但是目前网上绝大多数都是C/C++实现版本,没有python版本,于是就用python实现了一下深度优先的匈牙利算法,本文使用的是 ...

  6. 怎样做才是最优雅方式切换 web 项目数据源 ?

    随着业务变迁/需求变更,JavaEE 应用中会被迫连接多个数据源进行业务处理. 怎样在不影响原有项目结构的情况下,已最优雅/最简洁的方式动态切换数据源呢? 本文已一次添加数据源后动态切换实践为例,描述 ...

  7. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6155 Subsequence Count 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6155 题意: 题解来自:http://www.cnblogs.com/iRedBean/p/73982 ...

  8. 理解最基本的Vue项目

    上一篇<Vue开发环境搭建及热更新>,我们讲解了vue开发环境的搭建还有一些小问题,接下来我们来讲解一下这个界面是如何形成的. 在开始讲之前,我们先来看看我们上一篇所谓的项目目录里面到底放 ...

  9. Zepto源码分析(一)核心代码分析

    本文只分析核心的部分代码,并且在这部分代码有删减,但是不影响代码的正常运行. 目录 * 用闭包封装Zepto * 开始处理细节 * 正式处理数据(获取选择器选择的DOM) * 正式处理数据(添加DOM ...

  10. ueditor单独调用上传附件和图片的功能

    javascript富文本编辑器使我们添加.编辑网站中的文章更加方便和容易.这些富文本编辑器提供了所见即所得(What You See Is What You Get - WYSIWYG)的功能,可以 ...