【经常使用模块】HC-05蓝牙串口通讯模块使用详解(实例:手机蓝牙控制STM32单片机)

HC-05蓝牙串口通讯模块应该是使用最普遍的一种蓝牙模块之一了。为何呢?编程

由于HC05模块是一款高性能主从一体蓝牙串口模块,能够不用知道太多蓝牙相关知识就能够很好的上手。说白了,只是个蓝牙转串口的设备,你只要知道串口怎么编程使用,就能够了,实现了所谓的透明传输。app

可是就是这么一个很常见的模块,网上不少的博客写的都是错的,或者都是很不详细的。函数

因此本文就介绍一下这款蓝牙通讯模块的使用,包括蓝牙模块的调试、手机与蓝牙模块之间的传输、手机蓝牙控制STM32单片机,应该是逐渐深刻的一个过程。可是这仅仅是使用,之后有时间应该会对蓝牙有一个稍微深度的学习,而不能仅仅是浮于表面,只会用。oop

 

模块名称:HC-05蓝牙串口通讯模块性能

参考资料:HC-05蓝牙串口通讯模块官方资料包学习

知识储备:【STM32】串口通讯基本原理(超基础、详细版)测试

其余模块:USB转TTL模块、手机蓝牙串口助手appspa

手机蓝牙串口助手软件,能够点击连接下载:蓝牙串口。由于这是我见过全部手机端界面最好看的了,其余的界面都有点太糟糕了。.net

 

蓝牙模块的调试

准备工做

USB转TTL模块与HC-05蓝牙模块的接线:3d

两模块共地,两模块共VCC(VCC取5V);蓝牙模块的RX接转换模块的TX,蓝牙模块的TX接转换模块的RX。以下图所示:

这个时候就要将转换模块链接到电脑上,而后利用串口调试助手进行蓝牙模块的调试。

附可能会用到的驱动:连接:https://pan.baidu.com/s/1bpYLfCr 密码:yabv

蓝牙模块的调试

HC-05蓝牙串口通信模块具备两种工做模式:命令响应工做模式和自动链接工做模式。在自动链接工做模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工做角色。

  • 当模块处于自动链接工做模式时,将自动根据事先设定的方式链接的数据传输;
  • 当模块处于命令响应工做模式时能执行AT命令,用户可向模块发送各类AT 指令,为模块设定控制参数或发布控制命令。

怎么进入命令响应工做模式?

进入命令响应工做模式有两种方法:

  • 模块上电,未配对状况下就是AT模式,波特率为模块自己的波特率,默认:9600,发送一次AT指令时须要置高一次PIO11;
  • PIO11 置高电平后,再给模块上电,此时模块进入AT 模式,波特率固定为:38400,能够直接发送AT指令。

什么叫作置高一次PIO11?

在蓝牙模块中有一个小按键,按一下就置高一次PIO11。也就是说,第一种方法须要每发送一次AT指令按一次;而第二种方式是长按的过程当中上电,以后就无需再管了,直接发送AT命令便可。

须要注意一下,两种进入命令响应工做模式的方式使用的波特率是不同的,建议使用第二种方式。

怎么区分进了命令响应工做模式呢?

在蓝牙模块上有灯,当灯快闪的时候,就是自动链接工做模式;当灯慢闪的时候,就是命令响应工做模式。

AT命令

进入到命令响应工做模式以后,就可使用串口调试助手进行蓝牙调试了。

首先有一点,AT指令不区分大小写,均以回车、换行结尾。下面介绍经常使用的AT指令:

经常使用AT指令
指令名 响应 含义
AT OK 测试指令
AT+RESET OK 模块复位
AT+VERSION? +VERSION:<Param> OK 得到软件版本号
AT+ORGL OK 恢复默认状态
AT+ADDR? +ADDR:<Param> OK 得到蓝牙模块地址
AT+NAME=<Param> OK 设置设备名称
AT+NAME? +NAME:<Param> OK 得到设备名称
AT+PSWD=<Param> OK 设置模块密码
AT+PSWD? +PSWD:<Param> OK 得到模块密码
AT+UART=<Param1>,<Param2>,<Param3> OK 设置串口参数
AT+UART? +UART:<Param1>,<Param2>,<Param3> OK 得到串口参数

