Android 开发笔记 —— AndroidStudio 中使用 android-serialport-api 进行串口通讯
16lz
2021-01-23
android-serialport-api 的下载地址:点击这里
最近有关于在 Android 上实现串口通讯的需求,肯定会牵涉到 JNI 相关,关于 JNI 相关知识请参考:
Android NDK开发(一) 入门,
Android NDK开发(二) 底层实现HEX的编码和解码。
一、创建 NDK 项目
这里在 AndroidStudio 中使用的是 CMark 工具,下载方法如下图所示:
然后创建一个新项目,勾选 C++,如下图所示:
别忘记也要勾选:
确认以上都勾选后,开始创建项目。
注意:如果是中途项目需要导入 NDK 可按照如下步骤拷贝:
1、在 app 的 gradle 文件内拷贝如下脚本:
android{ defaultConfig{ externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" } } } externalNativeBuild { cmake { path "CMakeLists.txt" } }}
2、在项目的 local.properties 文件下加入如下脚本:
# 指定 NDK 文件夹ndk.dir=E\:\\App\\Android-sdk\\ndk-bundle
3、拷贝 CMakeLists.txt 文件到新项目中
二、导入文件
1、拷贝必要文件到自己的项目中,如下图所示:
图中画横线的 SerialPort.c 及 SerialPort.java 是必要文件,SerialPortFinder.java 用于查找串口设备,如果知道串口路径则无需导入。
将 SerialPort.c 文件拷贝到 src/main 目录下的 cpp 文件夹,没有则创建。
2、编辑 CMake 脚本,添加如下代码:
# 每次创建一个新的库,需要添加另一个 add_library() 脚本,每个add_library 脚本语句只能导入一个库add_library(serial_port SHARED src/main/cpp/SerialPort.c)
如果同步报 Log 日志异常则需要给 .c 文件导入 Log 库,具体导入方法如下:
# 该语句可以给一个 .c 库文件导入多个依赖库target_link_libraries( # Specifies the target library. # add_library 生成的 serial_port # Links the target library to the log library # included in the NDK. # find_library 找到的系统库 ${log-lib} )
默认是已经有导入 log-lib 库的,如果没有的话则需要在上面代码之前导入 log-lib 库,如下所示:
# find_library 定义当前代码库需要依赖的系统或者第三方库文件find_library( # Sets the name of the path variable. # 指定要查找的系统库, 给一个名字 log-lib # Specifies the name of the NDK library that # you want CMake to locate. # 真正要查找的liblog.so或者liblog.a log )
当完成以上步骤后,就已经完成文件的导入了。
三、串口通讯操作
此处只对串口读写进行简单封装,代码如下所示(代码为 Kotlin):
class SerialPortModule(file: File, baudrate: Int, flags: Int) { // 串口 private var mSerialPort = SerialPort(file, baudrate, flags) /** * 写入串口数据 */ fun writePort(data:ByteArray) { doAsync { val mOutputStream = mSerialPort.outputStream try { mOutputStream.write(data) Log.i(javaClass.simpleName, "写入成功!") } catch (e: IOException) { Log.i(javaClass.simpleName, "写入失败!") e.printStackTrace() } } } /** * 读取串口数据 * * @param callback 回调接口 */ fun readPort(callback: OnResultListener?) { doAsync { while (true){ val size: Int val mInputStream = mSerialPort.inputStream try { val buffer = ByteArray(256) size = mInputStream.read(buffer) if (size > 0) Log.i(javaClass.simpleName, "接收到的数据:" + buffer.toString(Charset.defaultCharset())) callback?.onReceived(buffer) Log.i(javaClass.simpleName, "接收成功!") } catch (e: IOException) { e.printStackTrace() Log.i(javaClass.simpleName, "接收失败!") } } } } /** * 关闭串口 */ fun close() { mSerialPort.close() } /** * 结果监听器 */ interface OnResultListener { /** * 当接收到数据时 * * @param data 接收的数据 */ fun onReceived(data: ByteArray) }}
到此使用 android-serialport-api 进行串口通讯就介绍完毕,有问题可以在评论处留言。
感谢阅读!
更多相关文章
- Android Studio的Gradle文件方法说明
- Android的文件系统
- 让Android中的webview支持页面中的文件上传
- Android 文件布局一些细节备忘
- Android 使用grade实现Android 项目debug版与release版共存
- Android布局文件的属性值解析
- Android 文件的保存与读取之自带储存空间
- Google 将 Android 4.0.4 源代码送交 AOSP 开源项目
- 分析脚本文件AndroidInitProcess分析心得(1)