之前开发过的android程序想添加串口功能,找了些资料,更新程序后把把NDK功能也添加了进来,简单的一个程序变了杂乱许多,所以简记一下串口功能。

git android串口通讯url:https://github.com/cepr/android-serialport-api,开源项目已十年未更新。
环境:mac os
开发环境:android studio 4.1

CMake:Android Studio 编译原生库的默认构建工具,可与 Gradle 搭配使用来构建原生库。
使用CMake为项目添加串口通讯功能只需四步,其实四步就足够:


1:创建jni文件夹:(文件在app目录下创建,右键->new->folder->jni)
加入SerialPort.c,和SerialPort.h文件,
文件url:https://github.com/cepr/android-serialport-api/tree/master/android-serialport-api/project/jni


2:创建java:package:android_serialport_api,加入SerialPort.java,SerialPortFinder.java文件,文件url:https://github.com/cepr/android-serialport-api/tree/master/android-serialport-api/project/src/android_serialport_api


3:创建cmakefile文件

cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
             serial_port

             # Sets the library as a shared library.
             SHARED

             # 此处路径需与本地路径相同
             src/main/jni/SerialPort.c )
find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )
target_link_libraries( # Specifies the target library.
                       serial_port

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

4:修改项目build.gradle文件,为项目加入c编译功能:添加两项属性,
1:defaultConfig下
        

        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }


2:defaultConfig同层次
    

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }        


    
添加完成会有个gradle:configure project的过程。    
    
============================
测试方法如下:
    

//初始化串口
    private void initComPort() {
        Log.e("TAG", "-------初始化串口");
        mCom = new SerialControl();
//设置读取串口,每个设备不同。
        mCom.setPort("/dev/ttyS4");
        mCom.setBaudRate("115200");
    }

    //开启串口
    private void openComPort() {
        try {
            mCom.open();
            Log.e("TAG", "-------开启串口");
        } catch (SecurityException e) {
            Log.i(TAG, "打开串口失败:没有串口读/写权限!");
        } catch (IOException e) {
            Log.i(TAG, "打开串口失败:未知错误!");
        } catch (InvalidParameterException e) {
            Log.i(TAG, "打开串口失败:参数错误!");
        }
    }

    //关闭串口
    private void closeComPort() {
        Log.e("TAG", "------------关闭串口");
        if (mCom != null) {
            mCom.stopSend();
            mCom.close();
        }
    }


    private class SerialControl extends SerialHelper {
        public SerialControl() {
        }

        //接收数据处理
        @Override
        protected void onDataReceived(final String receiveData) {
            Log.e("SerialInfo",receiveData);
        }
    }


    private void sendSerialMessage(String sendData) {

        mCom.send(ByteUtils.hexStr2Byte(sendData));


    }    

单纯使用会是比较简单的。其实是底层c编译和串口交互,拿到串口的输出输入流对象,然后对串口进行收发控制。注:8.0以上在AndroidManifest.xml里加上 android:process=“system” android:sharedUserId=“android.uid.system” 

 

源码下载

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