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

data0 = 0x01;

data1 = 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 byte12;

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

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

}

相关推荐
aqi0044 分钟前
鸿蒙版本的JSBridge兼容与安卓配套的H5啦
android·华为·harmonyos·鸿蒙·移动应用
事圆则缓2 小时前
MVVM 的理解与设计
android·android jetpack
码农阿豪3 小时前
我把 OpenClaw 装进旧安卓手机后,又折腾了 3 天:飞书、ADB、SSH 全部打通
android·智能手机·飞书
有什么事4 小时前
把安卓搬上云端:云手机系统改造与内核优化拆解
android·智能手机
方白羽4 小时前
性能分析:Android Studio Profiler
android·性能优化·app
没文化的阿浩5 小时前
【MySQL】用户管理
android·mysql·adb
FlightYe6 小时前
音视频修炼之基础理论(五):AAC格式与解析
android·linux·c++·音视频·aac
法欧特斯卡雷特6 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·开源·全栈
摇滚侠6 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 31
android·spring boot·笔记
Zeaon7 小时前
别再手写筛选栏了:一个可组合的 Flutter 选择组件(5 入口 × 7 委托)
android·flutter