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);
}

}*/

相关推荐
李堇2 小时前
android滚动列表VerticalRollingTextView
android·java
lxysbly3 小时前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者86 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20356 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥7 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓7 小时前
[JDBC]元数据
android
独行soc7 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能7 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿7 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc8 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