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

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

一、帧定义

androidclient依照一定的数据帧格式通过蓝牙串口发送数据到连接到MCU的蓝牙从机。MCU接收到数据后。依照帧格式的定义,接收数据帧。并解析数据帧,得到须要的数据。

androidclient依照下面帧格式来发送和接收数据。

1.1client发送的数据帧内容

发送频率:10Hz

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRpbmlrZTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

帧校验的和是从帧长開始到帧校验前全部数据的和对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 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就接收到了从client发送来的数据。保存在sci_data.pitchSet、sci_data.rollSet、sci_data.yawSet三个变量中。

二、androidclient开发流程

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

android蓝牙串口程序状态机

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

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

Android蓝牙串口程序开发的更多相关文章

  1. Android蓝牙串口通讯【转】

    本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...

  2. Android 蓝牙串口通信工具类 SerialPortUtil 3.0.+

    建议使用4.+版本,避免一些不必要的bug.4.+版本文档地址:https://www.cnblogs.com/shanya/articles/16062256.html SerialPortUtil ...

  3. Delphi 使用串口模拟工具进行串口程序开发调试

      版权声明:本文为博主原创文章,如需转载请注明出处及作者. 本文由小李专栏原创,转载需注明出处:[http://blog.csdn.net/softwave/article/details/8907 ...

  4. android 蓝牙4.0 开发介绍

    最近一直在研究一个蓝牙功能 由于本人是菜鸟  学起来比较忙 一直搞了好久才弄懂 , 网上对蓝牙4.0也就是几个个dome 抄来抄去,全是英文注解 , 对英语不好的朋友来说 真是硬伤 , 一些没必要的描 ...

  5. Android蓝牙通信功能开发

    1. 概述 Bluetooth 是几乎现在每部手机标准配备的功能,多用于耳机 mic 等设备与手机的连接,除此之外,还可以多部手机之间建立 bluetooth 通信,本文就通过 SDK 中带的一个聊天 ...

  6. android 蓝牙串口通讯使用简介

    需要的权限 <uses-permission android:name="android.permission.BLUETOOTH" />  <uses-perm ...

  7. Android手机应用程序开发环境配置(Eclipse+Java+ADT)

    参考: Java手机游戏开发实例简明教程 http://dev.10086.cn/blog/?uid-82940-action-viewspace-itemid-1772 Eclipse下载: htt ...

  8. Android物联网应用程序开发(智慧园区)—— 图片预览界面

    效果图: 实现步骤: 1.首先在 build.gradle 文件中引入 RecycleView implementation 'com.android.support:recyclerview-v7: ...

  9. Android物联网应用程序开发(智慧园区)—— 设置传感器阈值对话框界面

    效果图: 自定义对话框布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

随机推荐

  1. 【CareerCup】Trees and Graphs—Q4.3

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/24744177     题目: Given a sorted (increasing ord ...

  2. 交叉编译faac共享库

    作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 Advanced Audio Coding.一种专为声音数据设计的文件压缩格式,与Mp3不同,它採 ...

  3. IOS开发教程--怎样使用点9图片

    事先准备一张图片: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA== ...

  4. DISCUZ站点DIY后,导致DIY功能失效,无法在前台删除已创建的DIY功能解决的方法

    DISCUZ站点DIY后.导致DIY功能失效,无法在前台删除已创建的DIY功能解决的方法.这是一个常常会遇到的问题.在程序调试过程中常常的会遇到这种问题.这里提供一个自己常常使用的解决的方法,供遇到这 ...

  5. Oracle多表连接效率,性能优化

    Oracle多表连接,提高效率,性能优化 (转) 执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只 ...

  6. webrtc所有平台下载编译步骤详细说明

    webrtc所有平台下载编译步骤详细说明 1.安装depot tools Windows:国外下载:https://storage.googleapis.com/chrome-infra/depot_ ...

  7. docker compose线下安装

    Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务 ...

  8. C#对 Json的序列化和反序列化时出现“k_BackingField”

    在C#2.0的项目中,以前经常使用Json.NET实现序列化和反序列化.后来从c#3.0中开始使用新增的DataContractJsonSerializer进行json相关的操作.微软提供的原生类库使 ...

  9. java实现sql批量插入参数

    背景: 需要更新一些不规范的时间格式,如将某个时间格式化为yy-MM-dd,实际上为 yy-MM-dd hh:mm:ss,并且需要提供回滚脚本. 例如:规范化时间的脚本如下: ,) WHERE tes ...

  10. usaco 最少找零

    Description 约翰在镇上买了 T 元钱的东西,正在研究如何付钱.假设有 N 种钞票,第 i 种钞票的面值为 Vi,约翰身上带着这样的钞票 Ci 张.商店老板罗伯是个土豪,所有种类的钞票都有无 ...