datasheet

基于STM32的无线通信模块使用——HC_05蓝牙串口

2019-07-11来源: eefocus关键字:STM32  无线通信模块  HC_05  蓝牙串口

一、模块介绍

1、供电电压3.3V~3.6V; 

2、支持AT指令集配置模块; 

3、采用CSR主流蓝牙芯片,蓝牙V2.0协议标准; 

4、波特率最高为1382400bps; 

5、配对以后当全双工串口使用,无需了解任何蓝牙协议,但仅支持8位数据位、1位停止位、无奇偶校验的通信格式,这也是最常用的通信格式,不支持其他格式。 

6、接口电平3.3V,可以直接连接各种单片机(51,AVR,PIC,ARM,MSP430等),5V单片机最好串联一个1K电阻再与模块直接连接,无需MAX232也不能经过MAX232!


二、PC端配置模块,手机端连接模块

如果要配置模块的参数,那么就必须要进入AT命令模式,我们首先通过PC机来配置一个模块。


1、进入AT模式设置

1.1、通过一条USB转串口线与模块相连,注意是要交叉连接。 

1.2、在PC端上使用串口调试助手设置正确的波特率、校验位、停止位。AT模式下波特率固定为38400bps。这个波特率是不能更改的。 

1.3、进入AT模式有如下两种方法:


1:在模块上电之前(也可以同时),把KEY脚设置为高电平(或接VCC),然后再对模块上电。此时LED慢闪(2S一次),模块进入AT状态,波特率固定为38400. 

2:在模块上电的时候,把KEY脚设置为低电平(或接GND),此时LED快闪(1S两次),然后再把KEY脚设置为高电平(或接VCC),模块也会进入AT指令,但是LED依旧快闪,此时波特率为默认波特率9600.


按照上述的方法,进入AT模式后,此时led由原先的快闪变成2s闪一次,在串口调试助手中输入”AT”,如果响应”OK”,说明进入AT命令模式成功,此后就可以测试其他的命令了。注意,AT指令集最后面都要跟着发送 rn也就是回车换行符,这样模块才认这个指令


2、模块的配置为从机

从机只能用来被搜索,不能主动搜索其他设备。 

因为前期是要熟悉模块的配置以及使用,所以先配置为从机供其他设备(PC机、手机)搜索连接。在PC机上的串口调试助手中依次输入如下AT指令进行配置。 

-> 首先回复初始化设置 AT+ORGL 

初始化设置


-> 设置从机名字 AT+NAME=SLAVE 


设置名字

-> 设置波特率 AT+UART=115200,1,2 

设置波特率


-> 设置为从机角色 AT+ROLE=0 


设置设备角色

-> 重启设备 AT+RESET 


重启设备

当重启设备成功后,此时模块会自动进入正常工作模式(还未被连接或连接上)led快闪。


3、通过手机蓝牙连接模块

按照上面的步骤配置完成后,无论是通过手机或者是PC机都可以进行配对连接。手机的话可以安装”蓝牙串口助手”与模块进行配对连接,这样两者之间就可以与模块进行通信了。当两者连接成功后,模块进入透传模式,此时led等2闪1停。


三、STM32串口配置模块

若未进行初始化操作,该模块只需配置一次即可使用。在使用的时候,我们可以通过PC来配置模块,当然也可以通过软件来配置模块。两者实际上是一样的,都是通过串口往模块写入AT指令。在PC端我们通过串口调试助手写入一个AT指令,模块就会响应相应的内容显示在串口调试助手上,我们也就能判断刚刚写入的指令是否OK。但是,通过stm32的串口配置模块有一点需要注意的,那就是要准确的识别模块的响应操作的内容。


1、写入指令

// 往串口中写入指定大小的数据

int16_t WriteATCmd(USART_TypeDef* USARTx, char *cmd, uint16_t size)

