本文主要介绍了针对android的蓝牙串口上位机开发。

程序下载地址:点击打开链接

一、帧定义

android客户端按照一定的数据帧格式通过蓝牙串口发送数据到连接到MCU的蓝牙从机,MCU接收到数据后,按照帧格式的定义,接收数据帧,并解析数据帧,得到需要的数据。

android客户端按照以下帧格式来发送和接收数据。


Android蓝牙串口程序开发_第1张图片


1.1客户端发送的数据帧内容

发送频率:10Hz

Android蓝牙串口程序开发_第2张图片


帧校验的和是从帧长开始到帧校验前所有数据的和对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。此时就不存在帧尾了)

下面是android客户端发送字节信息的程序:

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接收数据时,要按照客户端发送的帧格式的定义,找到一帧数据的开始与结束,确认一帧数据接收无误后,再将其中的数据解析出来。使用一个为来标志(状态机)接收程序对一阵数据的接收状态。

编写的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... sumif(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就接收到了从客户端发送来的数据。保存在sci_data.pitchSet、sci_data.rollSet、sci_data.yawSet三个变量中。 


二、android客户端开发流程

问题:检测蓝牙的连接状态

android蓝牙串口程序状态机

在程序中,通过broadcast来检测蓝牙的连接状态,根绝蓝牙的连接状态来决定操作。

打开蓝牙---扫描设备---选择设备---连接设备---连接正常---发送数据---






更多相关文章

  1. 使用AsyncHttpClient框架来完成网络数据的请求
  2. Android Studio下的串口程序开发实战
  3. Android聊天客户端Demo,开源了.基本功能都有,数据库,服务器都Ok
  4. Android蓝牙通讯模块源码(Android蓝牙开发浅析 续)
  5. ionic---关于android和ios蓝牙的使用--以小票打印为例
  6. [翻译]Android教程-保存数据-支持不同的平台版本
  7. Android——Json和Gson分别是什么,以及Json 数据的解析方法

随机推荐

  1. Android中的多进程、多线程
  2. 转---Android(安卓)Audio System 之一:Aud
  3. Android(安卓)之采用execSQL和rawQuery方
  4. [置顶] Android中View的加载过程
  5. Android应用安全学习笔记前言
  6. android事件拦截处理机制详解
  7. Android(安卓)反编译apk 到java源码的方
  8. Android是个好系统
  9. Android(安卓)多点触控技术
  10. Android自定义扁平化对话框