该博文是博主第一次接触串口通信做的笔记,并没有详细地解析SerialPort类和SerialPortFinder类,如果感兴趣的话,可以参考Android串口通信:抱歉,学会它真的可以为所欲为,解释的挺详细的!
1. 介绍
首先来了解一下什么是串口:
串口即串行接口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
———— 摘自百度百科
在Android中,我们可以调用Unix的动态连接库(.so
扩展名文件)来集成串口通信,这种调用的方式称为JNI(Java Native Interface,即Java本地接口)。
Google安卓官方已经提供了android-serialport-api 官方API,项目的具体结构如下:
- jni中存放了JNI调用的C/C++文件。
- libs存放了
.so
文件,是由C/C++编译而来的。 - src中的
SerialPort.java
和SerialPortFinder.java
是提供Java开发的类。
2. 集成项目
我们创建SerialPortDemoApp项目,将android-serialport-api项目中的jni和libs文件夹与android-serialport-api
文件夹分别移动到SerialPortDemoApp中的app与src/main/java目录下,如下图所示:
然后配置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项目,代码很简单,使用也很方便!