Android中简单串口通信开发

/ Android / 没有评论 / 1758浏览

Android中简单串口通信开发

该博文是博主第一次接触串口通信做的笔记,并没有详细地解析SerialPort类和SerialPortFinder类,如果感兴趣的话,可以参考Android串口通信:抱歉,学会它真的可以为所欲为,解释的挺详细的!

Demo已上传到GitHub

1. 介绍

首先来了解一下什么是串口:

串口即串行接口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

———— 摘自百度百科

在Android中,我们可以调用Unix的动态连接库(.so扩展名文件)来集成串口通信,这种调用的方式称为JNI(Java Native Interface,即Java本地接口)。

Google安卓官方已经提供了android-serialport-api 官方API,项目的具体结构如下: img

2. 集成项目

我们创建SerialPortDemoApp项目,将android-serialport-api项目中的jni和libs文件夹与android-serialport-api文件夹分别移动到SerialPortDemoApp中的app与src/main/java目录下,如下图所示:

img

然后配置app/build.gradle,设置.so文件的路径:

android {
        ...
    }
    sourceSets.main {
        jniLibs.srcDir 'libs'
    }
}

这样,我们就可以在Android进行开发串口的通信了。

3. 简单收发

3.1 接收

首先我们初始化SerialPortFinder,并创建SerialPort,打开串口:

mSerialPortFinder = new SerialPortFinder();
// 得到所有设备文件地址的数组
// 实际上该操作并不需要,这里只是示例打印出所有的设备信息
String[] entryValues = mSerialPortFinder.getAllDevicesPath();  

try {
    // 打开/dev/ttyUSB0路径设备的串口
    mSerialPort = new SerialPort(new File("/dev/ttyUSB0"), 9600, 0);
} catch (IOException e) {
    System.out.println("找不到该设备文件");
}

这样,我们可以从SerialPort对象中得到输入流,并开启一个子线程进行读取该设备传入的串口数据:

final InputStream inputStream = mSerialPort.getInputStream();
/* 开启一个线程进行读取 */
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            byte[] buffer = new byte[1024];
            int size = inputStream.read(buffer);
            byte[] readBytes = new byte[size];
            System.arraycopy(buffer, 0, readBytes, 0, size);
            
            System.out.println("received data => " + new String(readBytes));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

3.1 发送

发送数据时,我们只需要从SerialPort对象中得到OutputStream对象,写入字节数组数据即可:

// 开启子线程进行发送数据
new Thread(new Runnable() {
    @Override
    public void run() {
    
        String content = "Hello World";
        byte[] bytes = content.getBytes();
        OutputStream out = mSerialPort.getOutputStream();
        // 写入数据
        try {
            out.write(bytes);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

最后,可以看到这样进行串口通信的开发并不方便,需要自己创建线程,没有很好地处理其中的异常,我推荐大家可以参考一下GitHub上的AndroidSerialPort项目,代码很简单,使用也很方便!