对于AT指令,有几点注意:

  • AT+NAME?:得到设备名称,这个AT指令有很大可能性是没有返回的,由于我也看到了不少的例子……,可是其余的指令都是没有问题的,直接设置设备名称就好了;
  • AT+UART?:得到串口参数,串口的参数一共有三个,波特率、中止位、检验位。其取值以下:
串口参数
参数名称 取值
波特率

2400、4800、9600、19200、38400、5760、

115200、230400、460800、921600、1382400

中止位

0:1位

1:2位

校验位 0:NONE  1:Odd  2:Even

其默认值为:9600,0,0。

例子:

本文中,蓝牙串口的波特率设置成115200。以后的内容,就会采用这个波特率来进行通信了。

 

手机与蓝牙模块之间的传输

直接将蓝牙模块与转换模块链接,再讲其链接到电脑上,蓝牙模块直接进入自动链接工做模式。

此时手机打开蓝牙串口调试应用,用其来链接蓝牙模块。手机蓝牙串口助手软件,能够点击连接下载:蓝牙串口。万分推荐这款,由于界面脱离了那种黑不溜秋的感受,比较简洁、清爽。

这个软件的使用:点击界面右下角蓝牙的标志,选择蓝牙进行链接。

而后在电脑上的调试助手和手机的蓝牙串口调试应用之间就能够相互传输了,好比:

能够清楚的看到:电脑向手机发送了“hello you”,手机向电脑发送了“hello world”。

 

手机蓝牙控制STM32单片机

以前的两个例子都是相比较而言比较简单的,这个例子将会涉及到程序的内容了。

实现功能:手机经过蓝牙,向STM32单片机发送消息,STM32接收到消息以后原封不动的返回给手机。固然若是掌握了这个例子,也能够修改为,手机发送特定的消息,而后,STM32单片机作出相对应的动做。好比:点亮LED等、发动电机等等。

链接说明

使用USART1进行试验,也就是说STM32选取PA九、PA10来和HC-05进行链接。同时手机经过蓝牙来和HC-05进行链接。

原理就是:手机经过蓝牙传输到HC-05上,再经过串口通讯和STM32通讯;而以前通常都是电脑上经过USB线转串口的方式,经过串口和STM32通讯。本质上没有区别的。

这个时候就应该更加深入地体会到了本文开篇的一句话:说白了,只是个蓝牙转串口的设备,你只要知道串口怎么编程使用,就能够了,实现了所谓的透明传输。蓝牙的相关一切都被封装起来了,都不须要接触到。

STM32控制程序

#include "stm32f10x.h"

 void My_USART1_Init(void)  
{  
    GPIO_InitTypeDef GPIO_InitStrue;  
    USART_InitTypeDef USART_InitStrue;  
    NVIC_InitTypeDef NVIC_InitStrue;  
      
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO端口使能  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口端口使能  
      
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;  
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;  
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  
    GPIO_Init(GPIOA,&GPIO_InitStrue);  
      
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;  
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;  
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  
    GPIO_Init(GPIOA,&GPIO_InitStrue);  
      
    USART_InitStrue.USART_BaudRate=115200;  
    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  
    USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;  
    USART_InitStrue.USART_Parity=USART_Parity_No;  
    USART_InitStrue.USART_StopBits=USART_StopBits_1;  
    USART_InitStrue.USART_WordLength=USART_WordLength_8b;  
      
    USART_Init(USART1,&USART_InitStrue);
      
    USART_Cmd(USART1,ENABLE);//使能串口1  
      
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断  
      
    NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;  
    NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;  
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;  
    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;  
    NVIC_Init(&NVIC_InitStrue);  
      
}  
  
void USART1_IRQHandler(void)  
{  
    u8 res;  
     if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  
 {  
     res= USART_ReceiveData(USART1); 	 
     USART_SendData(USART1,res);     
  }  
}  
   
 int main(void)  
 {    
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
    My_USART1_Init();  
     while(1);  
       
 }

这段程序和【STM32】串口相关配置寄存器、库函数(UART通常步骤)中的程序如出一辙,几乎没有什么改动。

区别就是,在UART实验中,USART1是和USB转串口模块链接在一块儿的,而后与电脑上的串口调试助手进行通讯;如今改为USART1是和蓝牙模块链接在一块儿的,而后和手机上的蓝牙串口调试助手进行通讯。