SerialPortUtil
提示
最新版本
3.0.+
已发布,其对比2.0.+
版本,API有了很大改动,且修复了很多bug,并带来一些新的特性,优化使用步骤。强烈建议切换至3.0.+
版本。
- 使用文档
3.0.+ 使用文档- 源码仓库
GitHub仓库Gitee仓库
介绍
SerialPortUtil 简介
SerialPort 是一个开源的对 Android 蓝牙串口通信的轻量封装库,轻松解决了构建自己的串口调试APP的复杂程度,让人可以专注追求自己设计,不用考虑蓝牙串口底层的配置。
- 集成搜索Activity,不用自己费力去实现
- 通过回调处理接收数据
- 异步处理发送
- 接收与发送均可使用十六进制和字符串
特性
最新版本 V2.0.3
- 新特性:
- 接收消息通过Service接收
- 新增连接状态时可获取设备名和地址
- 移除扫描状态获取
- 发送类型修改为字符类型时自动取消输入框的十六进制监听
- 修复:
- 连接状态监听的bug
- 接收消息时,内容有缺失的问题
- SearchActivity 权限申请弹窗被覆盖,导致没有获取权限
- SearchActivity 可用设备列表标题显示
- More than one file was found with OS independent path ‘META-INF/library_release.kotlin_module’
开源仓库地址
Demo例程源码
开始
安装
Gradle
根目录 build.gradle 加入以下代码:
allprojects {
repositories {
// 省略其代码...
maven { url 'https://jitpack.io' }
}
}
app模块的 build.gradle 加入以下代码即可:
dependencies {
// 省略其代码...
implementation 'com.github.Shanyaliux:SerialPortUtils:V2.0.3'
}
使用
Tips:
以下所有代码块,第一块是Java语法,第二块是Kotlin语法
获取 SerialPort 对象
SerialPort serialPort = SerialPort.Companion.getInstance(this);
val serialPort = SerialPort.getInstance(this)
以上代码创建了一个SerialPort
实例。
打开搜索页面
serialPort.openSearchPage();
serialPort.openSearchPage()
以上代码打开内部的搜索页面。该页面通过下拉操作进行搜索新设备。如下图所示:
搜索设备
serialPort.doDiscovery();
serialPort.doDiscovery()
以上代码执行搜索设备操作
获取已配对设备列表
ArrayList<Device> arrayList = serialPort.getPairedDevicesList();
val arrayList = serialPort.pairedDevicesList
以上代码获取已配对设备列表,其中Device
是一个数据类,包含已配对设备的名字和地址,以下代码说明如何从Device
获取信息
//获取设备名字
String name = device.name
//获取设备地址
String address = device.address
//获取设备名字
val name = device.name
//获取设备地址
val address = device.address
获取未配对设备列表
ArrayList<Device> arrayList = serialPort.getUnPairedDevicesList();
val arrayList = serialPort.unPairedDevicesList
获取连接状态
//其中device是已连接的设备信息(包含name和address)
serialPort.getConnectedStatus((aBoolean, device) -> {
if (aBoolean) {
//已连接
} else {
//未连接
}
return null;
});
serialPort.getConnectedStatus { status, device ->
if (status) {
//已连接
} else {
//未连接
}
}
以上代码就是获取连接状态
设置接收数据类型
可选参数(默认是 字符类型) | |
SerialPort.READ_STRING | 字符类型 |
SerialPort.READ_HEX | 十六进制 |
serialPort.setReceivedDataType(SerialPort.READ_HEX);
serialPort.setReceivedDataType(SerialPort.READ_HEX)
以上代码将接收数据的类型切换为十六进制
设置发送数据类型
可选参数(默认是 字符类型) | |
SerialPort.SEND_STRING | 字符类型 |
SerialPort.SEND_HEX | 十六进制 |
serialPort.setSendDataType(SerialPort.SEND_HEX);
serialPort.setSendDataType(SerialPort.SEND_HEX)
以上代码将发送数据的类型切换为十六进制
十六进制输入的监听
如果你要发送十六进制的数据类型,需要按一定的要求进行输入。
每一个十六进制需要保持两位,不足两位的需要在前面补0,中间间隔一个空格,比如:A8 0D
或者对输入框添加监听器进行自动限制输入
serialPort.setEditTextHexLimit(editTextSend);
serialPort.setEditTextHexLimit(editTextSend)
以上代码为名为editTextSend
的EditText
对象添加了十六进制监听器
发送数据
- 发送字符型
//从输入框发送
serialPort.sendData(editTextSend.getText().toString());
//代码发送
serialPort.sendData("Hello World!");
//从输入框发送
serialPort.sendData(editTextTextSend.text.toString()
//代码发送
serialPort.sendData("Hello World!")
- 发送十六进制
//从输入框发送
serialPort.sendData(editTextSend.getText().toString());
//代码发送 0xA5、0x0D
serialPort.sendData("A5 0D");
//从输入框发送
serialPort.sendData(editTextTextSend.text.toString()
//代码发送 0xA5、0x0D
serialPort.sendData("A5 0D")
接收数据
serialPort.getReceivedData(new Function1<String, Unit>() {
@Override
public Unit invoke(String s) {
// s 就是收到的数据
return null;
}
});
serialPort.getReceivedData{it
// it 就是收到的数据
}