{

    uint16_t i = 0;

    if(cmd != NULL)

    {

        for(i=0; i

        {

            USART_TrasmitData(USARTx, cmd[i]);

        }

        // 注意最后要写入 rn

        USART_TrasmitData(USARTx, 0x0d);

        USART_TrasmitData(USARTx, 0x0a);

        return 0;

    }

    else

    {

        printf("cmd is NULLn");

        return -1;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

// 设置模块名称

int16_t HC_05_ATName(char *name)

{

    uint16_t cmd_size = 0;

    uint16_t name_size = 0;

    int16_t ret = 0;

    int16_t res_size = 0;

    // 存放模块响应字符串的数组,这个数 组的长度可以根据AT指令集文档中响应的字符串长度做调整

    char respon[10] = {0};        

    char AT_NAME_CMD[20] = "AT+NAME=";

    name_size = strlen(name);

    cmd_size = strlen(AT_NAME_CMD);

    // 当name的长度过大,只取20-cmd_size个字符

    if((name_size+cmd_size) > 20)

        strncat(AT_NAME_CMD, name, 20-cmd_size);

    else

        strcat(AT_NAME_CMD, name);

    cmd_size = strlen(AT_NAME_CMD);

    // 通过STM32的USART1往串口写入数据AT_NAME_CMD,共写入cmd_size大小

    ret = WriteATCmd(USART1, AT_NAME_CMD, cmd_size);

    if(ret == 0)

    {

        printf("Write AT_NAME_CMD OKn");

    }

    else

    {

        printf("Write AT_NAME_CMD ERRORn");

    }

    res_size = ReadResponse(USART2, respon);

    ret = isResponseOK(res_size, respon);

    return ret; 

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

2、读取模块的响应数据

当写入AT指令正确后,模块就会响应一个相应的字符串给我们,从HC-05 AT指令集的文档中我们看到,无论写入哪种AT指令,如果正确,最终都会反馈一个”OK”的字符串,我们可以通过这个字符串来判断写入的指令是否响应正确。


int16_t ReadResponse(USART_TypeDef* USARTx, char *Str)

{

    uint16_t data = 0;

    uint16_t Status = 0;    

    uint16_t pos = 0;

    int16_t size = 0;

    while(1)

    {

        // 每次从串口读取一个字符前都要启动定时器

        TIM2_Config_Init(1000);

        TIM_Cmd(TIM2, ENABLE);

        while(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET)

        {

            // 表示已读取到末尾

            if(Status == 1)

            {

                size = strlen(Str);

                TIM_Cmd(TIM2, DISABLE);

                break;

            }

            // 表示已经超时,此时不再等待从串口中读取数据

            if(TimeoutFlag == 1)

            {

                break;

            }

        }

        if(TimeoutFlag != 1)   // 未超时

        {

            if(Status != 1)           // 读取未结束

            {

                data = USART_ReceiveData(USARTx);  // 从串口中读取数据

                // 只有存放非 r和 n的字符

                if((data != 'r') && (data != 'n'))    

                {

                    Str[pos++] = data;

                    if(pos > 1)

                    {

                        // 判断倒数第四和第三个字符是否是"OK",若是则表明已读取到末尾(注:倒数第一和第二个字符是rn,已被过滤掉)

                        if((Str[pos-2] == 'O') && (Str[pos-1] == 'K'))      

                        {

                            Str[pos] = '';                // 为了便于计算,在获取的字符串中加入字符结束标志

                            Status = 1;

                        }

                    }

                }

            }

            else

            {

                break;

            }

        }

        else

        {

            TimeoutFlag = 0;

            size = -1;

            printf("Read AT_Cmd response timeoutn");

            break;

        }       

    }

[1] [2]

关键字:STM32  无线通信模块  HC_05  蓝牙串口

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic467487.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32使用蓝牙串口HC-05来进行收发数据和控制的使用流程
下一篇:STM32F103 代码远程升级(一)初识IAP编程

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32开发笔记20: STM32L053R8T6的keil配置

单片机型号:STM32L053R8T6    使用STM32CubeMX生成STM32L053R8T6相关的应用程序代码后,使用Keil开发环境第1次下载的时候,提示如下错误,我使用F0和F4的单片机,没有遇到过。    仔细查看工程设置,原因在工程设置中,我们需加入相应的Flash配置信息,如下图所示,具体的选择,要根据单片机的类型,我们可以仔细查看数据手册。    但下载的时候,偶尔还会提示如下错误:    这件事情网上说了很多的解决方法,我自己测试,更改2处Keil的设置既可以解决,如下图所示。    此2处更改后,反复
发表于 2019-07-16
STM32开发笔记20: STM32L053R8T6的keil配置

STM32开发笔记21: USB驱动的移植

单片机型号:STM32L053R8T6    现在使用的STM32L053R8T6单片机带有USB接口,原先一直使用UART转USB芯片来完成USB功能的支持,现在这款单片机带了就希望使用以下。由于已经建立了自己的工程目录,再重新使用STM32CubeMX生成的工程文件,重新建立是不显示的,所以本文探索将USB驱动文件移植到自己项目中的方法,我使用的是USB的CDCD类,步骤如下:    1、使用STM32CubeMX使能USB,如下图所示:    2、设置时钟,USB需要48M时钟,使用内部和外部均可,我这里使用外部时钟。    3、生成工程文件
发表于 2019-07-16
STM32开发笔记21: USB驱动的移植

STM32开发笔记22: 手动添加驱动文件

单片机型号:STM32L053R8T6    我们可以通过STM32CubeMX生成工程代码,但是如果我们的工程已经建立完毕了,或者说我们在原有的工程上,开始新的项目设计,此时又需加入新的驱动,该如何呢?本文探讨其解决方法。    1、STM32CubeMX的驱动路径如下图所示,我们希望加入什么驱动,就直接将其对应的.c文件加入到工程中即可。    2、为了使该模块生效,我们还学将其使能。其使能宏,在stm32l0xx_hal_conf.h中,如下图所示。    3、上述工作完成后,我们就可以对工程进行编译了,至于驱动的具体调用方法,我们可以参看ST
发表于 2019-07-16
STM32开发笔记22: 手动添加驱动文件

STM32开发笔记23: 使用__weak修饰符

单片机型号:STM32L053R8T6在 HAL 库中,很多回调函数前面使用__weak 修饰符。 weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。 举个例子:我们打开工程模板,找到并打开文件stm32f4xx_hal.c 文件,里面定义了一个函数 HAL_MspInit,定义如下:__weak void 
发表于 2019-07-16

STM32开发笔记24:STM32L0低功耗设计——需求概述

单片机型号:STM32L053R8T6    这几篇日志将详细记录,自己应用stm32进行低功耗设计的全过程。    使用芯片:STM32L053R8T6    运行模式:        Range 1:电源电压限制在1.71-3.6V,CPU最大运行频率为32MHz。        Range 2:CPU最大运行频率为16MHz。        Range 3:CPU最大运行频率4.2MHz    低功耗模式: 
发表于 2019-07-16
STM32开发笔记24:STM32L0低功耗设计——需求概述

STM32开发笔记25:STM32L0低功耗设计-使用Keil和ST-Link下载程序

单片机型号:STM32L053R8T6    继续项目的开发工作,突然发现,程序不能够正常下载到单片机中了,提示如下图所示的错误,我使用的是keil和ST-Link。    这个问题在我第1次调试的时候发生过1次,我认为是我误操作将芯片烧坏了,因为当时又反复的焊接了一下芯片,也没有修好,就把这件事情放下了。    今天再次出现,自己感觉可能和低功耗有关,仔细查看刚刚下载的程序,里面上来程序就进入低功耗,没有任何退出语句,所以应该是CPU不响应下载命令了。    按照这种思路,先将单片机的复位引脚接地,然后点击下载按钮的同时,放开复位引脚,居然成功
发表于 2019-07-16
STM32开发笔记25:STM32L0低功耗设计-使用Keil和ST-Link下载程序

小广播

何立民专栏

单片机及嵌入式宝典

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

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