实现蓝牙与手机的双向通信 学习笔记

发布者:CrystalDawn最新更新时间:2019-10-29 来源: eefocus关键字:蓝牙  双向通信 手机看文章 扫描二维码
随时随地手机看文章

说明需要注意的几点:


1.US ART3_RX_BUF[reclen]=0;         //加入结束符,如果不加,就会和某些数据夹杂在一起,传回来部分无用的信息,经测试!


2.接线!!!蓝牙与单片机,任何时候都是 rx-tx,tx-rx。但是stm32精英版中uart3有个很奇怪的错误?上图

这也就是说,在板子上的rx接的单片机实际引脚是TX,所以接线的时候是对应相接。

#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"

 

 

//显示HC05模块的主从状态

void HC05_Role_Show(void)

{

if(HC05_Get_Role()==1)

printf("ROLE:Mastern"); //主机

else

printf("ROLE:Slaven"); //从机

}

 

//显示HC05模块的连接状态

void HC05_Sta_Show(void)

{  

if(HC05_LED)printf("STA:Connectedn"); //连接成功

else printf("STA:Disconnectn"); //未连接  

}

 

 

 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); //串口初始化为9600

LED_Init(); //初始化与LED连接的硬件接口

KEY_Init(); //初始化按键

 

  usmart_dev.init(72); //初始化USMART

delay_ms(1000); //等待蓝牙模块上电稳定

 

 

///////////////////////////////////////////////////////////////////////////////////////  

  while(HC05_Init()) //初始化ATK-HC05模块  

{

printf("HC05 Error!n"); 

delay_ms(500);

printf("Please Check if you have pressed Press on bluetooth!!!n"); 

delay_ms(100);

}        

////////////////////////////////////////////////////////////////////////////////////////

HC05_Role_Show();                 //显示HC05模块的主从状态

delay_ms(100);

USART3_RX_STA=0;                  //这个变量代表着接受的内容

///////////////////////////////////////////////////////////////////////////////////////

  while(1) 

{

key=KEY_Scan(0);               //按键扫描程序

if(key==KEY1_PRES) //切换模块主从设置  如果按键1按了一下

{

    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模块的主从状态

HC05_Set_Cmd("AT+RESET"); //复位ATK-HC05模块

delay_ms(200);

}

}

else if(key==KEY0_PRES)     //如果按键0按了一下

{

sendmask=!sendmask; //发送/停止发送  发送和停止的标志位 

}

else 

delay_ms(10);    

///////////////////////////////发送区域///////////////////////////////////////////

if(t==10)

{

if(sendmask) //定时发送

{

sprintf((char*)sendbuf,"ALIENTEK HC05 %drn",sendcnt);

  printf("%s",sendbuf); //显示发送数据

u3_printf("ALIENTEK HC05 %drn",sendcnt); //发送到蓝牙模块

sendcnt++;

if(sendcnt>99)sendcnt=0;

}

 

t=0;

LED0=!LED0;      

}  

 

///////////////////////////////接受区域/////////////////////////////////////////////

if(USART3_RX_STA&0X8000) //接收到一次数据了

{

 

  reclen=USART3_RX_STA&0X7FFF; //得到数据长度

  USART3_RX_BUF[reclen]=0; //加入结束符,如果不加,就会和某些数据夹杂在一起,传回来部分无用的信息,经测试!

 

if(strcmp((const char*)USART3_RX_BUF,"+LED1 ON")==0)LED1=0; //打开LED1

if(strcmp((const char*)USART3_RX_BUF,"+LED1 OFF")==0)LED1=1;//关闭LED1

printf("receive:");

  printf("%sn",USART3_RX_BUF);//显示接收到的数据

  USART3_RX_STA=0;  

}          

t++;

}

}


3.下一个关键点在蓝牙初始化程序里出现:


HC05_KEY=1; //KEY置高,进入AT模式

delay_ms(10);

u3_printf("%srn",atstr); //发送AT字符串

