cl-6666 / serialPort

Android串口通信框架、串口框架
151 stars 26 forks source link

接收数据不完整丢失了 #33

Closed f262866551 closed 6 months ago

f262866551 commented 6 months ago

【警告:请务必按照 issue 模板填写】

问题描述

其他

f262866551 commented 6 months ago

应该不是波特率问题,波特率用的115200,之前自己写的用的是115200数据是能正常收发的

cl-6666 commented 6 months ago

你这个是粘包了,有二种处理方案 1.使用V3.1.7版本看一下是否满足你的业务需求,协议封装自己处理 2.自定义粘包处理,实现AbsStickPackageHelper接口

f262866551 commented 6 months ago

你这个是粘包了,有二种处理方案 1.使用V3.1.7版本看一下是否满足你的业务需求,协议封装自己处理 2.自定义粘包处理,实现AbsStickPackageHelper接口

AbsStickPackageHelper这个接口回调的数据也才只有六个

f262866551 commented 6 months ago

我想拿到最原始的数据该怎么做啊

f262866551 commented 6 months ago

我搞错了,谢谢了,知道怎么搞了

f262866551 commented 6 months ago

你这个是粘包了,有二种处理方案 1.使用V3.1.7版本看一下是否满足你的业务需求,协议封装自己处理 2.自定义粘包处理,实现AbsStickPackageHelper接口

有个问题,如果数据过长了,AbsStickPackageHelper是一段一段的返回,这种是不是只能协议上做处理啊

cl-6666 commented 6 months ago

数据很长的话 拼接一下数据就可以了 分段接收

f262866551 commented 6 months ago

数据很长的话 拼接一下数据就可以了 分段接收

好的谢谢

cl-6666 commented 5 months ago

最近经常有小伙伴遇到粘包问题,这里提供一个案例解决方案: 实现AbsStickPackageHelper方法,这里演示头部固定,长度固定的案例 ` public class HeadStickPackageHelper implements AbsStickPackageHelper { private final byte[] head; private final List bytes; private final int headLen;

public HeadStickPackageHelper(byte[] head) {
    this.head = head;
    if (head == null) {
        throw new IllegalStateException(" head or tail ==null");
    }
    if (head.length == 0) {
        throw new IllegalStateException(" head and tail length==0");
    }
    headLen = head.length;
    bytes = new ArrayList<>();
}

private boolean endWith(Byte[] src, byte[] target) {
    if (src.length < target.length) {
        return false;
    }
    for (int i = 0; i < target.length; i++) {
        if (target[target.length - i - 1] != src[src.length - i - 1]) {
            return false;
        }
    }
    return true;
}

private byte[] getRangeBytes(List<Byte> list, int start, int end) {
    Byte[] temps = Arrays.copyOfRange(list.toArray(new Byte[0]), start, end);
    byte[] result = new byte[temps.length];
    for (int i = 0; i < result.length; i++) {
        result[i] = temps[i];
    }
    return result;
}

@Override
public byte[] execute(InputStream is) {
    bytes.clear();
    int len = -1;
    byte temp;
    int startIndex = -1;
    byte[] result = null;
    boolean isFindStart = false;
    try {
        while ((len = is.read()) != -1) {
            temp = (byte) len;
            bytes.add(temp);
            Byte[] byteArray = bytes.toArray(new Byte[]{});
            if (headLen == 0) {//Only head or tail markers
                if (endWith(byteArray, head)) {
                    if (startIndex == -1) {
                        startIndex = bytes.size() - headLen;
                    } else {
                        result = getRangeBytes(bytes, startIndex, bytes.size());
                        break;
                    }
                }
            } else {
                if (!isFindStart) {
                    if (endWith(byteArray, head)) {
                        startIndex = bytes.size() - headLen;
                        isFindStart = true;
                    }
                } else {
                    //5代表你的数据长度,自己修改
                    if (startIndex + headLen <= bytes.size()-5) {
                        result = getRangeBytes(bytes, startIndex, bytes.size());
                        break;
                    }
                }
            }
        }
        if (len == -1) {
            return null;
        }
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
    return result;
}

}

`