Android 开发笔记 —— AndroidStudio 中使用 android-serialport-api 进行串口通讯

android-serialport-api 的下载地址:点击这里
最近有关于在 Android 上实现串口通讯的需求,肯定会牵涉到 JNI 相关,关于 JNI 相关知识请参考:
Android NDK开发(一) 入门
Android NDK开发(二) 底层实现HEX的编码和解码

一、创建 NDK 项目

这里在 AndroidStudio 中使用的是 CMark 工具,下载方法如下图所示:

CMake 的安装

然后创建一个新项目,勾选 C++,如下图所示:

NewProject1

别忘记也要勾选:

NewProject2

确认以上都勾选后,开始创建项目。

 注意:如果是中途项目需要导入 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 进行串口通讯就介绍完毕,有问题可以在评论处留言。
感谢阅读!

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android-SerialPort-API是一个用于在Android设备上进行串口通信的库。它允许开发者通过Android设备的串口接口与外部设备进行通信,例如与单片机、传感器等交互。 使用Android-SerialPort-API开发者可以方便地打开串口、设置波特率、读取和发送数据。首先,我们需要获取设备的串口号。通过使用`SerialPortFinder`类,我们可以获取到当前设备上的所有串口列表。然后,我们可以使用`SerialPort`类来打开指定的串口,并设置波特率、数据位、校验位和停止位等通信参数。 一旦成功打开了串口开发者就可以使用`InputStream`和`OutputStream`来读取和发送数据。`InputStream`用于从串口接收数据,我们可以通过调用`read()`方法来读取数据,或者使用`read(byte[] buffer)`方法将数据读取到指定的缓冲区。同样地,我们可以使用`OutputStream`来发送数据,通过调用`write(byte[] buffer)`方法将数据发送到串口。 除了基本的串口通信,Android-SerialPort-API还提供了一些其他的功能。例如,我们可以使用`SerialPortFinder`类来检查指定串口是否存在,还可以读取串口的某些属性,如波特率范围、数据位、校验位等。此外,Android-SerialPort-API还提供了一些串口相关的工具类,如CRC校验工具类,方便开发进行数据校验。 总结来说,Android-SerialPort-API开发者提供了简单、方便的方法来实现Android设备与外部设备的串口通信。通过它,我们可以轻松地与各种外部设备进行数据交互,为移动应用增加更多的扩展性和功能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值