Android 之 串口通信
Android 串口通信主要用于与嵌入式设备(如传感器、打印机、工业控制器等)进行数据交互。以下是核心实现方案、代码示例及注意事项。
1. 串口类型
- 直接硬件串口:Android 设备自带串口(如
/dev/ttyS0
),常见于工业平板或定制设备。 - USB 转串口:通过 OTG 连接 USB 转串口适配器(需支持 USB Host 模式)
2、代码实现(以 licheedev
库为例)
1. 添加依赖
// build.gradle
dependencies {implementation 'com.github.licheedev:Android-SerialPort-API:2.0.0'
}
//仓库配置:在 settings.gradle 添加 maven { url "https://jitpack.io" }
2. 封装串口工具类
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 调用示例
public class MainActivity extends AppCompatActivity {private SerialPortHelper serialHelper;@Overrideprotected 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));});}}@Overrideprotected void onDestroy() {serialHelper.close(); // 关闭串口super.onDestroy();}
}