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);
}
相关文章:
Android串口开发及读取完整数据的解决方法
串口发送实质就是向串口设备写入、读取字节流,和文件的操作很相似,安卓官方已经提供了android-serialport-api,在开源社区上也有很多衍生项目可以借鉴,本文介绍其中一种用法。 添加依赖 在Module下的 build.gradle 中添加: implementation com.aill:A…...
java之对象向下转型
java中,向下转型是为了重新获得因为向上转型而丢失的子类特性。在先下转型前,必须先进行向上转型。 语法格式如下 父类类型 父类对象子类实例 子类类型 子类对象(子类)父类对象 示例代码如下 class Animal01 {public void sh…...
ElasticSearch核心之DSL查询语句实战
什么是DSL? Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。目前常用的框架查询方法什么的底层都是构建DSL语句实现的,所以你必…...
Axure中继器:数据动态展示的强大工具
在Axure RP这一强大的原型设计工具中,中继器(Repeater)无疑是一颗璀璨的明珠。它以其独特的功能和广泛的应用场景,成为设计师在创建数据密集型原型时的首选。本文将深入探讨Axure中继器的特点、使用方式及其在数据动态展示中的重要…...
QT--聊天室
一、设计要求 用QT做一个聊天室, 制作一个服务器和客户端。可以进行注册、登录, 登陆成功后可以使用昵称进行发送、接收消息。 能根据昵称、聊天内容查询历史记录,也可以查询全部聊天记录。 。 二、客户端三级ui界面 三、项目代码 //在…...
Javascript前端面试基础4【每日学习并更新10】
同步和异步的区别 同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等…...
社区团购系统搭建开发,前端uniapp。社区团购搭建开发定制
目录 前言: 一、社区团购系统有哪些功能? 二、社区团购管理端 三、社区团购的基本流程如下: 总结 : 前言: 社区团购是一种以社区为单位进行的集体购物模式。这种模式利用了互联网平台来组织同一社区内的居民一起购…...
node+mysql+layui+ejs实现左侧导航栏菜单动态显示
nodemysqllayuiejs实现左侧导航菜单动态显示 实现思路效果图数据库技术栈代码实现main.html(前端首页页面)查询资源菜单方法 jsapp.js配置ejs模板 node入门到入土项目实战开始,前端篇项目适合node小白入门,因为我也是小白来学习no…...
FRP配置内网穿透52版本以上适用
简述 适用frp配置内网穿透来说我们需要进行简单的区分,具有公网IP的服务器我们简称为服务端,内网的服务器我们可以简称为客户端,frp需要针对不同的服务器配置不同的文件 下载安装包 Linux下载地址 https://github.com/fatedier/frp/relea…...
IFM易福门LR3000LR3300液位传感器操作说明
IFM易福门LR3000LR3300液位传感器操作说明...
【Python大语言模型系列】基于阿里云人工智能平台采用P-Tuning v2微调ChatGLM2-6B大模型(完整教程)
这是我的第331篇原创文章。 一、引言 P-Tuning 是一种对预训练语言模型进行少量参数微调的技术。所谓预训练语言模型,就是指在大规模的语言数据集上训练好的、能够理解自然语言表达并从中学习语言知识的模型。P-Tuning 所做的就是根据具体的任务,对预训练…...
基于Spring boot + Vue的加油站系统
项目名称:加油站系统 作者的B站地址:程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址:程序员云翼-CSDN博客 1.项目技术栈: 前后端分离的项目 后端:Springboot MybatisPlus 前端:Vue…...
️RPC协议 --基于TCP实现RPC通信
RPC 协议介绍 RPC(Remote Procedure Call,远程过程调用)协议是一种通信协议,允许一个程序调用另一个地址空间(通常是在网络上)的过程或函数,而不需要显式地处理细节如数据序列化和网络通信。它允许开发人员编写分布式应用程序,就像编写本地应用程序一样。 关键特点和组…...
android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion
1、先明白几个概念 (1)平台版本(Android SDK版本号) 平台版本也就是我们平时说的安卓8、安卓9、安卓10 (2)API级别(API Level) Android 平台提供的框架 API 被称作“API 级别” …...
Redis缓存穿透、击穿和雪崩的理解和解决思路
Redis的缓存穿透 缓存穿透是指那些查询请求所要获取的数据既不在缓存(Redis)中,也不在数据库(例如:MySQL)中,因此每次请求都会直接访问数据库。这种情况通常由以下几种情形引起: 恶…...
ReactHooks(完结)
上期戳here ReactHooks[三] 一.memo 函数1.1 语法格式 二. useMemo2.1 问题引入2.2 语法格式2.3 使用 useMemo 解决刚才的问题 三.useCallback3.1 useMemo和useCallback区别3.2 语法格式 四.useTransition4.1 问题引入4.2 语法格式4.3 使用 isPending 展示加载状态4.4 注意事项…...
【数据中台】大数据管理平台建设方案(原件资料)
建设大数据管理中台,按照统一的数据规范和标准体系,构建统一数据采集﹣治理﹣共享标准、统一技术开发体系、统一接口 API ,实现数据采集、平台治理,业务应用三层解耦,并按照统一标准格式提供高效的…...
UE5+OpenCV配置(Windows11系统)
一、概述 因为需要在UE5中使用OpenCV这些工具进行配置,所以在网络上参考借鉴一些资料进行配置。查询到不少的资料,最后将其配置成功。在这里顺便记录一下自己的配置成功的过程。 二、具体过程 (一)版本 使用Windows11系统、UE5.…...
自研Vue3开源Tree组件:节点拖拽bug修复
当dropType为after,且dropNode为父节点时,bug出现了: bug原因:插入扁平化列表的位置insertIndex计算的不对: 正确的逻辑,同inner要算上子孙节点所占的位置: bug修复!...
SSM学习9:SpringBoot简介、创建项目、配置文件、多环节配置
简介 SpringBoot式用来简化Spring应用的初始搭建以及开发过程的一个框架 项目搭建 File -> New -> Project 选中pom.xml文件,设置为maven项目 项目启动成功 可以访问BasicController中的路径 配置文件 在resources目录下 application.properties 默…...
VR-Reversal:打破设备限制,让3D视频在普通屏幕“活“起来
VR-Reversal:打破设备限制,让3D视频在普通屏幕"活"起来 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: htt…...
【2026年世界模型最全综述】:从开山之作到Sora与Genie 3
论文信息 标题:Understanding World or Predicting Future? A Comprehensive Surveyof World Models会议:ACM Computing Surveys 2026(计算机领域顶级综述期刊)单位:清华大学FIB-Lab代码:https://github.c…...
探索NHSE:解锁动物森友会存档编辑的终极解决方案
探索NHSE:解锁动物森友会存档编辑的终极解决方案 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE 你是否曾经在《动物森友会》中为收集稀有物品而苦恼?是否梦想打造一个完美…...
基于YOLOv8的AI自瞄项目完整配置指南
基于YOLOv8的AI自瞄项目完整配置指南 【免费下载链接】RookieAI_yolov8 基于yolov8实现的AI自瞄项目 AI self-aiming project based on yolov8 项目地址: https://gitcode.com/gh_mirrors/ro/RookieAI_yolov8 RookieAI_yolov8是一个基于YOLOv8目标检测技术实现的AI自瞄项…...
【笔试强训】Week5:空调遥控, kotor和气球,走迷宫,主持人调度II,体操队形,二叉树的最大路径和,排序子序列,消减整数
文章目录1. 空调遥控题目描述解题思路解法一:滑动窗口解法二:二分查找代码实现2. kotori和气球题目描述解题思路代码实现3. 走迷宫题目描述解题思路代码实现4. 主持人调度II题目描述解题思路代码实现5. 体操队形题目描述解题思路代码实现6. 二叉树的最大…...
Q-Learning原理与工程实践:从试错记账到智能决策
1. 这不是数学课,是教你怎么让机器“试错成长”——Q-Learning到底在干啥?你有没有带过小孩学骑自行车?一开始扶着后座,他歪歪扭扭往前冲,撞到草坪、蹭到墙边、甚至直接摔进灌木丛——但每次摔倒后,他都会下…...
皮线、裸纤总是分不清?试试这个算法一键校准技巧
不知道你有没有经历过这种工地上的"崩溃瞬间":大热天蹲在居民楼昏暗的楼道里,蚊子在耳边嗡嗡叫,你手里正拉着一根刚从住户门缝里拽出来的皮线光缆,准备跟分纤箱引出来的单模裸纤做熔接。结果放进机器,合上盖…...
CAXA 表格样式
位置属性和 CAD 类似默认【标准】自带,删不掉。预览常规-表格方向向上;向下;单元样式标题;表头;数据;【切换】对应下方 常规、文字的属性设置。常规【对齐】创建行时合并单元:文字命令位置先设置…...
5分钟掌握BepInEx游戏插件框架:Unity模组开发的完整解决方案
5分钟掌握BepInEx游戏插件框架:Unity模组开发的完整解决方案 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx(Bepis Injector Extensible࿰…...
工业边缘计算实战:基于Wind River Helix与App Cloud的云原生应用部署与管理
1. 项目概述:当工业边缘计算遇上云原生应用最近在跟几个做工业物联网和智能网关项目的朋友聊天,发现一个挺有意思的现象:大家手里的硬件平台越来越强,但软件开发和部署的效率却成了新的瓶颈。一个典型的场景是,你有一台…...
