首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 串口開發:與單片機通訊的完整實踐指南

     編輯:程式設計疑難解答

項目背景

公司需開發 Android App 控制單片機,進而操作電腦、投影儀等硬體設備的開關機。核心需求是建立穩定的串口通訊協議,實現指令下發與狀態反饋。

技術選型

  • serialport-api:Google 官方維護的串口庫,支援 USB/藍牙/內建串口
  • AndroidThings USB Host API:適用於 Android Things 設備
  • 自定義 JNI + Termios:底層控制靈活,但維護成本高

推薦使用 com.github.cevhero:serialport:1.0.2(基於 serialport-api 封裝),API 簡潔,支援 RxJava/Kotlin 協程。

通訊協議設計

雙方約定 帧格式:

[頭部][指令碼][數據長度][數據負載][校驗碼][尾部]
例:AA 01 00 03 01 02 03 FC 55
  • 指令碼:0x01=開機、0x02=關機、0x03=狀態查詢
  • 校驗:CRC16 或累加和,確保數據完整性
  • 應答機制:單片機收到指令後必須回 ACK(如 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,銷毀舊對象重新建立連接

進階優化

  1. 心跳機制:每 30 秒發送 0xFF 保活,檢測連接狀態
  2. 指令隊列:用 BlockingQueue 序列化發送,避免並發衝突
  3. 日誌加密:生產環境隱藏敏感指令碼,防止逆向分析

總結

Android 串口開發的核心在於 協議約定 與 異常處理。選用成熟庫、設計健壯的幀結構、實現超時重發與心跳,即可構建可靠的單片機控制系統。建議從 serialport-api 入手,逐步完善業務邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved