用android_serialport_api遇到的问题以及解决方法

最近用Android系统做串口的项目,用到了开源的android_serialport_api库。在用这个库遇到了各种问题,各种坑。在这总结一下。

1、引入so库
把android_serialport_api中的jni和libs两个文件拷到项目中,如图所示
这里写图片描述

2、找不到so

 要解决这个问题,要在build.gradle的android标签中加入如下代码
 sourceSets{
        main(){
            jniLibs.srcDirs = ['libs']
        }
    }

3、包名的问题
这里写图片描述

4、数据接收不完整
在接收数据的时候,发现数据总是接收不完整。后来经过调试发现一条数据有时候不是一次接收完,有可能分几次来接收(为什么会这样子,我也不太清楚,希望哪位大神帮我解决一下)。为了解决问题就要规范数据的传输协议,必须要包含包头和包尾。比如我的项目,每次传5个字节,包头为0xff,包尾为0x11。定义一个list集合用来存接收到的数据,代码如下

class MyThread extends Thread {
        @Override
        public void run() {
            List<Byte> dataReceived = new ArrayList<>();
            while (true) {
                int size;
                try {
                    byte[] buffer = new byte[16];
                    if (mInputStream == null) continue;
                    size = mInputStream.read(buffer);
                    if (size > 0) {
                        if (buffer[0] == 0x0f) {
                            for (int i = 0; i < size; i++) {
                                if (buffer[i] == 0x11 && dataReceived.size() == 4) {
                                    //说明数据结束了
                                    /数据接收完后,做你想做的事情
                                    //最后记得清空集合
                                    dataReceived.clear();
                                } else {
                                     //数据还没结束,存入集合中
                                    dataReceived.add(buffer[i]);
                                }
                            }
                        } else {
                            if (dataReceived.size() > 0 && (dataReceived.get(0) == 0x0f)) {
                                for (int i = 0; i < size; i++) {
                                    if (buffer[i] == 0x11 && dataReceived.size() == 4) {
                                        //说明数据结束了
                                        //数据接收完后,做你想做的事情
                                        //最后记得清空集合
                                        dataReceived.clear();
                                    } else {
                                       //数据还没结束,存入集合中
                                        dataReceived.add(buffer[i]);
                                    }
                                }
                            } else {
                                dataReceived.clear();
                                continue;
                            }
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/wuqingyou_w/article/details/68062668