前段時間,接觸了一個智慧硬體的專案,在定製化的平板上執行 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 上的串列埠除錯工具不清楚
連線
-
用 串列埠線 連線開發板 和 PC,然後在串列埠除錯工具中,開啟對應位置的埠。如果提示失敗,就要檢查串列埠線的埠號是否正確。
-
用資料線連線開發板至 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 串列埠除錯工具,方便除錯。
原始碼地址:AndroidSerialPort