公司需開發 Android App 控制單片機,進而操作電腦、投影儀等硬體設備的開關機。核心需求是建立穩定的串口通訊協議,實現指令下發與狀態反饋。
推薦使用 com.github.cevhero:serialport:1.0.2(基於 serialport-api 封裝),API 簡潔,支援 RxJava/Kotlin 協程。
雙方約定 帧格式:
[頭部][指令碼][數據長度][數據負載][校驗碼][尾部]
例:AA 01 00 03 01 02 03 FC 55
AA 01 00 01 00 FC 55),App 超時重發 3 次// 打開串口
SerialPort serialPort = new SerialPort.Builder()
.setDevice("/dev/ttyUSB0")
.setBaudRate(9600)
.setDataBits(8)
.setStopBits(1)
.setParity(0)
.build();
serialPort.open(new SerialPort.OpenCallback() {
@Override public void onSuccess() {
// 發送指令
byte[] cmd = Protocol.buildOpenCmd();
serialPort.writeBytes(cmd);
}
@Override public void onFailure(Exception e) { /* 處理錯誤 */ }
});
// 監聽數據接收
serialPort.addDataListener(data -> {
if (Protocol.verify(data)) {
runOnUiThread(() -> updateUI(Protocol.parse(data)));
}
});
| 問題 | 原因 | 解決方案 |
|---|---|---|
| 權限被拒 | 未聲明 android.hardware.usb.host 或未彈出授權對話框 | Manifest 添加 <uses-feature android:name="android.hardware.usb.host"/>,運行時請求權限 |
| 數據亂碼/丟包 | 波特率不匹配、讀取緩衝區過小 | 雙方確認波特率一致;增大 setReadBufferSize(4096) |
| 斷開重連失敗 | USB 設備熱拔插導致文件描述符失效 | 監聽 UsbManager.ACTION_USB_DEVICE_DETACHED,銷毀舊對象重新建立連接 |
BlockingQueue 序列化發送,避免並發衝突Android 串口開發的核心在於 協議約定 與 異常處理。選用成熟庫、設計健壯的幀結構、實現超時重發與心跳,即可構建可靠的單片機控制系統。建議從 serialport-api 入手,逐步完善業務邏輯。