//HC05_KEY=0; //KEY拉低,退出AT模式

 我所使用的蓝牙是无法通过拉高拉低进入AT模式的,所以只需要接4跟线。如下图:

它建立通信的方式是按一下正面的那个微动开关,既可以进入通信。

#include "delay.h"  

#include "usart.h"  

#include "usart3.h"  

#include "hc05.h" 

#include "led.h" 

#include "string.h"  

#include "math.h"

 

//修改LED的连接,原来接PC5,改为PA4,以兼容MiniSTM32开发板V3.0   

//////////////////////////////////////////////////////////////////////////////////    

 

//初始化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); //使能PORTA

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // 端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化A15

 

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA4

 

GPIO_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("ATrn");      //发送AT测试指令

// HC05_KEY=0;       //KEY拉低,退出AT模式    因为这一句话写错了,花了我五天时间寻找错误,不应该立即退出,否则就无法返回OK

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?rn"); //查询角色

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("%srn",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("%srn",(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("rn%s",USART3_RX_BUF);//发送回应数据到串口1

}  

}


关键字:蓝牙  双向通信 引用地址:实现蓝牙与手机的双向通信 学习笔记

上一篇:STM32F103两种串口输出的方式 学习笔记
下一篇:STM32之独立看门狗 学习笔记

推荐阅读最新更新时间:2024-11-13 10:18

三星Galaxy S21 4G版解密:通过蓝牙SIG上市认证
一项新的蓝牙 SIG 认证表明,三星将推出一款仅支持 4G 网络的 Galaxy S21 机型。   认证清单出现了型号为 SM-G990F 和 SM-G990F_DS 的机型,这与 S21 5G 版机型的 SM-G991X 型号不符。这很可能是 S21 5G 的 4G 版本,是为了 5G 基础设施尚未建立的市场而准备。   三星是否以及何时会推出 Galaxy S21 系列的 4G 版本还有待观察,相信 4G 版机型的售价将进一步降低,IT之家将保持关注。
[手机便携]
三星Galaxy S21 4G版解密:通过<font color='red'>蓝牙</font>SIG上市认证
蓝牙联盟宣布正式推出蓝牙4.1 支持LTE
Bluetooth SIG今日宣布,正式推出蓝牙核心规格更新版本-蓝牙 4.1版本,为无线规格演进迈出重要一步。自2010年7月Bluetooth Smart技术推出后,相关技术已大幅跃进,以智慧、低功耗技术建构物联网。蓝牙4.1版本提供LTE的并存支持,可提升大量数据传输速率,以提升消费者使用体验。此次更新让设备能够同时支持多工角色,辅助开发者进行创新开发,更可作为IP连接基础,巩固蓝牙技术在物联网无线连接中的重要地位。 Bluetooth SIG首席市场官卓文泰(Suke Jawanda)表示,“Bluetooth Smart技术推出,助力蓝牙市场大幅增长,预计今后五年内,蓝牙相关产品年度出货量将突破45亿件。我们透过蓝牙规
[手机便携]
双向通信渔船测报仪系统电路模块设计
  提出了一种双向通信渔船测报仪电路系统设计方案。该渔船测报仪电路系统具有低功耗、微型化、接口丰富、可靠性高等特点,可为渔民提供船舶定位、海上通信、遇险求救等多种功能服务,可提升海上船舶安全防范能力,因而对相关行业主管部门具有重要意义。渔船测报仪采用三星公司基于ARM920T内核的S3C2440A作为系统中央处理器,配备128M的SDRAM,256M的NAND FLASH和16M的NOR FLASH,以应对嵌入Linux操作系统所消耗的内存。S3C2440A集成了MMC/SD卡读写控制器,LCD与触摸屏接口,3路UART串口,1路主控与1路从动USB接口,1个IDE接口可挂接大容量硬盘,实时时钟。S3C2440A内部集成的3路串口
[单片机]
<font color='red'>双向通信</font>渔船测报仪系统电路模块设计
Imagination发布最新款Ensigma无线通信IP 支持WiFi与蓝牙
Imagination的GPU IP很出名,收购MIPS后也有了CPU IP,可你并不一定了解Ensigma内核,Ensigma是通信类IP,主要是与ARM及CEVA竞争,目标市场是无线相关设计领域。 芯片和IP公司从来都是注重性能指标、面积及功耗,Imagination无线事业部副总裁Chakra Parvathaneni表示: 我们的技术相比于其他厂商有两倍的性能优势,同时待机功耗也是最低的。 公司新推出的Ensigma Whisper射频处理单元(PSU),采用第五代架构,集成WiFi802.11n、蓝牙两种无线技术,RPU采用MIPS架构,产品结合了软件定义的灵活性及硬件处理的高速度两个特点。 尽管I
[半导体设计/制造]
Imagination发布最新款Ensigma无线通信IP 支持WiFi与<font color='red'>蓝牙</font>
2014移动支付爆炸到什么程度了?
据宇博智业市场研究中心了解到,2014年是移动支付大爆发的一年,在这一年里发生了太多和移动支付有关的大事。之前我们已经针对一些行业热点事件进行了详尽的分析。那么移动支付的未来是否看好呢?让我们来总结一下2014年的移动支付发展情况,分析一下移动发展的趋势。    在2014年,我们用的最多的移动支付方式,主要包括远程支付和近场支付。远程支付,指通过移动网络,利用短信 、GPRS等空中接口,和后台支付系统建立连接,实现各种转账、消费等支付功能的支付方式;近场支付,指通过具有近距离无线通讯技术的移动终端实现信息交互,进行货币资金转移的支付方式,也就是通过NFC等技术实现支付。   客观因素加速移动支付普及 据中国报告大厅发
[嵌入式]
富士通最新低功耗蓝牙模块及解决方案
富士通利用 FRAM 的低功耗,高速写入,放射线耐性等特点研发的独具特色的 FRAM RFID 的芯片,可广泛应用于面向 FA,生化,医疗电子设备等领域提供创新的应用解决方案。 在 2018 第十届国际物联网博览会(春季展)的富士通展台上,您看到的是 FRAM RFID 的无线无源应用—— 二 薄型二氧化锰锂一次性电池 薄型二氧化锰锂一次性电池,就像纸一样又薄又轻,可做到不受电池厚度限制的应用薄型设计。 三 Mesh-Beacon模块/智能网络模块 Mesh Beacon,仅用 Beacon 就能够组建 Mesh 网络。利用富士通智能网络所擅长的网络自动修复属性属性,可以自动修复因单个节点故
[网络通信]
这个表带让手指变手机,背后创业团队居然是大有来头
最近在Kickstarter上初创公司Innomdle Lab的一款智能 表带 SGNL火了,众筹才进行了一半,金额就达到了899126美元,几乎是其原始目标5万美元的18倍。   SGNL众筹被追捧的原因在于其独特的手指通话功能。表带通过 蓝牙 与手机连接,当来电时,佩戴SGNL用户按下表带上的开关,只需要用手指抵住耳朵就可以实现通话。这种酷酷的通话方式俘获了许多消费者的心。而且正由于直接的身体传导通话,其他人是无法听到通话内容的。手指堵住了耳朵也保证了使用者在嘈杂的环境下能获得清晰的通话效果。   这家 三星 背景的创业团队发明了SGNL智能表带,它能通过身体传导部件专利实现手指通话   手指通话功能背
[嵌入式]
stm32f103c8t6利用蓝牙控制180度舵机
关于蓝牙模块部分,如果不了解蓝牙模块的可以看我之前发的东西。 一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。以180度角度舵机为例,那么对应的控制关系是这样的: 0.5ms--------------0度; 1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 关于舵机的话,本人用的是6~8.4V的的60KG大舵机,这里需要注意的是, 控制板上面只提供5V电压,满足不了这种舵机的电压,所以我利用12V的锂电池,让锂
[单片机]
stm32f103c8t6利用<font color='red'>蓝牙</font>控制180度舵机
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved