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

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3269476.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

由于误操作原因丢失了照片?6 款 Android 照片恢复应用程序可能有帮助

由于意外删除&#xff0c;软件故障&#xff0c;系统崩溃&#xff0c;恢复出厂设置或任何其他原因&#xff0c;您可能会丢失Android手机中的照片。无论如何&#xff0c;您仍然有很大的机会借助Android照片恢复应用程序恢复照片。有很多应用程序提供恢复支持&#xff0c;但并非所…

zeal 开发者离线文档工具

zeal是一款程序开发者不可或缺的离线文档查看器 下载地址 官网地址&#xff1a; windows版csdn下载&#xff1a;https://zealdocs.org/download.html#windows windows版官网下载&#xff1a;https://zealdocs.org/download.html#windows 下载压缩版&#xff0c;解压即用相对…

Matlab类阿克曼车机器人运动学演示

v1是后驱动轮轮速&#xff0c; v2是转向角变化速度&#xff0c; 实际上我们只需要关注XQ&#xff0c; YQ和Phi的变化率。 通过这三项和时间步长&#xff0c; 我们就可以计算出变化量&#xff0c; 再结合初始值就能推断出每个时刻的值。 % 清理当前运行环境 % 清除所有变量 cle…

搭建自己的金融数据源和量化分析平台(三):读取深交所股票列表

这里放出深交所爬虫模块的代码&#xff1a; # -*- coding: utf-8 -*- # 深圳交易所爬虫 import osimport pandas as pd import requests#读取最新深交所股票列表 def get_stock_list():cache_file_path "./sotck_file.xlsx"url "https://www.szse.cn/api/rep…

Passing output of 3DCNN layer to LSTM layer

题意&#xff1a;将3DCNN&#xff08;三维卷积神经网络&#xff09;层的输出传递给LSTM&#xff08;长短期记忆网络&#xff09;层 问题背景&#xff1a; Whilst trying to learn Recurrent Neural Networks(RNNs) am trying to train an Automatic Lip Reading Model using 3…

Linux基础I/O之文件描述符fd 重定向(下)

目录 四、文件描述符 4.1 文件描述符的内核本质 4.2 文件描述符的分配规则 五、重定向 四、文件描述符 在回忆起上述知识后&#xff0c;那么文件描述符到底是什么呢&#xff1f; 我们不难注意到&#xff0c;刚刚的open接口系统调用接口其实是有返回值的&#xff08;一个int…

FTP(File Transfer Protocal,文件传输协议)

文章目录 引言FTP管理工具FTP客户端FTP连接模式控制连接数据连接FTP命令/响应FTP命令FTP响应FTPSSFTP引言 FTP(File Transfer Protocal,文件传输协议)用于建立两台主机间的数据文件传输下载。使用客户/服务器(Client/Server)架构,基于TCP协议,服务端口为21。 FTP链接…

17.延迟队列

介绍 延迟队列&#xff0c;队列内部是有序的&#xff0c;延迟队列中的元素是希望在指定时间到了以后或之前取出和处理。 死信队列中&#xff0c;消息TTL过期的情况其实就是延迟队列。 使用场景 1.订单在十分钟内未支付则自动取消。 2.新创建的店铺&#xff0c;如果十天内没…

行锁表锁都是渣渣,元数据锁才是隐藏大佬

什么是元数据锁&#xff1f; 英文名叫Metadata Lock&#xff0c;缩写为MDL&#xff0c;顾名思义&#xff0c;它是针对元数据的一种锁&#xff0c;锁的是元数据。 那什么是元数据&#xff1f; 一张表有100条记录&#xff0c;这里的记录我们可以称之为表数据&#xff0c;一张表…

深入了解:MinIO 企业对象存储的可观察性

可观测性是指收集信息&#xff08;跟踪、日志、指标&#xff09;&#xff0c;以提高性能、可靠性和可用性为目标。很少有人能确定其中一个事件的根本原因。通常情况下&#xff0c;当我们将这些信息关联起来形成叙述时&#xff0c;我们就会有更好的理解。从一开始&#xff0c;Mi…

7.27扣...

知识点补充&#xff1a; 1.StringBuilder StringBuilder 类在 Java 中是一个可变字符序列。与 String 类不同&#xff0c;StringBuilder 可以在创建之后被修改。这意味着你可以向 StringBuilder 对象追加、插入或删除字符&#xff0c;而不需要创建新的对象&#xff08;辅助数…

池化层pytorch最大池化练习

神经网络构建 class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.maxpool1 MaxPool2d(kernel_size3, ceil_modeFalse)def forward(self, input):output self.maxpool1(input)return output Tensorboard 处理 writer SummaryWriter("./l…

F4A0手把手教程1: 华大单片机HC32F4A0如何新建工程(ddl库版本)

开发板请点击&#xff1a;https://item.taobao.com/item.htm?spma21n57.1.item.3.5fc760c3ycChCu&priceTId2150418a17219238749041878ec06d&utparam%7B%22aplus_abtest%22:%222166044947a45798ae4c3d102fcea719%22%7D&id707262644934&ns1&abbucket20 准备…

高速板开源工程的学习(一)

泰山派NAS-原理图和PCB设计经验分享-塞塞哇 (saisaiwa.com) BGA扇出的时候千万小心&#xff0c;导线到焊盘的距离大于0.1MM,千万小心&#xff0c;不然会寄寄的&#xff0c;这个在设计规则里面可以设置&#xff1a; 这种就容易造成阻焊开窗的误判&#xff0c;是很不规范的&…

PyTorch+AlexNet代码实训

参考文章&#xff1a;https://blog.csdn.net/red_stone1/article/details/122974771 数据集&#xff1a; 打标签&#xff1a; import os# os.path.join: 每个参数都是一个路径段&#xff0c;将它们连接起来形成有效的路径名。 train_txt_path os.path.join("data"…

浅谈HOST,DNS与CDN

首先这个是网络安全的基础&#xff0c;需得牢牢掌握。 1.什么是HOST HOSTS文件&#xff1a; 定义&#xff1a; HOSTS文件是一个操作系统级别的文本文件&#xff0c;通常位于操作系统的系统目录中&#xff08;如Windows系统下的C:\Windows\System32\drivers\etc\hosts&#xf…

java数据结构(1):集合框架,时间,空间复杂度,初识泛型

目录 一 java数据结构的集合框架 1.什么是数据结构 2.集合框架 2.1什么是集合框架&#xff1a; 1. 接口 (Interfaces) 2. 实现类 (Implementations) 3. 算法 (Algorithms) 4. 并发集合 (Concurrent Collections) 2.2集合框架的优点&#xff1a; 二 时间和空间复杂度 …

请你谈谈:spring AOP的浅显认识?

在Java面向对象编程中&#xff0c;解决代码重复是一个重要的目标&#xff0c;旨在提高代码的可维护性、可读性和复用性。你提到的两个步骤——抽取成方法和抽取类&#xff0c;是常见的重构手段。然而&#xff0c;正如你所指出的&#xff0c;即使抽取成类&#xff0c;有时仍然会…

【Redis宕机啦!】Redis数据恢复策略:RDB vs AOF vs RDB+AOF

文章目录 Redis宕机了&#xff0c;如何恢复数据为什么要做持久化持久化策略RDBredis.conf中配置RDBCopy-On-Write, COW快照的频率如何把握优缺点 AOFAOF日志内容redis.conf中配置AOF写回策略AOF日志重写AOF重写会阻塞吗优缺点 RDB和AOF混合方式总结 Redis宕机了&#xff0c;如何…

Spring Bean - xml 配置文件创建对象

类型&#xff1a; 1、值类型 2、null &#xff08;标签&#xff09; 3、特殊符号 &#xff08;< -> < &#xff09; 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…