首页 > 代码库 > Android蓝牙串口程序开发

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 = http://www.mamicode.com/ScibRegs.SCIRXBUF.all;        >
这样DSP2808就接收到了从客户端发送来的数据。保存在sci_data.pitchSet、sci_data.rollSet、sci_data.yawSet三个变量中。 


二、android客户端开发流程

android蓝牙串口程序状态机






Android蓝牙串口程序开发