Android 串列埠通訊

Deemons發表於2018-06-02

annie-spratt-648653-unsplash_meitu_1

前段時間,接觸了一個智慧硬體的專案,在定製化的平板上執行 Android 系統,並通過串列埠和藍芽與其他裝置進行通訊。 擔心時間長了,就容易忘記,因此,整理了關於 Android 串列埠通訊的知識。

什麼是串列埠通訊

先來一段 百度百科的解釋

序列介面是一種可以將接受來自CPU的並行資料字元轉換為連續的序列資料流傳送出去,同時可將接受的序列資料流轉換為並行的資料字元供給CPU的器件。一般完成這種功能的電路,我們稱為序列介面電路。

串列埠通訊(Serial Communications)是指外設和計算機間,通過資料訊號線 、地線、控制線等,按位進行傳輸資料的一種通訊方式。

串列埠通訊是計算機中非常常見的通訊方式,比如一些有線滑鼠、鍵盤、印表機等都是通過串列埠進行通訊的。

串列埠的通訊一般使用3根線完成,分別是地線、傳送線(tx)、接收線(rx)。


串列埠的引數

串列埠中有五個重要的引數:串列埠裝置名、波特率、奇偶校驗位、資料位、停止位。

  • 裝置名稱:串列埠的名稱。
  • 波特率:傳輸速率的引數,波特率和傳輸距離成反比。
  • 校驗位:在串列埠通訊中一種簡單的檢錯方式,有四種檢錯方式:偶、奇、高和低,允許無校驗位。
  • 資料位:通訊中實際資料位的引數
  • 停止位:用於表示單個包的最後一位。

其中檢驗位一般預設位NONE,資料位一般預設為8,停止位預設為1,校驗位是為了減少誤差的會根據奇、偶進行補位操作。

對於兩個進行通訊的埠,這些引數必須匹配,否則兩端不能正常收發。


Android 串列埠通訊

Android 主機板在與其它硬體進行串列埠通訊時,串列埠作為底層實現,Android 系統把裝置作為一個檔案,與其他裝置進行串列埠通訊就相當於讀寫此檔案。

所以,串列埠通訊其實就是對系統根目錄下 /proc/tty/drivers 檔案進行流的讀寫,因此,串列埠讀寫需要 Android 系統 Root 許可權,不必擔心,一般開發版的系統都會 Root 。


在應用層進行串列埠通訊之前,千萬要檢測開發板的串列埠是否調通,不要背鍋哦~(不要問我為什麼知道這坑)

檢測的方式可以選擇 adb 或者直接下載 Android 除錯工具,進行除錯,推薦使用工具,簡單方便。

那麼先說說 adb 方式的檢測。

檢測

檢測的原理就是,將 開發板串列埠線 連線上 電腦 (PC),然後在 PC 和開發板 上,相互進行串列埠資料的讀寫。如果兩邊都能順利收發資料,那麼說明開發板的串列埠是暢通的。

準備

Windows:友善串列埠除錯工具

Mac OS 上的串列埠除錯工具不清楚

連線

  1. 串列埠線 連線開發板 和 PC,然後在串列埠除錯工具中,開啟對應位置的埠。如果提示失敗,就要檢查串列埠線的埠號是否正確。

  2. 用資料線連線開發板至 PC,用 adb 命令開啟 Android 系統對應的串列埠檔案。

    以 root 許可權進入系統,

    adb shell
    su
    複製程式碼

    然後,更改串列埠檔案ttyS3的讀寫許可權,

    chmod 777 /dev/ttyS3
    複製程式碼

    最後,寫入資訊 1111 到串列埠檔案ttyS3

    echo 1111 > /dev/ttyS3
    複製程式碼

    觀察 PC 上的串列埠除錯工具,如果 PC 上能收到資訊,說明調通了,那麼就可以進行應用開發了。


官方串列埠工具

Android 應用層如果操作串列埠,需要用到 JNI ,谷歌官方早已經開源了相關工具庫:android-serialport-api

官方地址需要翻牆,也可以直接搜尋這個工具,下載體驗 Dmo。

谷歌官方的這個庫太過陳舊,使用也麻煩,而且谷歌官方串列埠庫的設定,僅支援串列埠名稱及波特率,有時候並不能夠滿足需求。

基於以上原因,因此利用Android studio 3.1上 CMake,將官方串列埠庫移植過來 ,並對其進行適當擴充套件,現支援如下配置:

  • su 路徑
  • 串列埠路徑
  • 波特率
  • 校驗位
  • 資料位
  • 停止位。

為了方便使用,此庫已經發布到 JCenter 上,以後可以非常容易的整合它。

同時,使用這個庫做了一個Android 串列埠除錯工具,方便除錯。

SerialPort

apk 下載

原始碼地址:AndroidSerialPort


參考

Android串列埠通訊(Android Studio)

Android串列埠通訊:抱歉,學會它真的可以為所欲為

讓android_serialport_api支援奇偶校驗、資料位、停止位等引數

相關文章