Android 与板的串口通讯

        之前做过一个Android项目,是Android与板之间的通讯,用的是串口通讯,功能是Android发出指令打开对应的智能箱子.通常做串口通讯都会参考官方给出的文档  https://github.com/cepr/android-serialport-api,但是这个文档太旧了,没人维护,而且只支持Android6.0以下的设备。如果你想使用要么就是设置 targetSdkVersion<23,或者使用.so,这个可以支持Android6.0以上的设备

   1.按照文档配置好jni的路劲  

gradle 添加 

     ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }

.so文件路劲

Android 与板的串口通讯_第1张图片

  2.配置SerailPort 和SerailPortFinder,包名和路劲都要对

这里有关于jni的调用

 

//============== JNI=========================================
/**
 * 打开串口设备的方法
 * @param path 设备的绝对路径
 * @param baudrate 波特率
 * @param flags 标志
 * @return
 */
private native static FileDescriptor open(String path, int baudrate, int flags);
//关闭设备
public native void close();
//加载库文件
static {
   System.loadLibrary("serial_port");
}

3.打开,发送,关闭串口

 /**
     * 打开串口
     */
    public static boolean open(SerialPortSendData sendData) {
        boolean isopen = false;
        try {
            mSerialPort = getSerialPort("/dev/ttyS4", 115200);
            mInputStream = mSerialPort.getInputStream();
            mOutputStream = mSerialPort.getOutputStream();
            receive();

        } catch (IOException e) {
            e.printStackTrace();
            isopen = false;
        }
        return isopen;
    }

    /**
     * 关闭串口
     */
    public static boolean close() {
        boolean isClose = false;
//        L.info("DevicesUtils -- 关闭串口");
        try {
            if (mInputStream != null) {
                mInputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return isClose;
    }

    /**
     * 发送串口指令
     */
    public static void sendString(String data, Handler handler) {
        mHandler = handler;
        try {
            Log.i("DevicesUtils","发送串口指令--sendSerialData==" + data);
            mOutputStream.write(StringUtils.hexStringToBytes(data));
            mOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
            Log.i("DevicesUtils","发送串口指令异常 ");
        }
    }



    /**
     * 接收串口数据的方法
     */
    public static void receive() {
        receiveThread = new Thread() {
            @Override
            public void run() {
                try {
                    byte[] readData = new byte[1024];
                    if (mInputStream == null) {
                        return;
                    }
                    int size = mInputStream.read(readData);
                    if (size > 0) {
                        strData = StringUtils.bytesToHexString(readData, size);
                        Log.i("DevicesUtils","mInputStream.read之后");
                        strData = strData.replaceAll(" ","");
                        Message msgs = mHandler.obtainMessage();
                        msgs.obj = strData;
                        switch (strData.substring(6, 8)) {
                            case "00":
                                msgs.what = 0x00;
                                break;
                            case "01":
                                msgs.what = 0x01;
                                break;
                        }
                        mHandler.sendMessage(msgs);

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        receiveThread.start();
    }




    /**
     * 获取到串口通信的一个实例
     *
     */
    public static SerialPort getSerialPort(String path, int baudrate)
            throws SecurityException, IOException, InvalidParameterException {
        /* Check parameters */
        if ((path.length() == 0) || (baudrate == -1)) {
            throw new InvalidParameterException();
        }
        /* Open the serial port */
        mSerialPort = new SerialPort(new File(path), baudrate, 0);// 打开这个串口
        return mSerialPort;
    }

你可能感兴趣的:(Android 与板的串口通讯)