用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();
                }
            }
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值