日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android蓝牙串口程序开发

發(fā)布時間:2025/5/22 Android 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android蓝牙串口程序开发 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.



本文主要介紹了針對android的藍牙串口上位機開發(fā)。

程序下載地址:點擊打開鏈接

一、幀定義

androidclient依照一定的數(shù)據(jù)幀格式通過藍牙串口發(fā)送數(shù)據(jù)到連接到MCU的藍牙從機。MCU接收到數(shù)據(jù)后。依照幀格式的定義,接收數(shù)據(jù)幀。并解析數(shù)據(jù)幀,得到須要的數(shù)據(jù)。

androidclient依照下面幀格式來發(fā)送和接收數(shù)據(jù)。




1.1client發(fā)送的數(shù)據(jù)幀內(nèi)容

發(fā)送頻率:10Hz



幀校驗的和是從幀長開始到幀校驗前全部數(shù)據(jù)的和對256取余。

即sum%256。

pitch roll yaw數(shù)據(jù)各16位,由高低8位組成。MCU接收數(shù)據(jù)時須要將其再復(fù)合成一個16位數(shù)據(jù)。

0x5A:幀頭

14:針長度

0xA1:幀功能,標明這幀數(shù)據(jù)是pitch yaw roll內(nèi)容。

pitch_set_H:pitch高8位

pitch_set_L:pitch低8位

...

...

幀校驗:(幀長+幀功能+數(shù)據(jù))%256

0xA5:幀尾。

(注:幀是這么定義的,但實際上編寫接收程序的時候。我將幀尾0xA5當作了一幀數(shù)據(jù)的幀頭。

這樣幀頭就變成了 0xA5 0x5A。此時就不存在幀尾了)

以下是androidclient發(fā)送字節(jié)信息的程序:

<span style="white-space:pre"> </span>b[0] = (byte)0XA5; //幀頭b[1] = (byte)14; //幀長b[2] = (byte)0xA1; //幀功能b[3] = (byte)(pitchSet>>8); //數(shù)據(jù)b[4] = (byte)(pitchSet);b[5] = (byte)(rollSet>>8);b[6] = (byte)(rollSet);b[7] = (byte)(yawSet>>8);b[8] = (byte)(yawSet);b[9] = (byte)0;b[10] = (byte)0;b[11] = (byte)0;b[12] = (byte)0;int temp = 0;for(int j=1;j<13;j++){temp = temp+b[j];}b[13] = (byte)(temp%256); //校驗 b[14] = (byte)0x5A; //幀結(jié)束
1.2MCU接收幀數(shù)據(jù)

因為串口是依照一個一個字節(jié)的格式發(fā)送數(shù)據(jù),所以MCU接收數(shù)據(jù)時,要依照client發(fā)送的幀格式的定義。找到一幀數(shù)據(jù)的開始與結(jié)束,確認一幀數(shù)據(jù)接收無誤后,再將當中的數(shù)據(jù)解析出來。

使用一個為來標志(狀態(tài)機)接收程序?qū)σ魂嚁?shù)據(jù)的接收狀態(tài)。

編寫的DSP2808接收程序例如以下:

定義數(shù)據(jù)類型

typedef struct {int status; //data statusint Rx_Data; //the receivced dataint data[15]; //int rx_buf[13];int buf_index;int sum;int yawSet;int pitchSet;int rollSet; }Sci_Data; Sci_Data sci_data;

interrupt void SCIB_RX_ISR() //以中斷的方式接收數(shù)據(jù) { //接收程序sci_data.Rx_Data = ScibRegs.SCIRXBUF.all; ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1; //clear overflow flagScibRegs.SCIFFRX.bit.RXFFINTCLR = 1; //clear the interrupt flagPieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; //enable more interrupt from PIE group 9Decode_Frame(sci_data.Rx_Data); //數(shù)據(jù)幀解碼 }void Decode_Frame(int rx_data) {if(sci_data.status==0 && rx_data == 0x5A) //推斷幀尾 假設(shè)找到幀尾,status=1{sci_data.status = 1;}else if(sci_data.status == 1 &&rx_data == 0xA5) //幀尾下一個字符是幀頭。status=2{sci_data.status = 2;}else if(sci_data.status ==2) //幀頭后是13個字節(jié)數(shù)據(jù) 從幀長到幀校驗{if(sci_data.buf_index<13){sci_data.rx_buf[sci_data.buf_index] = rx_data; // 0-12 to save data length function data... sum if(sci_data.buf_index<12) //求取校驗和{sci_data.sum += sci_data.rx_buf[sci_data.buf_index];}sci_data.buf_index++;}if(sci_data.buf_index >= 13){if(sci_data.rx_buf[12] == sci_data.sum%256){int j=0;for(j=0;j<10;j++){sci_data.data[j] = sci_data.rx_buf[j+2]; //save data to the data buf}sci_data.pitchSet = sci_data.data[0]<<8|sci_data.data[1];}sci_data.buf_index = 0;sci_data.status = 0;sci_data.sum = 0;}}else {sci_data.buf_index = 0;sci_data.status = 0;sci_data.sum = 0;} }
這樣DSP2808就接收到了從client發(fā)送來的數(shù)據(jù)。保存在sci_data.pitchSet、sci_data.rollSet、sci_data.yawSet三個變量中。?


二、androidclient開發(fā)流程

問題:檢測藍牙的連接狀態(tài)

android藍牙串口程序狀態(tài)機

在程序中,通過broadcast來檢測藍牙的連接狀態(tài),根絕藍牙的連接狀態(tài)來決定操作。

打開藍牙---掃描設(shè)備---選擇設(shè)備---連接設(shè)備---連接正常---發(fā)送數(shù)據(jù)---






轉(zhuǎn)載于:https://www.cnblogs.com/clnchanpin/p/7060216.html

總結(jié)

以上是生活随笔為你收集整理的Android蓝牙串口程序开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。