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

Android串口开发及读取完整数据的解决方法

串口发送实质就是向串口设备写入读取字节流,文件操作很相似,安卓官方已经提供了android-serialport-api,在开源社区上也有很多衍生项目可以借鉴,本文介绍其中一种用法。

  • 添加依赖

在Module下的 build.gradle 中添加:

implementation 'com.aill:AndroidSerialPort:1.0.8'

  • 检测权限

首先要有ROOT权限,而且打开串口时,检测读写权限,当没有权限时,会尝试对其进行授权,默认su路径是/system/bin/su,有些设备su路径是/system/xbin/su:

SerialPort.setSuPath("/system/xbin/su");

  • 串口打开及关闭

/**

* @param 1 串口路径

* @param 2 波特率  

*@param 3 flags 给0就好

 */

SerialPort serialPort = new SerialPort(new File("/dev/ttyS1"), 9600, 0);

//关闭串口

serialPort.close();

  • 往串口中写入数据

//从串口对象中获取输出流

OutputStream outputStream = serialPort.getOutputStream();

//定义需要发送的数据

byte[] data = new byte[2];

data[0] = 0x01;

data[1] = 0x02;

//写入数据

outputStream.write(data);

outputStream.flush();

五、读取串口数据

读取数据时候会遇到不能一次性读取正确的完整的数据,可以这样解决:

1、在开始读取数据前,让读取数据的线程先睡眠一段时间,等待数据都准备好,再开始读取出来,这样应该可以避免大部分的分包情况

2、如果是固定的数据长度,循环读取完固定长度的字节数据再退出

//从串口对象中获取输入流

InputStream inputStream = serialPort.getInputStream();

//循环读取数据,放到子线程去,避免堵塞主线程

boolean readContinue=true;

new Thread(new Runnable() {

    @Override

    public void run() {

while (readContinue) {

      if (inputStream.available() > 0) {

         //等待一段时间再读取数据,基本上大部分情况下都是完整的数据

         Thread.sleep(50);

         byte[] buffer = new byte[12];

    int readCount=0;

    int availableCount=inputStream.available();

//每次接收都是固定长度的字节

  while (readCount < 12 && availableCount > 0) {

              readCount += inputStream.read(buffer, readCount, 12 -readCount);

              Thread.sleep(5);

              availableCount = inputStream.available();

           }

        }

       }

  }

}).start();

3、在实际开发中,有一种应用场景是先发送数据到开发板,开发板再响应返回数据,而且是循环发送读取数据,时间间隔要求极其短,很可能出现了数据错乱情况,可以先在发送数据前判断输入流中有无数据,有数据时先读取完流中的数据。

while (readContinue) {

//判断输入流中有无数据,有数据先读取完清空缓冲,即清空残留数据

    while (inputStream.available() > 0) {

            byte[] buffer = new byte[12];

     inputStream.read(buffer);

     Thread.sleep(5);

    }

//写入数据

outputStream.write(data);

outputStream.flush();

//开始读数据及其他操作

while (readCount < 12 && availableCount > 0) {

              readCount += inputStream.read(buffer, readCount, 12 -readCount);

              Thread.sleep(5);

              availableCount = inputStream.available();

           }

Thread.sleep(100);

}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vite项目中根据不同打包命令配置不同的后端接口地址,proxy解决跨域
  • Linux中的文件操作
  • 学习java的设计模式
  • XPathParser类
  • 【React】详解如何获取 DOM 元素
  • 【图解网络】学习记录
  • 每日OJ_牛客CM26 二进制插入
  • 【模型】LightGBM
  • OCC BRepOffsetAPI_ThruSections使用
  • UVM_ERROR: SEQREQZMB解决方案
  • <设计模式> 工厂模式
  • 【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
  • Photos框架 - 自定义媒体选择器(UI列表)
  • 您需要了解的有关 5G 的一切。
  • 大数据之Oracle同步Doris数据不一致问题
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【剑指offer】让抽象问题具体化
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • JavaWeb(学习笔记二)
  • Linux中的硬链接与软链接
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SpringBoot几种定时任务的实现方式
  • SQL 难点解决:记录的引用
  • Vue全家桶实现一个Web App
  • vue数据传递--我有特殊的实现技巧
  • XForms - 更强大的Form
  • 从tcpdump抓包看TCP/IP协议
  • 解析带emoji和链接的聊天系统消息
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • #### go map 底层结构 ####
  • (1)Hilt的基本概念和使用
  • (19)夹钳(用于送货)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (poj1.2.1)1970(筛选法模拟)
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (原)Matlab的svmtrain和svmclassify
  • (转)ABI是什么
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • *** 2003
  • *上位机的定义
  • .Net Core 中间件与过滤器
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net开发时的诡异问题,button的onclick事件无效
  • .Net小白的大学四年,内含面经
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @GlobalLock注解作用与原理解析
  • [1204 寻找子串位置] 解题报告
  • [BJDCTF2020]The mystery of ip1
  • [C++]:for循环for(int num : nums)