Android蓝牙串口程序开发
本文主要介紹了針對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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H5存储------localStora
- 下一篇: 【LeetCode OJ 136】Sin