作为一款基于Android
的工控主板,很多时候网络通讯是不够的。万一客户机械臂只能提供串口呢?
本篇简单介绍Android
的串口通信(基于chrome的一个开源串口包 android_serialport_api
)。
Android串口通信
1.1 Step1 导入 android_serialport_api
android_serialport_api/SerialPort
2.2 Step2 在jniLibs/aemeabi
文件夹下导入android_serialport_api
的动态链接库 libserial_port.so
使用了
JNI
技术,使得Java
可以调用c语言写成的库
3.3 Step3 use it
package com.example.chenjy.serialport;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android_serialport_api.SerialPort;
public class MainBlogActivity extends AppCompatActivity {
// 串口实例
private SerialPort mSerialPort;
// 输出流
private OutputStream mOutputStream;
// 输入流
private InputStream mInputStream;
// 读取串口线程
private ReadThread mReadThread;
// 串口
private String sPort = "/dev/ttyUSB0";
// 波特率
private int iBaudRate = 115200;
private String receiveString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
mSerialPort = new SerialPort(new File(sPort), iBaudRate, 0);
mOutputStream = mSerialPort.getOutputStream();
mInputStream = mSerialPort.getInputStream();
mReadThread = new ReadThread();
// 启动读取串口线程
mReadThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读串口数据
*/
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
// 如果线程没有被中断,不断从串口读取数据
while (!isInterrupted()) {
if (mInputStream != null) {
byte[] buffer = new byte[512];
int size = 0;
try {
// 如果没有读到数据,则阻塞 直到返回数据
size = mInputStream.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
if (size > 0) {
byte[] buffer2 = new byte[size];
for (int i = 0; i < size; i++) {
buffer2[i] = buffer[i];
}
receiveString = SerialDataUtils.ByteArrToHex(buffer2).trim();
System.out.println("---- receive ---- :"+receiveString);
}
try {
//延时50ms
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return;
}
}
/**
* 发串口数据
*/
public void sendGetTemper() {
try {
// 测试用的3d打印机控制板 Gcode指令
String command = "M105
";
mOutputStream.write(command.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
//释放串口
mSerialPort.close();
super.onDestroy();
}
}
Tips: 网络通信程序是基于阻塞式API的 - 当程序输入、输出操作以后,在这些操作返回之前会一直阻塞该进程。