当前位置: 首页 > article >正文

Android 串口数据分包处理

/*
class PacketHandler {
private static final byte PACKET_START = 0x79; // 假设包的开始标记为0x79
private static final byte PACKET_END = 0x0D; // 假设包的结束标记为0x0D

private static ByteArrayOutputStream buffer = new ByteArrayOutputStream();

public static void onDataReceived(byte[] data) {
    buffer.write(data, 0, data.length);

    byte[] completePacket = null;
    while ((completePacket = findNextPacket(buffer.toByteArray())) != null) {
        // 处理完整的包
        processPacket(completePacket);
        // 从缓冲区中移除已处理的包
        removeProcessedPacket(buffer, completePacket);
    }
}

private static byte[] findNextPacket(byte[] data) {

    int startIndex = -1;
    for (int i = 0; i < data.length; i++) {
        if (data[i] == PACKET_START) {
            startIndex = i;
            break;
        }
    }
    if (startIndex >= 0) {
        int endIndex = -1;
        for (int i = startIndex; i < data.length; i++) {
            if (data[i] == PACKET_END) {
                endIndex = i;
                break;
            }
        }
        if (endIndex > startIndex) {
            return Arrays.copyOfRange(data, startIndex, endIndex + 1);
        }
    }
    return null;
}

static StringBuffer stringBuffer = new StringBuffer();
static boolean isComnplete;

private static void processPacket(byte[] packet) {
    // 处理包的逻辑
    String s = MyFunc.ByteArrToNoSpaceHex(packet);
    stringBuffer.append(s);
    try {

// Log.i(“byteDataResult”, stringBuffer.toString() + “=111=” + fromHexString(stringBuffer.toString()));
} catch (Exception e) {
e.printStackTrace();
}

    if (stringBuffer != null && stringBuffer.toString().endsWith("23796F6E6B65720D")) {
        String dateTemp = stringBuffer.toString();
        int startPosition = dateTemp.lastIndexOf("796F6E6B657223");
        String date = dateTemp.substring(startPosition);

        stringBuffer = new StringBuffer();
        isComnplete = true;
        if (isComnplete) {
            isComnplete = false;
            Log.i("byteDataResult", "===" + date);
        }
    }
}

public static String fromHexString(String hexString) throws Exception {
    String result = "";
    hexString = hexString.toUpperCase();
    String hexDigital = "0123456789ABCDEF";
    char[] hexs = hexString.toCharArray();
    byte[] bytes = new byte[hexString.length() / 2];
    int n;
    for (int i = 0; i < bytes.length; i++) {
        n = hexDigital.indexOf(hexs[2 * i]) * 16 + hexDigital.indexOf(hexs[2 * i + 1]);
        bytes[i] = (byte) (n & 0xff);
    }
    result = new String(bytes, "UTF-8");
    return result;
}

private static void removeProcessedPacket(ByteArrayOutputStream buffer, byte[] packet) {
    byte[] newData = new byte[buffer.size() - packet.length];
    int packetStart = 0;
    for (int i = 0; i < buffer.size(); i++) {
        if (i < packet.length) {
            packetStart = i;
        } else {
            newData[i - packet.length] = buffer.toByteArray()[i];
        }
    }
    buffer.reset();
    buffer.write(newData, 0, newData.length);
}

}*/


http://www.kler.cn/news/294633.html

相关文章:

  • 监控平台之rollup打包
  • 【MYSQL】
  • 最强虚拟机,内置强大插件,绝!
  • MES管理系统助力企业车间管理可视化
  • RK3566/RK3568 Android 11 无操作自动隐藏导航栏、底部上拉显示导航栏
  • Clickhouse 为什么这么快
  • 前端去除 html 的标签 v-html 改为方法
  • C++学习笔记(10)
  • “设计模式双剑合璧:工厂模式与策略模式在支付系统中的完美结合”
  • YOLOv8改进 | Conv篇 | YOLOv8引入DWR
  • 2024年,女生到底适合转行ui设计还是软件测试?
  • golang闭包中变量获取
  • 3个 ArcGIS imagery的新特性
  • ELK学习笔记(三)——使用Filebeat8.15.0收集日志
  • 美金充值卡自己收会更划算吗?相当卡商的学员看过来
  • PHP一键创建在线考试考试答题系统小程序源码助力远程教育与考核
  • 驾驭冰雪 安全无忧,韩泰高性能冬季轮胎新品上市
  • 装修找人做“私活”有哪些风险?
  • Oracle---PAG程序全局区的组成:堆栈区、会话区、游标区、排序区
  • 【debug】nvidia-smi:Failed to initialize NVML: Unknown Error
  • Redis 持久化 AOF、RDB
  • 如果文件从存储卡中被误删除,存储卡数据恢复如何恢复?
  • 【Linux】萌新看过来!一篇文章带你走进Linux世界
  • 【Qt】处理键盘事件
  • Spring-容器:IOC-基于注解管理Bean
  • C++11 --- 智能指针
  • 自然语言处理系列五十》文本分类算法》SVM支持向量机算法原理
  • 超详细!!!electron-vite-vue开发桌面应用之创建新窗口以及主进程和子进程的通信监听(十二)
  • (1)DRF项目服务器部署(Linux/Nginx/Uwsgi)
  • 数据结构---双向链表(内存泄露相关知识)