HC-06蓝牙模块从AT命令配置到单片机集成的完整指南
1. 项目概述:为什么HC-06蓝牙模块依然是入门首选?
如果你刚开始接触单片机与无线通信,想找一个简单、稳定、成本又低的蓝牙方案,那么HC-06(或者它的马甲ZS-040)几乎是绕不开的名字。它不像现在流行的BLE(低功耗蓝牙)模块那样功能复杂、协议栈庞大,HC-06属于经典的蓝牙2.0+EDR模块,主打的就是一个简单可靠。它的核心功能就是建立一个透明的串口无线链路,你把数据从单片机串口发进去,它就从蓝牙端发出去;反之亦然。对于初学者来说,这意味着你几乎不用关心复杂的蓝牙协议,可以像操作一根“无线串口线”一样去使用它,极大地降低了学习门槛。
我手头这个标着“ZS-040”的模块,其实就是HC-06的一个常见版本,电路和固件都完全兼容。无论是用来做Arduino的无线数据透传,还是给51、STM32单片机项目增加手机控制功能,它都是性价比极高的选择。不过,很多新手拿到模块后,直接接线就发现连不上,或者无法与手机配对,问题往往出在第一步:模块的初始配置没有做。这篇内容,我就结合自己多次使用的经验,从硬件识别、AT命令配置、手机连接测试到与单片机整合,把整个流程掰开揉碎了讲清楚,帮你避开那些我踩过的坑。
2. 硬件准备与核心引脚解析
在开始敲代码或发命令之前,我们得先认清手里的模块。HC-06/ZS-040模块通常是一个小巧的蓝色板子,上面最显眼的就是那个银色或黑色的蓝牙天线。别看它引脚不多,每一个都至关重要,接错了轻则不工作,重则烧毁模块。
2.1 模块引脚定义与电源要点
最常见的HC-06模块是6引脚版本(也有4引脚的),其引脚排列和功能如下:
| 引脚标识 | 引脚名称 | 功能说明 | 连接与注意事项 |
|---|---|---|---|
| VCC | 电源正极 | 模块供电脚 | 必须接3.3V! 这是新手最容易犯错的地方。虽然有些资料说可以接5V,但绝大多数HC-06模块的逻辑电平是3.3V,接5V极易损坏。 |
| GND | 电源地 | 模块接地 | 与单片机、USB转TTL工具的GND共地。 |
| TXD | 串口发送 | 模块发送数据脚 | 接单片机或USB转TTL的RXD(接收脚) 。模块通过此脚向外发送数据。 |
| RXD | 串口接收 | 模块接收数据脚 | 接单片机或USB转TTL的TXD(发送脚) 。外部通过此脚向模块发送数据或AT命令。 |
| STATE | 状态指示 | 连接状态输出 | 未连接时为低电平,连接后输出高电平。可用于驱动LED或给单片机提供状态信号,非必需。 |
| EN/KEY | 使能/配对 | 进入AT模式控制 | 核心引脚 。默认悬空或拉高为正常工作模式。将其拉高(接VCC)再上电,模块进入AT命令配置模式。 |
重要提示 :关于VCC电压,我强烈建议你使用万用表测量一下你的USB转TTL工具上的3.3V输出引脚是否准确。有些劣质工具的3.3V实际可能达到3.6V以上,长期使用也有风险。最稳妥的方案是使用一颗AMS1117-3.3之类的稳压芯片,从5V稳压到3.3V给模块供电。
2.2 必备工具:USB转TTL模块的选择与使用
由于电脑和单片机本身没有直接的串口,我们需要一个USB转TTL模块作为“翻译官”。市面上主要有两种:基于CH340G芯片和基于CP2102芯片的。两者都可以用,稳定性都不错。
连接方法(用于配置模块时) :
- USB转TTL模块 -> HC-06蓝牙模块
3.3V->VCCGND->GNDTXD->RXDRXD->TXD
这里务必注意交叉连接:转接模块的发送(TXD)接蓝牙模块的接收(RXD),反之亦然。同时, 先将HC-06的EN/KEY引脚悬空(什么都不接) ,我们第一步是测试模块是否正常启动。
连接好后,将USB转TTL插入电脑。如果模块正常,你会看到板载的LED指示灯开始快速闪烁(大约每秒2次),这表示模块已上电并处于“等待配对”状态。如果灯不亮,请立即检查电源和接地。
3. 进入与使用AT命令模式进行配置
AT命令是配置HC-06所有参数的唯一途径,比如修改蓝牙名称、配对密码、通信波特率等。这个过程是项目成功的关键。
3.1 如何正确进入AT模式
很多教程只说了“拉高KEY脚进入AT模式”,但细节没说清,导致很多人失败。正确的操作流程是:
- 断开所有电源 :确保USB转TTL和HC-06模块都没有通电。
- 连接KEY引脚 :用一根杜邦线,将HC-06模块的
EN/KEY引脚,连接到VCC(即3.3V)上。 在AT模式配置期间,这根线需要一直保持连接。 - 保持接线 :保持USB转TTL与HC-06的
VCC, GND, TXD, RXD连接不变。 - 上电 :将USB转TTL插入电脑。此时,观察HC-06模块的指示灯。如果进入AT模式成功, 指示灯会变为慢闪(大约每2秒闪烁一次) ,这与之前快闪的等待配对状态截然不同。这是一个非常重要的视觉判断依据!
3.2 串口助手软件配置与基础AT指令测试
电脑上需要一款串口助手软件,如 Putty 、 Arduino IDE 的串口监视器,或者更常用的 XCOM 、 SSCOM 等。这里以功能直观的 SSCOM 为例。
- 打开串口助手 ,选择正确的COM口(在设备管理器的“端口”下查看)。
- 设置参数 :波特率设置为
38400(这是绝大多数HC-06模块AT模式的默认波特率)。数据位8,停止位1,无校验位(8N1)。 - 打开串口 。
- 发送测试指令 :在发送框输入
AT(注意是大写,不要带任何空格和回车以外的字符),点击发送。如果一切正常,你会在接收区看到模块返回OK。 如果返回的是乱码,最常见的原因是波特率不对。可以尝试其他常见波特率,如9600、115200等,但38400的成功率最高。如果没有任何返回,请检查接线、KEY脚是否已接VCC,以及指示灯是否为慢闪状态。
3.3 常用AT命令详解与配置实战
成功连接后,你就可以像聊天一样给模块发送命令了。每条命令以 AT 开头,以 \r\n (回车换行)结尾,串口助手通常有“发送新行”选项,勾上即可自动添加。
下面是一个完整的配置流程,我将每条命令的作用和可能的结果都列出来:
| AT命令 | 功能描述 | 示例发送 | 正常响应 | 说明与注意事项 |
|---|---|---|---|---|
AT |
测试连接 | AT |
OK |
基础测试命令,确认通讯正常。 |
AT+NAME? |
查询当前蓝牙名称 | AT+NAME? |
+NAME:<当前名称> |
默认名称通常是 HC-06 。 |
AT+NAME=<name> |
设置蓝牙名称 | AT+NAME=MyRobot |
OK |
将名称改为 MyRobot ,手机搜索时会显示此名。 |
AT+PSWD? |
查询配对密码 | AT+PSWD? |
+PSWD:<密码> |
默认密码通常是 1234 或 0000 。 |
AT+PSWD=<pswd> |
设置配对密码 | AT+PSWD=8888 |
OK |
将配对密码改为 8888 。建议修改以增加安全性。 |
AT+BAUD? |
查询通讯波特率 | AT+BAUD? |
+BAUD:<代码> |
返回的是代码,需要查表。 |
AT+BAUD=<code> |
设置通讯波特率 | AT+BAUD=4 |
OK |
设置波特率。 这是重中之重! 代码4代表9600,这是最常用、最稳定的速率。代码8是115200,虽然快但容易出错。 强烈建议设为9600 。 |
AT+VERSION? |
查询版本信息 | AT+VERSION? |
+VERSION:<版本> |
可用于确认模块固件。 |
AT+RESET |
软复位模块 | AT+RESET |
OK |
执行后模块会重启,退出AT模式。 |
实操配置案例 : 假设我想将模块名称改为“BlueTooth_Car”,密码改为“1597”,波特率设为9600,并与单片机通信。我的操作顺序是:
- 发送
AT,确认返回OK。 - 发送
AT+NAME=BlueTooth_Car,返回OK。 - 发送
AT+PSWD=1597,返回OK。 - 发送
AT+BAUD=4,返回OK。 (注意,执行此命令后,当前的串口通讯波特率立即变为9600!) - 重要步骤 :在串口助手中,将波特率从
38400改为9600,重新打开串口。 - 再次发送
AT,确认在9600波特率下依然返回OK,说明设置永久生效。 - 发送
AT+RESET让模块重启。或者,更直接的做法: 拔掉KEY脚与VCC的连接(或将其接地),然后给模块重新上电 。此时模块指示灯恢复快闪,进入可配对状态,且所有配置已保存。
踩坑心得 :设置波特率后,一定要记得在串口助手里把波特率改过来再测试,否则你会以为模块“坏了”或“没反应”。另外,有些廉价的HC-06模块对高波特率(如115200)支持不稳定,通信时会出现乱码或丢包,在单片机项目中也建议使用9600波特率,这是经过大量实践验证的稳定选择。
4. 与手机及单片机建立稳定连接
配置完成后,模块就进入了“工作模式”。我们的目标是让手机和单片机都能通过蓝牙与它稳定通信。
4.1 手机端连接与调试工具使用
- 手机搜索 :打开手机的蓝牙设置,开始搜索新设备。你应该能看到你刚刚设置的蓝牙名称(如
BlueTooth_Car)。 - 配对 :点击该设备进行配对,输入你设置的密码(如
1597)。配对成功后,在已配对设备列表中会看到它。 注意:此时只是蓝牙层面的配对,相当于交换了“钥匙”,还没有建立数据通信链路。 - 使用蓝牙串口APP :你需要一个APP来建立串口通信。市面上有很多,如“蓝牙串口”、“Serial Bluetooth Terminal”等。在APP内,选择连接已配对的HC-06设备。
- 测试通信 :连接成功后,HC-06模块的指示灯会变为常亮(或缓慢双闪,因版本而异),表示数据链路已建立。在APP的发送框输入一些字符,同时在电脑端用串口助手(波特率设为9600,KEY脚断开)查看,应该能收到手机发来的数据。反之,从电脑端发送数据,手机APP也应能收到。这就完成了手机与模块的双向透传测试。
4.2 与单片机(以STM32为例)的集成与编程
这是项目的最终环节,让单片机通过串口与HC-06对话。我们假设你已经配置好模块波特率为9600,名称为 MyBT 。
硬件连接 :
HC-06.VCC->STM32.3.3VHC-06.GND->STM32.GNDHC-06.TXD->STM32.USARTx_RX(例如 PA3)HC-06.RXD->STM32.USARTx_TX(例如 PA2)HC-06.KEY-> 悬空或通过一个IO口控制(如需程序中切换AT模式)。
软件思路(基于HAL库) :
- 初始化串口 :初始化一个USART,波特率设为9600(与模块匹配),使能接收中断。
- 编写发送函数 :直接调用
HAL_UART_Transmit向模块发送数据,数据会通过蓝牙发送到已连接的手机。 - 编写接收中断回调函数 :在
HAL_UART_RxCpltCallback中断回调函数中,处理从蓝牙模块(即手机)发来的数据。例如,收到字符'1'点亮LED,收到'0'熄灭LED。 - 主循环 :可以定时向手机发送传感器数据等。
核心代码片段示例 :
// 串口初始化部分(以USART1为例)
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
// 使能接收中断
HAL_UART_Receive_IT(&huart1, &rx_buffer, 1);
// 接收完成中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) {
if(rx_buffer == '1') {
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); // 开灯
} else if(rx_buffer == '0') {
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); // 关灯
}
// 重新开启接收中断,等待下一个字节
HAL_UART_Receive_IT(&huart1, &rx_buffer, 1);
}
}
// 主函数中发送数据示例
char msg[] = "Hello from STM32!\r\n";
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 1000);
通过这样的设置,你的单片机就拥有了蓝牙无线通信能力。手机APP发送 1 或 0 可以控制LED,单片机也可以主动向手机发送信息。
5. 常见问题排查与深度优化技巧
即使按照步骤操作,你也可能会遇到一些奇怪的问题。这里我整理了一份“故障速查表”,涵盖了从配置到连接全流程的典型问题。
| 现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 上电后指示灯不亮 | 1. 电源接错(接了5V或正负极反接)。 2. 模块损坏。 3. 供电电流不足。 |
1. 万用表测量VCC-GND电压是否为稳定3.3V。 2. 检查USB转TTL的3.3V输出能力,尝试单独给模块供电。 3. 换一个模块测试。 |
| AT模式下发指令无反应 | 1. KEY脚未正确拉高。 2. 串口波特率不对。 3. TXD/RXD接反。 4. 未勾选“发送新行”。 |
1. 确认KEY脚在 上电前 已接VCC,且指示灯为 慢闪 。 2. 依次尝试 38400 , 9600 , 115200 等波特率。 3. 检查TXD-RXD是否交叉连接。 4. 确保串口助手发送了 \r\n 。 |
| 手机搜不到蓝牙设备 | 1. 模块未进入配对状态(指示灯非快闪)。 2. 手机蓝牙未打开或距离过远。 3. 模块名称含特殊字符。 |
1. 确认KEY脚悬空,重新上电,指示灯应快闪。 2. 靠近模块(<10米),重启手机蓝牙。 3. 用AT命令设一个简单的英文名。 |
| 手机配对时提示密码错误 | 1. 输入的密码与模块设置不符。 2. 模块默认密码非 1234 。 |
1. 进入AT模式,用 AT+PSWD? 查询确认密码。 2. 尝试 0000 , 1234 , 8888 等常见默认密码。 |
| 连接后数据收发乱码 | 1. 单片机与模块波特率不匹配。 2. 电源干扰导致信号不穩。 3. 波特率设置过高(如115200)不稳定。 |
1. 双盲检查 :确认单片机程序初始化波特率与模块AT命令设置的波特率完全一致。 2. 在VCC和GND之间并联一个 10uF 和 0.1uF 的电容,靠近模块引脚放置,可极大改善电源质量。 3. 降至9600波特率 ,这是最稳定的方案。 |
| 通信距离很短(<3米) | 1. 环境干扰(Wi-Fi、微波炉)。 2. 模块天线附近有金属或手遮挡。 3. 模块本身质量或功率问题。 |
1. 更换环境测试。 2. 确保天线部分完全裸露,无遮挡。 3. 经典蓝牙2.0模块的室内理想距离在10米左右,如果差太多,考虑更换模块。 |
| 单片机与模块连接后,无法进入AT模式 | 1. 单片机串口引脚在初始化后持续输出信号,干扰了AT命令。 2. KEY脚控制逻辑错误。 |
1. 在需要配置时, 断开单片机与模块的连接 ,仅用USB转TTL连接模块进行配置。 2. 若要通过单片机IO控制KEY脚,确保上电瞬间该IO为高电平,且持续到配置完成。 |
深度优化技巧 :
- 电源滤波是王道 :蓝牙模块对电源纹波非常敏感。无论你用的是单片机上的3.3V还是LDO输出的3.3V,都强烈建议在HC-06的VCC和GND引脚之间,焊接一个 10μF的钽电容 和一个 0.1μF的陶瓷电容 ,这能解决90%以上莫名其妙的通信断续和乱码问题。
- STATE引脚的应用 :将这个引脚接到单片机的一个普通IO口(配置为上拉输入)或一个LED上。当蓝牙未连接时,它为低电平;连接成功后变为高电平。这样你的设备就有了明确的蓝牙连接状态指示,可以在程序中做出相应反应(如连接后才开启数据发送)。
- 协议设计 :简单的字符指令(如
‘1‘, ’0‘)在复杂控制中不够用。可以设计简单的帧协议,例如[帧头][命令字][数据长度][数据内容][校验和][帧尾]。例如,发送A5 01 02 00 64 FE 5A表示控制1号设备打开(01),参数为100(0x64)。在单片机端解析这个协议,能让你的应用更健壮、功能更强大。 - 多模块干扰 :如果同一个区域有多个同名的HC-06模块,手机会很难区分。务必在项目初期就通过AT命令为每个模块设置独一无二的名称,如
Car_001,Car_002。
最后,关于HC-06和JDY-31这类BLE模块的选择,我的经验是:如果你的项目只需要单向或低速双向传输一些控制指令或传感器数据,对功耗不敏感,且希望开发极其简单,HC-06是完美选择。如果你的项目需要超低功耗(电池供电)、与手机有复杂的数据交互(如图表、配置界面),那么应该去学习JDY-31这类BLE模块。工具没有绝对的好坏,只有是否适合当前的项目需求。从HC-06这个经典的“无线串口”入手,无疑是打开无线通信世界大门最踏实的第一步。
更多推荐
所有评论(0)