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

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

补充:透传,即透明传输(pass-through),指的是在通讯中不管传输的业务内容如何,只负责将传输的内容由源地址传输到目的地址,而不对业务数据内容做任何改变。

所以本文就介绍一下这款蓝牙通信模块的使用,包括蓝牙模块的调试、手机与蓝牙模块之间的传输、手机蓝牙与树莓派通信。 但是这仅仅是使用,以后有时间应该会对蓝牙有一个稍微深度的学习。

模块名称:HC-05 蓝牙串口通信模块
参考资料:HC-05 蓝牙串口通信模块官方资料包
知识储备:串口通信基本原理(超基础、详细版)
其他模块:USB 转 TTL 模块、手机蓝牙串口助手 app

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

蓝牙模块的调试

准备工作

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

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

HC-05蓝牙串口通信模块使用详解 - 图1

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

附可能会用到的驱动:链接: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 指令:
![VG0WFCQFY9ZQY)X~X}JI$4.png
| AT | OK | 测试指令 |
| AT+RESET | OK | 模块复位 |
| AT+VERSION? | +VERSION: OK | 获得软件版本号 |
| AT+ORGL | OK | 恢复默认状态 |
| AT+ADDR? | +ADDR: OK | 获得蓝牙模块地址 |
| AT+NAME= | OK | 设置设备名称 |
| AT+NAME? | +NAME: OK | 获得设备名称 |
| AT+PSWD= | OK | 设置模块密码 |
| AT+PSWD? | +PSWD: OK | 获得模块密码 |
| AT+UART=,, | OK | 设置串口参数 |
| AT+UART? | +UART:,, 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。

例子:

HC-05蓝牙串口通信模块使用详解 - 图2

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

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

直接将蓝牙模块与转换模块连接,再讲其连接到电脑上,蓝牙模块直接进入自动连接工作模式。
此时手机打开蓝牙串口调试应用,用其来连接蓝牙模块。手机蓝牙串口助手软件,可以点击链接下载:蓝牙串口。万分推荐这款,因为界面脱离了那种黑不溜秋的感觉,比较简洁、清爽。

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

然后在电脑上的调试助手和手机的蓝牙串口调试应用之间就可以相互传输了,比如:

HC-05蓝牙串口通信模块使用详解 - 图3

HC-05蓝牙串口通信模块使用详解 - 图4
可以清楚的看到:电脑向手机发送了 “hello you”,手机向电脑发送了 “hello world”。

手机蓝牙控制 STM32 单片机

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

实现功能:手机通过蓝牙,向 STM32 单片机发送消息,STM32 接收到消息之后原封不动的返回给手机。当然如果掌握了这个例子,也可以修改成,手机发送特定的消息,然后,STM32 单片机做出相对应的动作。比如:点亮 LED 等、发动电机等等。

连接说明

HC-05蓝牙串口通信模块使用详解 - 图5

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

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

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

STM32 控制程序

  1. void My_USART1_Init(void)
  2. GPIO_InitTypeDef GPIO_InitStrue;
  3. USART_InitTypeDef USART_InitStrue;
  4. NVIC_InitTypeDef NVIC_InitStrue;
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  7. GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
  8. GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
  9. GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  10. GPIO_Init(GPIOA,&GPIO_InitStrue);
  11. GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  12. GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
  13. GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  14. GPIO_Init(GPIOA,&GPIO_InitStrue);
  15. USART_InitStrue.USART_BaudRate=115200;
  16. USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  17. USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
  18. USART_InitStrue.USART_Parity=USART_Parity_No;
  19. USART_InitStrue.USART_StopBits=USART_StopBits_1;
  20. USART_InitStrue.USART_WordLength=USART_WordLength_8b;
  21. USART_Init(USART1,&USART_InitStrue);
  22. USART_Cmd(USART1,ENABLE);
  23. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  24. NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
  25. NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
  26. NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
  27. NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
  28. NVIC_Init(&NVIC_InitStrue);
  29. void USART1_IRQHandler(void)
  30. if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  31. res= USART_ReceiveData(USART1);
  32. USART_SendData(USART1,res);
  33. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  34. 这段程序和[【STM32】串口相关配置寄存器、库函数(UART一般步骤)](https://blog.csdn.net/qq_38410730/article/details/79897008)中的程序一模一样,几乎没有什么改动。
  35. 区别就是,在UART实验中,USART1是和USB转串口模块连接在一起的,然后与电脑上的串口调试助手进行通信;现在改成USART1是和蓝牙模块连接在一起的,然后和手机上的蓝牙串口调试助手进行通信。
  36. ![](https://img-blog.csdnimg.cn/20190205181542257.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDEwNzMw,size_16,color_FFFFFF,t_70)
  37. [https://yngzmiao.blog.csdn.net/article/details/80368485?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-17.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-17.no_search_link](https://yngzmiao.blog.csdn.net/article/details/80368485?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-17.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-17.no_search_link)

参考资料