蓝色风格企业网站,电子商务网站建设实训室简介,wordpress 导出数据,山东手机网站建设公司串口发送实质就是向串口设备写入、读取字节流#xff0c;和文件的操作很相似,安卓官方已经提供了android-serialport-api,在开源社区上也有很多衍生项目可以借鉴#xff0c;本文介绍其中一种用法。
添加依赖
在Module下的 build.gradle 中添加:
implementation com.aill:A…串口发送实质就是向串口设备写入、读取字节流和文件的操作很相似,安卓官方已经提供了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 readContinuetrue;
new Thread(new Runnable() { Override public void run() {
while (readContinue) { if (inputStream.available() 0) { //等待一段时间再读取数据基本上大部分情况下都是完整的数据 Thread.sleep(50); byte[] buffer new byte[12]; int readCount0; int availableCountinputStream.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);
}