Android蓝牙串口程序开发
本文主要介紹了針對android的藍牙串口上位機開發。
程序下載地址:點擊打開鏈接
一、幀定義
androidclient依照一定的數據幀格式通過藍牙串口發送數據到連接到MCU的藍牙從機。MCU接收到數據后。依照幀格式的定義,接收數據幀。并解析數據幀,得到須要的數據。
androidclient依照下面幀格式來發送和接收數據。
1.1client發送的數據幀內容
發送頻率:10Hz
幀校驗的和是從幀長開始到幀校驗前全部數據的和對256取余。
即sum%256。
pitch roll yaw數據各16位,由高低8位組成。MCU接收數據時須要將其再復合成一個16位數據。
0x5A:幀頭
14:針長度
0xA1:幀功能,標明這幀數據是pitch yaw roll內容。
pitch_set_H:pitch高8位
pitch_set_L:pitch低8位
...
...
幀校驗:(幀長+幀功能+數據)%256
0xA5:幀尾。
(注:幀是這么定義的,但實際上編寫接收程序的時候。我將幀尾0xA5當作了一幀數據的幀頭。
這樣幀頭就變成了 0xA5 0x5A。此時就不存在幀尾了)
以下是androidclient發送字節信息的程序:
<span style="white-space:pre"> </span>b[0] = (byte)0XA5; //幀頭b[1] = (byte)14; //幀長b[2] = (byte)0xA1; //幀功能b[3] = (byte)(pitchSet>>8); //數據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; //幀結束1.2MCU接收幀數據
因為串口是依照一個一個字節的格式發送數據,所以MCU接收數據時,要依照client發送的幀格式的定義。找到一幀數據的開始與結束,確認一幀數據接收無誤后,再將當中的數據解析出來。
使用一個為來標志(狀態機)接收程序對一陣數據的接收狀態。
編寫的DSP2808接收程序例如以下:
定義數據類型
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() //以中斷的方式接收數據 { //接收程序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); //數據幀解碼 }void Decode_Frame(int rx_data) {if(sci_data.status==0 && rx_data == 0x5A) //推斷幀尾 假設找到幀尾,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個字節數據 從幀長到幀校驗{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發送來的數據。保存在sci_data.pitchSet、sci_data.rollSet、sci_data.yawSet三個變量中。?
二、androidclient開發流程
問題:檢測藍牙的連接狀態
android藍牙串口程序狀態機
在程序中,通過broadcast來檢測藍牙的連接狀態,根絕藍牙的連接狀態來決定操作。
打開藍牙---掃描設備---選擇設備---連接設備---連接正常---發送數據---
轉載于:https://www.cnblogs.com/clnchanpin/p/7060216.html
總結
以上是生活随笔為你收集整理的Android蓝牙串口程序开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H5存储------localStora
- 下一篇: 【LeetCode OJ 136】Sin