android 如何打開串口以及與串口通訊

串口通訊庶弃,對于沒接觸過這方面的朋友們衫贬,確實會感到頭疼,不知道從何下手歇攻。
其實固惯,串口通訊和服務器之間的通訊是一樣的,都是傳一些參數(shù)過去缴守,然后返回一些數(shù)據(jù)回來葬毫。不過串口通訊管這些參數(shù)叫做指令,而這些指令是由硬件的通訊協(xié)議而定的屡穗,通訊協(xié)議不同贴捡,指令自然也不同。在我開發(fā)的這個項目里村砂,兼容了四種硬件通訊協(xié)議烂斋,這四種協(xié)議各不相同,所以箍镜,那些指令就不在代碼里面寫出來了源祈。
串口通訊,第一步要做的當然是打開串口色迂,打開串口的方法如下:

QQ截圖20161211220537.png
    首先在app下建立一個libs文件夾香缺,把.so文件復制到libs下
QQ截圖20161211220537.png
    用android studio的朋友們要記得在build.gradle  文件中添加這段  jniLibs.srcDirs = ['libs']  ,我有一次看見別人的代碼里面可以不加這段歇僧,照樣能運行图张,有知道的可以和大家分享一下。不過這些都不重要诈悍,只要能開串口就行祸轮。然后,在java的根目錄下建一個包侥钳,注意是根目錄适袜,包名為:android_serialport_api,這個包名是固定的舷夺,不能少也不能多苦酱。然后把類SerialPort復制到包下面。
// JNI
private native static FileDescriptor open(String path, int baudrate, int flags);
public native void close();
static {   System.loadLibrary("serial_port");   }
 上面的第一個函數(shù)open是調(diào)用jni打開串口的方法给猾,調(diào)用該方法的時候會返回一個FileDescriptor對象疫萤,通過該對象可以獲取輸入輸出流。第二個close函數(shù)是關(guān)閉串口的方法敢伸,可以通過此方法關(guān)閉串口扯饶。這兩個函數(shù)最好是能成對出現(xiàn),在程序打開的時候把串口打開,程序退出了就把串口關(guān)閉尾序,這樣可以避免一些問題出現(xiàn)钓丰。第三個是加載.so文件里面的代碼的,加載了之后串口才能用每币。

···
public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {
System.out.println("device======"+device.getAbsolutePath());
/* Check access permission /
if (!device.canRead() || !device.canWrite()) {
try {
/
Missing read/write permission, trying to chmod the file */
Process su = Runtime.getRuntime().exec("/system/bin/su");
String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"
+ "exit\n";
su.getOutputStream().write(cmd.getBytes());
if ((su.waitFor() != 0) || !device.canRead()
|| !device.canWrite()) {
throw new SecurityException();
}
} catch (Exception e) {
e.printStackTrace();
throw new SecurityException();
}
}

    mFd = open(device.getAbsolutePath(), baudrate, flags);
    if (mFd == null) {
        Log.e(TAG, "native open returns null");
        throw new IOException();
    }
    mFileInputStream = new FileInputStream(mFd);
    mFileOutputStream = new FileOutputStream(mFd);
}

···
上面的這段代碼中斑粱,su.getOutputStream().write(cmd.getBytes());這行是獲取root權(quán)限的,打開串口是需要root權(quán)限的脯爪,如果不能獲取root權(quán)限,串口也是打不開的矿微,其他的就是一些判斷了痕慢,在這就不做詳細講解了。
上面這些是開串口之前的準備涌矢,準備完畢后掖举,我們來打開串口,打開串口就是調(diào)用open函數(shù)娜庇,調(diào)用open函數(shù)需要傳三個參數(shù)塔次,第一個參數(shù)path是串口名,比如:”/dev/ttyS0“名秀,這些是根據(jù)實際接口來定的励负,第二個參數(shù)baudrate是波特率,一般都是9600匕得,15200继榆,這個需要根據(jù)硬件來定,第三個我就不清楚了汁掠,我都是傳0略吨,有知道的可以和大家分享一下。
···
/**
* 初始化串口
* @param lockerPortInterface
/
private void setSerialPort(LockerPortInterface lockerPortInterface){
this.sportInterface = lockerPortInterface;
try {
/
Check parameters /
if ((path.length() == 0) || (baudrate == -1)) {
throw new InvalidParameterException();
}
/
Open the serial port */
boxPort = new SerialPort(new File(path), baudrate, 0);

        mOutputStreamBox = boxPort.getOutputStream();
        mInputStreamBox = boxPort.getInputStream();
        /* Create a serial rec buf  thread */
        mReadThreadBox = new ReadThreadBox();

