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

HC-05蓝牙串口通信模块应该是使用最广泛的一种蓝牙模块之一了。为什么呢?

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

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

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

 

模块名称:HC-05蓝牙串口通信模块

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

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

其他模块:USB转TTL模块、手机蓝牙串口助手app

手机蓝牙串口助手软件,可以点击链接下载:蓝牙串口。因为这是我见过所有手机端界面最好看的了,其他的界面都有点太糟糕了。

 

蓝牙模块的调试

准备工作

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

两模块共地,两模块共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指令
指令名响应含义
ATOK测试指令
AT+RESETOK模块复位
AT+VERSION?+VERSION:<Param> OK获得软件版本号
AT+ORGLOK恢复默认状态
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选取PA9、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是和蓝牙模块连接在一起的,然后和手机上的蓝牙串口调试助手进行通信。

  • 23
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
要在STM32上实现蓝牙串口通信,你需要做以下几个步骤: 1. 配置USART串口通信:选择一个USART模块,配置其为UART模式,确定波特率、数据位、校验位和停止位等参数。 2. 配置蓝牙模块:将蓝牙模块连接到USART串口上,并按照蓝牙模块使用手册配置其工作模式和通信参数等。 3. 实现数据的发送和接收:通过USART串口向蓝牙模块发送数据,并从蓝牙模块接收数据,可以使用中断或轮询方式实现数据的发送和接收。 4. 处理数据:接收到的数据需要经过处理之后才能使用,你需要编写代码对接收到的数据进行解析、处理和回复等操作。 以下是一个简单的示例代码,可以帮助你理解如何在STM32上实现蓝牙串口通信: ```c #include "stm32f10x.h" #define USART USART1 void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); //使能GPIOA和USART1时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1_TX GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1_RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); //使能USART1 } void Bluetooth_Config(void) { USART_Config(); //根据蓝牙模块使用手册,配置蓝牙模块的工作模式和通信参数等 } void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收到数据 { //处理接收到的数据 USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志位 } } int main(void) { Bluetooth_Config(); while(1) { //发送数据 } } ``` 在这个示例代码中,我们使用USART1作为UART模式配置,通过GPIOA的Pin9和Pin10连接到蓝牙模块上。在USART_Config函数中,我们配置了USART的工作模式和通信参数等。在Bluetooth_Config函数中,我们根据蓝牙模块使用手册,配置了蓝牙模块的工作模式和通信参数等。在USART1_IRQHandler函数中,我们处理了接收到的数据。最后,在主函数中,我们可以通过USART串口向蓝牙模块发送数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值