我最近用stm32的蓝牙串口功能,写了这篇文章分享,有不足之处欢迎指正。

一、准备

功能:用APP控制STM32F103单片机上的部件如:LED小灯。
硬件:蓝牙模块、STM32F103mini(或其他单片机)、手机一部
软件:AppInventor(网址:http://app.gzjkw.net/login/)

二、功能实现与代码分析

森森用的是正点原子的mini开发板和ATK-HC05蓝牙串口模块。
stm32与ATK-HC05蓝牙串口模块连接如下:

main函数如下:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "hc05.h"
#include "usart3.h"
#include "string.h"
#include "usmart.h"   //显示ATK-HC05模块的主从状态
void HC05_Role_Show(void)
{if(HC05_Get_Role()==1)LCD_ShowString(30,140,200,16,16,"ROLE:Master");  //主机else LCD_ShowString(30,140,200,16,16,"ROLE:Slave ");                  //从机
}
//显示ATK-HC05模块的连接状态
void HC05_Sta_Show(void)
{                                                if(HC05_LED)LCD_ShowString(120,140,120,16,16,"STA:Connected ");          //连接成功else LCD_ShowString(120,140,120,16,16,"STA:Disconnect");                //未连接
}   int main(void){  u8 t;u8 key;u8 sendmask=0;u8 sendcnt=0;u8 sendbuf[20];     u8 reclen=0;     delay_init();            //延时函数初始化    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200);      //串口初始化为9600LED_Init();             //初始化与LED连接的硬件接口KEY_Init();             //初始化按键LCD_Init();              //初始化LCDusmart_dev.init(72);    //初始化USMART     POINT_COLOR=RED;LCD_ShowString(30,30,200,16,16,"ALIENTEK STM32F1 ^_^");  LCD_ShowString(30,50,200,16,16,"HC05 BLUETOOTH COM TEST");    LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");delay_ms(1000);          //等待蓝牙模块上电稳定while(HC05_Init())      //初始化ATK-HC05模块  {LCD_ShowString(30,90,200,16,16,"ATK-HC05 Error!"); delay_ms(500);LCD_ShowString(30,90,200,16,16,"Please Check!!!"); delay_ms(100);}                                                  LCD_ShowString(30,90,210,16,16,"KEY1:ROLE KEY0:SEND/STOP");  LCD_ShowString(30,110,200,16,16,"ATK-HC05 Standby!");  LCD_ShowString(30,160,200,16,16,"Send:");  LCD_ShowString(30,180,200,16,16,"Receive:"); POINT_COLOR=BLUE;HC05_Role_Show();delay_ms(100);USART3_RX_STA=0;while(1) {     key=KEY_Scan(0);if(key==KEY1_PRES)                       //切换模块主从设置{key=HC05_Get_Role();if(key!=0XFF){key=!key;                   //状态取反     if(key==0)HC05_Set_Cmd("AT+ROLE=0");else HC05_Set_Cmd("AT+ROLE=1");HC05_Role_Show();HC05_Set_Cmd("AT+RESET");   //复位ATK-HC05模块delay_ms(200);}}else if(key==KEY0_PRES){sendmask=!sendmask;                //发送/停止发送    if(sendmask==0)LCD_Fill(30+40,160,240,160+16,WHITE);//清除显示}else delay_ms(10);     if(t==50){if(sendmask)                 //定时发送{sprintf((char*)sendbuf,"ALIENTEK HC05 %d\r\n",sendcnt);LCD_ShowString(30+40,160,200,16,16,sendbuf);   //显示发送数据    u3_printf("ALIENTEK HC05 %d\r\n",sendcnt);        //发送到蓝牙模块sendcnt++;if(sendcnt>99)sendcnt=0;}HC05_Sta_Show();        t=0;LED0=!LED0;          }    if(USART3_RX_STA&0X8000)          //接收到一次数据了{LCD_Fill(30,200,240,320,WHITE);  //清除显示reclen=USART3_RX_STA&0X7FFF; //得到数据长度USART3_RX_BUF[reclen]=0;       //加入结束符if(reclen==9||reclen==8)         //控制DS1检测{if(strcmp((const char*)USART3_RX_BUF,"+LED1 ON")==0)LED1=0; //打开LED1if(strcmp((const char*)USART3_RX_BUF,"+LED1 OFF")==0)LED1=1;//关闭LED1}LCD_ShowString(30,200,209,119,16,USART3_RX_BUF);//显示接收到的数据USART3_RX_STA=0;   }                                                                                     t++;   }
}

手机给单片机发送的数据,控制单片机

ATK-HC05配置如下:

#include "delay.h"
#include "usart.h"
#include "usart3.h"
#include "hc05.h"
#include "led.h"
#include "string.h"
#include "math.h"//初始化ATK-HC05模块
//返回值:0,成功;1,失败.
u8 HC05_Init(void)
{u8 retry=10,t;             u8 temp=1;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //使能PORTAGPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                 // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                     //根据设定参数初始化A15GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA4GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);HC05_KEY=1;HC05_LED=1; usart3_init(9600); //初始化串口2为:9600,波特率.while(retry--){HC05_KEY=1;                  //KEY置高,进入AT模式delay_ms(10);u3_printf("AT\r\n");       //发送AT测试指令HC05_KEY=0;                  //KEY拉低,退出AT模式for(t=0;t<10;t++)           //最长等待50ms,来接收HC05模块的回应{if(USART3_RX_STA&0X8000)break;delay_ms(5);}     if(USART3_RX_STA&0X8000)    //接收到一次数据了{temp=USART3_RX_STA&0X7FFF;  //得到数据长度USART3_RX_STA=0;            if(temp==4&&USART3_RX_BUF[0]=='O'&&USART3_RX_BUF[1]=='K'){temp=0;//接收到OK响应break;}}                      }           if(retry==0)temp=1;  //检测失败return temp;
}
//获取ATK-HC05模块的角色
//返回值:0,从机;1,主机;0XFF,获取失败.
u8 HC05_Get_Role(void)
{               u8 retry=0X0F;u8 temp,t;while(retry--){HC05_KEY=1;                    //KEY置高,进入AT模式delay_ms(10);u3_printf("AT+ROLE?\r\n");    //查询角色for(t=0;t<20;t++)           //最长等待200ms,来接收HC05模块的回应{delay_ms(10);if(USART3_RX_STA&0X8000)break;}       HC05_KEY=0;                    //KEY拉低,退出AT模式if(USART3_RX_STA&0X8000)  //接收到一次数据了{temp=USART3_RX_STA&0X7FFF;  //得到数据长度USART3_RX_STA=0;            if(temp==13&&USART3_RX_BUF[0]=='+')//接收到正确的应答了{temp=USART3_RX_BUF[6]-'0';//得到主从模式值break;}}       }if(retry==0)temp=0XFF;//查询失败.return temp;
}
//ATK-HC05设置命令
//此函数用于设置ATK-HC05,适用于仅返回OK应答的AT指令
//atstr:AT指令串.比如:"AT+RESET"/"AT+UART=9600,0,0"/"AT+ROLE=0"等字符串
//返回值:0,设置成功;其他,设置失败.
u8 HC05_Set_Cmd(u8* atstr)
{               u8 retry=0X0F;u8 temp,t;while(retry--){HC05_KEY=1;                    //KEY置高,进入AT模式delay_ms(10);u3_printf("%s\r\n",atstr); //发送AT字符串HC05_KEY=0;                   //KEY拉低,退出AT模式for(t=0;t<20;t++)           //最长等待100ms,来接收HC05模块的回应{if(USART3_RX_STA&0X8000)break;delay_ms(5);}        if(USART3_RX_STA&0X8000)    //接收到一次数据了{temp=USART3_RX_STA&0X7FFF;  //得到数据长度USART3_RX_STA=0;            if(temp==4&&USART3_RX_BUF[0]=='O')//接收到正确的应答了{           temp=0;break;           }}     }if(retry==0)temp=0XFF;//设置失败.return temp;
}
//通过该函数,可以利用USMART,调试接在串口3上的ATK-HC05模块
//str:命令串.(这里注意不再需要再输入回车符)
void HC05_CFG_CMD(u8 *str)
{                     u8 temp;u8 t;       HC05_KEY=1;                      //KEY置高,进入AT模式delay_ms(10);u3_printf("%s\r\n",(char*)str); //发送指令for(t=0;t<50;t++)              //最长等待500ms,来接收HC05模块的回应{if(USART3_RX_STA&0X8000)break;delay_ms(10);}                                       HC05_KEY=0;                        //KEY拉低,退出AT模式if(USART3_RX_STA&0X8000)      //接收到一次数据了{temp=USART3_RX_STA&0X7FFF;  //得到数据长度USART3_RX_STA=0;USART3_RX_BUF[temp]=0;        //加结束符       printf("\r\n%s",USART3_RX_BUF);//发送回应数据到串口1}
}

HC05_KEY连接PA15引脚,HC05_LED连接PA4引脚
hc05程序可以移植。

三、APP的制作

**
森森制作控制stm32的APP是App Inventor。Google App Inventor是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆叠法来完成您的Android程式。对于想要用手机控制机器人的使用者而言,他们不大需要太华丽的界面,只要使用基本元件例如按钮、文字输入输出即可。开发一个App Inventor 程式就从您的浏览器开始,您首先要设计程序的外观。接着是设定程序的行为,这部分就像玩乐高积木一样简单有趣。最后只要将手机与电脑联接,刚出炉的程序就会出现在您的手机上了。
App Inventor 有离线版和不需要下载的网站版本。 森森制作控制stm32的APP网站版本就完全可以,网站网址App Inventor。想要学习App Inventor,可以在中国大学慕课上搜索吴明辉老师的App Inventor-零基础Android移动开发。如下图:

森森控制stm32APP组件设计:

森森控制stm32APP逻辑设计:


该程序完成后,在APP上显示:

进入该APP,按下LED灯开,手机向单片机发送+LED1 ON,LED灯亮。
按下LED灯关,手机向单片机发送+LED1 OFF,LED灯灭。
对应main函数中:

通过改此处可以控制stm32单片机。


APP制作完成后下载到手机、先用手机连接HC05蓝牙,然后打开APP 按选择蓝牙设备即可连接蓝牙。然后按对应按键即可。

注:森森在学习蓝牙串口时,这篇文章对我帮助很大,森森很多是自己理解后对他的补充。基于蓝牙的APP控制STM32板LED小灯
1、自制App下载链接:蓝牙串口App
2、stm32f103HC05蓝牙串口程序下载地址:stm32f103的HC05蓝牙串口程序

stm32f103HC05蓝牙串口程序和自制手机APP相关推荐

  1. uniapp app蓝牙打印_给编程器加装蓝牙串口模块,用手机APP操作打印信息进控制台...

    公众号回复[编程器]可下载蓝牙串口APP 专用蓝牙串口模块购买: https://item.taobao.com/item.htm?id=619731291566 编程器加装蓝牙模块后,可以方便的使用 ...

  2. 小白学习HC-05蓝牙透传模块(有实例讲解——自制手机app实现蓝牙控制单片机加热系统)第一天 :整体分析,理清思路

    小编刚开始接触HC-05蓝牙透传模块,只是感到很神奇.但对它的原理和使用方法一无所知.做项目要用到它的时候,无非就是代码复制粘贴,有种照搬照抄的意思. 但是今天小编要谈谈一段时间内对HC-05学习的心 ...

  3. Android蓝牙串口程序开发

    本文主要介绍了针对android的蓝牙串口上位机开发. 程序下载地址:点击打开链接 一.帧定义 androidclient依照一定的数据帧格式通过蓝牙串口发送数据到连接到MCU的蓝牙从机.MCU接收到 ...

  4. HC05与STM32进行串口通讯实现与手机APP的数据透传

    HC05与STM32与手机透传 1.实验工具:正点原子的精英版STM32F103ZET6,通用BLE蓝牙模块一个HC05(最便宜的蓝牙模块),手机,电脑 2.HC05调试:若HC05上面有小按键,则按 ...

  5. 自制手机app的51蓝牙+WiFi+循迹+避障OLED显示速度小车

    最近有空了,重新复习了下51单片机,真的是温故而知新,学到了之前没学到的知识,所以打算做个基于51的蓝牙小车玩玩,也算是圆大一的梦吧,就当复习一下. 实现效果: 1.蓝牙可以控制前后左右,调速(快慢) ...

  6. python日程提醒小程序_用手机APP管理日程太繁琐?试试这个微信小程序

    随着我们日常生活.学习以及工作的日益繁忙,合理安排自己的日程事项变得越来越重要.相信大家在自己的手机里也安装过一些任务管理APP,可是真正坚持用下来的人又有多少呢?如果你觉得手机里的任务管理APP功能 ...

  7. 手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android设备之间的串口通信

    目录 (一)前期软件准备和硬件准备 ( 二 ) 实现的思路和操作原理 ( 三) 具体的操作方法 MIT Appinventor 是编程领域较为受欢迎且适用的编程软件 ,因其操作流程和使用方法简单,一直 ...

  8. 自制蓝牙手机app控制stm8/stm32/C51板载LED

    这里来分享下,自制手机app来控制单片机上的LED,以实现上位机,下位机的通讯 这次分享的是蓝牙app控制stm8,stm32,C51的我前面的文章分享过,不懂的可以看看–>传送门 原理很简单, ...

  9. arduino蓝牙通讯代码_通过手机控制蓝牙串口模块与Arduino通讯

    功能 通过手机APP向蓝牙模块发送指令,蓝牙模块通过串口将指令传递给Arduino开发板,并由Arduino做出反馈,传递给手机. 工具材料Arduino 开发板 ×1 蓝牙串口模块×1 Androi ...

最新文章

  1. linux 下 jenkins 安装注意事项
  2. 统计学原理-----概率分布
  3. 利用ASP.NET一般处理程序动态生成Web图像
  4. Struts2简单入门实例
  5. java并发-独占锁与共享锁
  6. 如何开发出一款仿映客直播APP项目实践篇 -【原理篇】
  7. qq音乐推荐下载器(一)——模拟搜索,下载,读取评论制作词云并将下载数据传至数据库
  8. Kibana:使用 drilldown 从一个仪表板切换到另外一个仪表板
  9. TypeError: format expected at most 2 arguments, got 7
  10. Zepto中touch模块的使用(移动端)
  11. 十六进制颜色与RGB颜色转换
  12. 解决0xc000012f 损坏的映像rasman.dll没有被指定在windows运行问题
  13. 4298. 【NOIP2015模拟11.2晚】我的天
  14. 覃卫平java,广西外国语学院与柳州市柳江区实验高中、柳城县中学签订优质生源基地协议并圆满完成挂牌仪式...
  15. 【头歌】顺序表的基本操作
  16. java设计模式-六大设计原则
  17. 一分钟让你知道黑白照片修复彩色软件有哪些?
  18. 括号匹配算法问题 JS
  19. 是时候废除“网络君主制”啦?认识 Usenet ~
  20. 使用Nginx防止IP地址被恶意解析

热门文章

  1. Lesson 13-14 How often do you exercise?
  2. 浏览器下载软件时,默认是用迅雷下载,如何取消?
  3. MemBrain2.0_论文
  4. 软件测试方法大全,49种测试方法,你知道几个?
  5. Linux 下 QT 安卓开发环境搭建
  6. 阿里云轻量服务器windows系统远程桌面无法连接?
  7. 阿里云远程桌面连接不到的问题
  8. MPP大规模并行计算数据库与分布式数据库的区别
  9. python安装模块(官网文档)
  10. 【Encoding】UTF-8编码规则