// SerialPortState = true;
mReadThreadBox.start();
if (firstRegisterBox) {
if(mContext == null){
Log.e(TAG, "mContext nulll");
}
m_SerialRecBox = new SerialBroadcastReceiverBox(mContext);
m_SerialRecBox.registerAction();
firstRegisterBox = false;
Log.i(TAG, "----locker port--- 注冊完畢");
}
lockerPortInterface.onLockerOutputStream(mOutputStreamBox);
} catch (SecurityException e) {
e.printStackTrace();
DisplayError(mContext,R.string.error_security);
} catch (IOException e) {
e.printStackTrace();
DisplayError(mContext,R.string.error_unknown);
} catch (InvalidParameterException e) {
e.printStackTrace();
DisplayError(mContext,R.string.error_configuration);
}
}
···
boxPort = new SerialPort(new File(path), baudrate, 0);這行代碼是調(diào)用SerialPort的構(gòu)造方法考阱,通過他的構(gòu)造方法去調(diào)用open函數(shù)翠忠,然后通過SerialPort對象來獲取輸入輸出流。在這里解釋一下乞榨,輸入流是接收串口返回的數(shù)據(jù)秽之,輸出流是向串口發(fā)指令。 調(diào)用SerialPort的構(gòu)造方法可能會發(fā)生三種異常姜凄,第一種異常(SecurityException)是串口無讀寫權(quán)限政溃,拋出這種異常的話就說明你可能沒有root權(quán)限,第二種異常(IOException )串口不能打開态秧,可能就是你沒有這個串口董虱,第三種異常(InvalidParameterException)是傳的參數(shù)有誤,可能是你的波特率不對。我理解的就是這樣的愤诱,不知道對不對云头。

openserialport.gif

這是我用模擬器測試的,只要有請求root權(quán)限的頁面淫半,并且拋的是IO異常溃槐,打開串口應該就沒問題了。
最后就是向串口發(fā)指令科吭,向串口發(fā)指令是用輸出流向串口寫入昏滴,至于具體的指令是什么,需要根據(jù)協(xié)議來定对人。發(fā)完指令之后串口會回數(shù)據(jù)結(jié)果給你谣殊,你需要接收這些數(shù)據(jù)來做業(yè)務,硬件不同牺弄,回數(shù)據(jù)結(jié)果的方式也不同姻几,有些硬件是發(fā)完指令后把結(jié)果直接回給你,有些硬件是先給你一小部分势告,然后等1s再回另外一部分數(shù)據(jù)蛇捌。
在我寫的demo里面用的方法是針對硬件一次性把數(shù)據(jù)結(jié)果全部返回的方式,onLockerDataReceived直接用這個方法接收數(shù)據(jù)咱台,這樣就比較簡單了络拌。串口通訊說到這里就結(jié)束了。
最后貼上自己寫的一個小demo地址:https://github.com/fm183/SerialportDemo.git吵护,以供大家參考盒音。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馅而,隨后出現(xiàn)的幾起案子祥诽,更是在濱河造成了極大的恐慌,老刑警劉巖瓮恭,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雄坪,死亡現(xiàn)場離奇詭異,居然都是意外死亡屯蹦,警方通過查閱死者的電腦和手機维哈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來登澜,“玉大人阔挠,你說我怎么就攤上這事∧匀洌” “怎么了购撼?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵跪削,是天一觀的道長。 經(jīng)常有香客問我迂求,道長碾盐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任揩局,我火速辦了婚禮毫玖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凌盯。我一直安慰自己付枫,他們只是感情好,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布驰怎。 她就那樣靜靜地躺著励背,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砸西。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天址儒,我揣著相機與錄音芹枷,去河邊找鬼。 笑死莲趣,一個胖子當著我的面吹牛鸳慈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喧伞,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼走芋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了潘鲫?” 一聲冷哼從身側(cè)響起翁逞,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溉仑,沒想到半個月后挖函,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡浊竟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年怨喘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片振定。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡必怜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出后频,到底是詐尸還是另有隱情梳庆,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站靠益,受9級特大地震影響丧肴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胧后,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一芋浮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壳快,春花似錦纸巷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竖伯,卻和暖如春存哲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背七婴。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工祟偷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人打厘。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓修肠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親户盯。 傳聞我的和親對象是個殘疾皇子嵌施,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,757評論 25 707
  • 串口通訊的步驟: 1.打開串口。 2.串口處于監(jiān)聽狀態(tài) 3.想串口寫入數(shù)據(jù)莽鸭,串口接收到數(shù)據(jù)返回數(shù)據(jù) 串口的一個基本...
    流水線上的程序員閱讀 1,483評論 1 0
  • 串口操作 串口操作需要的頭文件 #include /*標準輸入輸出定義*/ #include /*標準函數(shù)庫定...
    旅行家John閱讀 1,297評論 0 3
  • 關(guān)鍵詞:定位吗伤,調(diào)性,兩個GC 讀書感悟 1.定位與調(diào)性 內(nèi)容運營有兩個核心—定位與調(diào)性硫眨,通俗的說就是你的內(nèi)容要有邊...
    白木白閱讀 215評論 0 0
  • 對尚侃印象最深的是岳母燒的瓦罐雞牲芋,穿插在小洋樓里的老房子和通自來水前經(jīng)常去汲水的老井。 第一次到尚侃是坐大巴捺球,那時...
    風言無語閱讀 749評論 27 67