Android蓝牙串口程序开发
本文主要介绍了针对android的蓝牙串口上位机开发。
一、帧定义
android客户端按照一定的数据帧格式通过蓝牙串口发送数据到连接到MCU的蓝牙从机,MCU接收到数据后,按照帧格式的定义,接收数据帧,并解析数据帧,得到需要的数据。
android客户端按照以下帧格式来发送和接收数据。
1.1客户端发送的数据帧内容
帧校验的和是从帧长开始到帧校验前所有数据的和对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客户端发送字节信息的程序:
<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接收数据时,要按照客户端发送的帧格式的定义,找到一帧数据的开始与结束,确认一帧数据接收无误后,再将其中的数据解析出来。使用一个为来标志(状态机)接收程序对一阵数据的接收状态。
编写的DSP2808接收程序如下:
定义数据类型
typedef struct { int status; //data status int Rx_Data; //the receivced data int 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 flag ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1; //clear the interrupt flag PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; //enable more interrupt from PIE group 9 Decode_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就接收到了从客户端发送来的数据。保存在sci_data.pitchSet、sci_data.rollSet、sci_data.yawSet三个变量中。
二、android客户端开发流程
android蓝牙串口程序状态机
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。