最近接了個工程,需求是給特製的工程安卓板子做串口讀寫以實現一些特定外接設備的互動——是的你沒有看錯,安卓板子也是可以有串口的!

很多做移動開發的朋友可能沒接觸過——其實在這之前我也沒接觸過。踩了七八個小時的坑,終於爬出來了,這裡做一個總結,可能各個工程板子具體情況不同,大家一定要隨機應變。

首先你要知道的

跳線,工程板子為了節約 USB 接口,默認的 USB 接口都是對外的不能接電腦調試,根據我上手的這個板子來說,在接近 RJ45 也就是網線口的那個 USB 旁邊就有一個跳線,可以把它改為連接電腦的專用口。——當然了,別忘記開調試模式。

找對你的串口號,一般板子的說明書上會有,或者在示例程序裡查看也行。

Java 不能直接對安卓的串口進行讀寫,要用 C 或者 C++ 才行,所以要用到比較高級的 JNI 來橋接,把對串口讀寫的部分做成鏈接庫。

讀取串口不需要 root,至少我沒有遇到,之前踩坑的過程中有幾次是提示沒有權限的,但最後證明是我當時寫錯了路徑。

多個進程(線程)或者app是可以同時訪問同一個串口的,造成的結果就是串口的數據可能會丟失,體現為“丟包”。

任務目標

我的目標很簡單,甚至都不需要發送信息,只需要從外接設備讀取需要的信號變化即可,具體到項目,就理解為0和1就好了。

具體過程

我的板子系統是 4.4.4,我用 Android Studio 來做,首先還是來創建一個空項目。

添加NDK ,這個是給 Java 用的 C 庫:

添加NDK

自動下載安裝後,as會為你配置好一切,接下來在你工程的左上角把項目選為 “Project”:

切換顯示模式

然後在 應用/主要 上點擊鼠標右鍵,新建 JNI 目錄:

新建 JNI 目錄

然後在目錄裡放入以下五個文件:

JNI 裡需要的五個文件

JNI ←點擊下載

這裡邊包含了橋接需要的文件,稍後會用到,接下來在 java 目錄下新建一個名為 android_serialport_api 的包,注意名稱一定要是這個。在這個包內新建一個 java 類,名字為 串行端口 ,內容如下:

添加之後即可給 Gradle 鏈接 C++ 了,這時候 as 會要你選構建系統,選擇 NDK-建立 ,然後根據提示去找剛才我們下載的五個文件中的 Android的.MK

給 Gradle 鏈接 C++

鏈接之後,你就可以在 Build 菜單選擇 Make Project ,make 之後,檢查目錄看有沒有成功生成鏈接庫:

生成動態鏈接庫

確認成功後,即可 clean 和 rebuild 整個項目了,哦對了,作為測試的話, MainActivity 可以這麼寫:

值得注意的地方

這個項目看起來簡單,但實際上最坑的地方在於那個 C 庫寫的有問題,可偏偏在網上幾乎都是這一個文件……在 串行端口.C 的第 116 行,還有 128 行,你會看到我的版本里註釋掉了這兩個檢測,事實上這個問題坑了我三個小時!

在我拿到手的這個板子上,就是返回 -1 的!他就返回 -1 沒毛病!所以直到我懷疑人生……拼死一搏……才發現了人生的真蒂。

總之,如果你發現在實現過程中出現了奇怪的問題,那麼就把 這兩個if的語句塊反註釋就好了。

如果一次通過,那你得感謝我。 :)

參考閱讀

Android Studio 串口jni開發

【Android應用開發】-(19)Android 串口編程原理和實現方式(附源碼)

Android的工作室 : 使用 jni 實現串口通訊

Android串口(SerialPort)開發問題簡單總結

由...出版 R0uter

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

加入對話

7 註釋

您的電子郵件地址不會被公開. 必填字段標 *

  1. 你好,我也是使用你用的這個jni進行串口讀寫,目前發送沒問題,跟串口工具可以聯調,但是接收很奇怪。請問你有沒有遇到設備接收數據的時候,只接收一部分數據,另一部分數據又被發送到對端設備的情況?比如,電腦給設備發asdfgh,通過mInputStream.read(緩衝)讀取,只讀到sdfgh,然後電腦端收到了a