Android 串口通信主要用于与嵌入式设备(如传感器、打印机、工业控制器等)进行数据交互。以下是核心实现方案、代码示例及注意事项。
1. 串口类型
- 直接硬件串口 :Android 设备自带串口(如
/dev/ttyS0
),常见于工业平板或定制设备。 - USB 转串口:通过 OTG 连接 USB 转串口适配器(需支持 USB Host 模式)
2、代码实现(以 licheedev
库为例)
1. 添加依赖
Groovy
// build.gradle
dependencies {
implementation 'com.github.licheedev:Android-SerialPort-API:2.0.0'
}
//仓库配置:在 settings.gradle 添加 maven { url "https://jitpack.io" }
2. 封装串口工具类
Groovy
import android.serialport.SerialPort;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class SerialPortHelper {
private SerialPort serialPort;
private InputStream inputStream;
private OutputStream outputStream;
// 打开串口
public boolean open(String devicePath, int baudRate, int dataBits, int stopBits, int parity) {
try {
serialPort = new SerialPort.Builder(new File(devicePath), baudRate)
.dataBits(dataBits) // 数据位(5~8)
.stopBits(stopBits) // 停止位(1或2)
.parity(parity) // 校验位(0:无, 1:奇, 2:偶)
.build();
inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
// 发送数据(十六进制指令)
public void send(String hexCommand) {
try {
byte[] data = hexStrToBytes(hexCommand);
outputStream.write(data);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
// 接收数据(循环监听)
public void startReading(DataReceivedListener listener) {
new Thread(() -> {
byte[] buffer = new byte[1024];
while (!Thread.interrupted()) {
try {
int size = inputStream.read(buffer);
if (size > 0) {
byte[] received = new byte[size];
System.arraycopy(buffer, 0, received, 0, size);
listener.onDataReceived(received);
}
} catch (IOException e) {
break;
}
}
}).start();
}
// 关闭串口
public void close() {
if (serialPort != null) {
serialPort.close();
}
}
// 十六进制字符串转字节数组
private byte[] hexStrToBytes(String hex) {
// 转换逻辑(参考[8](@ref))
}
public interface DataReceivedListener {
void onDataReceived(byte[] data);
}
}
3. Activity 调用示例
Groovy
public class MainActivity extends AppCompatActivity {
private SerialPortHelper serialHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
serialHelper = new SerialPortHelper();
// 打开串口(参数需根据硬件手册设置)
boolean success = serialHelper.open("/dev/ttyS1", 9600, 8, 1, 0);
if (success) {
// 发送指令(示例:AA 01 02 DD)
serialHelper.send("AA0102DD");
// 监听返回数据
serialHelper.startReading(data -> {
String hex = bytesToHex(data); // 字节转十六进制
runOnUiThread(() -> Log.d("SerialPort", "Received: " + hex));
});
}
}
@Override
protected void onDestroy() {
serialHelper.close(); // 关闭串口
super.onDestroy();
}
}