串口数据缓存java版

时间:2022-10-30 07:36:14

接触串口很久了,一直以来将都是将串口读取出来的数组转换成字符串通过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&lowbar;token以及缓存access&lowbar;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——包装类数据缓存 &equals;&equals;号详解

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

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

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

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

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

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

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

随机推荐

  1. PHP 底层的运行机制与原理

    PHP说简单,但是要精通也不是一件简单的事.我们除了会使用之外,还得知道它底层的工作原理. PHP是一种适用于web开发的动态语言.具体点说,就是一个用C语言实现包含大量组件的软件框架.更狭义点看,可 ...

  2. bootstrap&sol;moban191&sol;js&sol;templatemo&lowbar;custom&period;js

    (function($) { "use strict"; // Cache selectors var lastId, topMenu = $(".menu-holder ...

  3. Java程序员面试题集(71-85)&lpar;转)

    转:http://blog.csdn.net/jackfrued/article/details/17566627 Java程序员面试题集(71-85) 摘要:这一部分主要包括了UML(统一建模语言) ...

  4. 原生JS研究:学习jquery源码,收集整理常用JS函数

    原生JS研究:学习jquery源码,收集整理常用JS函数: 1. JS获取原生class(getElementsByClass) 转自:http://blog.csdn.net/kongjiea/ar ...

  5. ByteBuffer的allocate和allocateDirect

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  6. haproxy快速安装

    haproxy是一款提供负载均衡的代理服务器,它可基于modetcp 实现伪四层调度,还可以基于modehttp实现七层调度,类似于nginx,因为他没有web服务所以不像nginx那样进行控制. 通 ...

  7. &lbrack;Linux&rsqb; - 利用ping给端口加密,限制访问

    Linux中,想对特定的端口加密访问,可以使用iptables的ping方式. 作用 访问被限制的端口,必需先ping发送对应的字节包(字节包大小可自行设置,此为密钥)才能访问成功! 下边是对SSH的 ...

  8. HDU 3605 Escape (网络流,最大流,位运算压缩)

    HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...

  9. Got fatal error 1236原因和解决方法

    一 前言   MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到“Got fatal erro ...

  10. Centos6&period;5 升级Openssl &plus; Openssh

    xu言: 平时很懒,都不想写blog.今天(2018.05.15)开始尝试每天写一篇吧,看我自己能坚持多久! 准备工作: 为了防止在操作过程中导致ssh远程中断,首先安装一个telnet-server ...