
简介HC-05蓝牙模块是嵌入式开发中常用的串口通信模块这份PDF使用说明面向正在学习蓝牙透传、需要完成主从设备配对的开发者围绕模块特性、引脚连接与AT指令配置展开讲解。压缩包内为单个PDF文档大小943KB内容涵盖模块电气参数输入电压3.6V-6V、典型波特率范围、状态指示灯含义、两种工作模式及主/从/回环角色并详细演示了通过USB转TTL模块进入AT命令模式、设置串口参数、修改蓝牙名称密码、配置主从模式及实现地址绑定的完整流程。文中特别提醒了下载器与蓝牙模块需交叉连接、AT指令需换行等易错细节并提供了ATNAME、ATPSWD、ATROLE、ATCMODE、ATBIND等关键指令的用法示例可帮助读者快速实现双模块透传。该模块可用于GPS导航、水电煤气抄表、工业现场采控等场景目前已有108人学习下载适合嵌入式、物联网及电子竞赛初学者按步骤对照操作也可作为课程设计或项目开发中HC-05模块快速上手的参考资料。1. 项目概述这块“老掉牙”的蓝牙模块为什么还在用HC-05这块模块我前后用了四五年从最初在学校实验室做智能小车到后来帮朋友做无线串口透传的小工具它都是我最先想到的选择。你可能觉得蓝牙4.0、5.0都普及这么多年了为什么还要回头折腾一块蓝牙2.0时代的模块但实际做项目你会发现HC-05最大的优势不是性能而是“零门槛”引脚就六个AT命令一套跟单片机连接只需要两根数据线资料铺天盖地遇到问题一搜就有答案。对于初学者理解蓝牙串口通信的原理以及快速验证无线传输方案它依然是无法绕开的一块板子。从定位上说HC-05是一个基于CSR BC417芯片的蓝牙2.0EDR模块工作频段2.4GHzClass 2标准空旷环境下通信距离通常在10米左右。它默认工作在“蓝牙串口SPP”模式也就是把蓝牙无线链路虚拟成一条串口线——单片机那边发出来的串口数据经过蓝牙发送到对端设备对端设备发过来的数据又通过串口喂给单片机。对于Arduino、STM32这类开发板来说你根本不需要关心蓝牙协议栈怎么分层、射频怎么配对把它当成一根“会自己配对的杜邦线”就完事了。这篇内容适合谁看如果你是刚接触蓝牙通信的学生、做创客项目的爱好者或者手头正好有一块HC-05但是用不起来那下面这几大块内容——硬件引脚、AT命令、Arduino联调、高频故障排查——都是可以直接抄作业的。我会把每一步为什么这么做、不这么做会踩什么坑都讲透而不是丢一份压缩包里的PDF让你自己猜。2. 引脚定义与硬件接线动手前的关键一课2.1 六个引脚每个都得弄明白HC-05模块最常用的封装是带底板和六个引脚的版本少数是四引脚母板。带底板的型号引出了六个排针名称和功能如下表引脚名称方向作用说明EN或者Key输入使能/AT模式控制脚高电平进入AT指令模式VCC电源通常接3.6V~6V底板自带稳压5V也能用GND电源公共地必须与单片机共地TXD输出蓝牙模块的串口发送脚接单片机RXRXD输入蓝牙模块的串口接收脚接单片机TXSTATE输出状态指示脚未配对低电平配对成功高电平这里有个容易搞混的地方TXD和RXD的接法是交叉的模块的TXD要连单片机的RX模块的RXD要连单片机的TX。很多新手第一次接线直接“同名相连”TXD对TXD结果死活收不到数据就是这个原因。再看EN脚这个脚在不同的应用场景里有两种叫法叫EN是因为它控制模块是否进入AT命令模式叫Key是因为老版本HC-05底板上的按钮直接连的就是这个引脚。按键没按下时EN被底板上的下拉电阻拉低模块正常作为从机等待连接按住按键再上电EN变成高电平模块进入AT模式这时能和模块对话的只有串口指令外部设备是连不进来的。2.2 电平转换3.3V与5V之间必须有交代HC-05底板上的核心芯片是3.3V供电的逻辑器件但它特意在底板上加了稳压和电平转换电路所以VCC可以直接接5VRXD脚也能承受5V电平跟Arduino UNO这类5V单片机直连是没有问题的。这一点非常关键因为我见过不少人拿着HC-06或者普通蓝牙模块误以为所有蓝牙模块都能直接接5V结果把模块烧了。如果你用的是3.3V供电的单片机比如ESP32、STM32F103C8T6虽然它的IO标称容忍5V但还是建议确认、或树莓派GPIO那TXD输出电平就在3.3V左右接3.3V单片机没问题如果单片机是5V且需要更稳妥的方案可以通过两个电阻分压给RXD限流。不过以我实测经验HC-05带底板版本直连Arduino UNO的5V引脚是最稳的组合基本不用额外处理。还有一点要提醒STATE脚输出的是3.3V电平如果你想让这个信号去驱动5V继电器或者LED指示灯最好加一级三极管或者用光耦隔离直接接可能会拉低电平导致指示灯不亮或者继电器不动作。2.3 上电顺序进AT模式其实有讲究很多人拿到模块第一件事就是插上USB转TTL打开串口助手发送“AT”结果模块没有任何回应。最大的可能性就是你没有让模块进入AT模式。正确操作是这样的先用杜邦线把USB转TTL的TXD接模块RXDUSB转TTL的RXD接模块TXDGND接GND。按住模块底板上的那个小按键不松手。保持按键按下的状态下给模块通电USB转TTL的3.3V或5V都行。通电后等一秒左右再松开按键此时模块上的红色LED应该是慢闪大概一秒一次这说明已经进入AT命令模式了。正常通电模式下LED亮灭节奏是快速闪烁大概一秒钟好几次这是在广播等待配对AT模式下LED则是慢闪两者节奏区别很明显你用眼睛就能判断模块现在处于什么状态。2.4 关于供电的额外提醒模块的VCC虽然标称能到6V但我不建议你直接拿6V以上的电源去怼它尤其是老版本的底板稳压电路余量比较小长期高压运行容易发烫。给模块供电最好是稳定5V并且和单片机共地。如果使用移动电源供电尽量选那种5V输出纹波小的不然可能出现蓝牙连接后频繁掉线的现象——这个我后面在排查章节还会详细展开。3. AT命令配置让模块按你的规矩工作3.1 进入AT模式后的初始设置HC-05出厂默认的串口参数是波特率9600、数据位8、停止位1、无校验、无流控。连接好USB转TTL并成功进入AT模式后打开任意一款串口调试助手在发送框输入一个测试命令AT如果一切正常模块会回你一个“OK\r\n”。看到这个OK说明模块和电脑之间已经建立了一条畅通的串口链路接下来就可以改各种参数了。这里有个非常容易踩的坑模块的品牌不同AT命令的波特率可能不一样。我买过七八块HC-05大多默认9600但也碰到过出厂被改成38400的二手模块。所以如果发送AT没反应别着急怀疑模块坏了把串口调试助手的波特率挨个试一遍9600、19200、38400、115200总有一个能通。3.2 常用AT命令速查表我整理一份自己经常用的命令清单贴在这里方便你直接复制。命令功能示例返回AT测试通信OKATNAMExxx修改蓝牙名称OKATPSWD1234修改配对密码OKATUART115200,0,0设置波特率、停止位、校验位OKATROLE0设为从机模式OKATROLE1设为主机模式OKATCMODE1任意地址连接模式OKATCMODE0固定地址连接模式OKATBINDxxxx绑定指定蓝牙地址OKATADDR?查询本机蓝牙地址ADDR:xxxx:xx:xxxxxxATSTATE?查询当前连接状态STATE:INITIALIZEDATVERSION?查询固件版本VERSION:3.0-20170609ATRESET软复位模块OK注意AT命令统一以ASCII码形式发送结尾不需要加回车换行串口调试助手一般默认发送“AT\r\n”也能识别但部分固件版本对额外的\r会比较敏感所以如果遇到发AT有回显但命令不执行的情况把调试助手的“发送新行”选项取消再试。3.3 改名称、密码和波特率是三个高频操作先说改名称。默认情况下HC-05广播出来的名字是“HC-05”或者“linvor”如果教室里十几个人同时用这种模块配对的时候根本分不清哪块是哪块。用下面这行命令改成自己的标识ATNAMECar-BT返回OK后需要重新上电才会生效。再拿手机搜看到的就是“Car-BT”了。改密码比较简单默认配对码是1234想要提高安全性可以执行ATPSWD8888。这个密码只在对方主动发起配对的时候使用如果你是用手机蓝牙去连接模块手机会弹窗让你输入PIN码填你设置的这个就行。改波特率是项目里最刚需的一个操作。默认9600虽然通用但通信数据量大或者要跟某些固定波特率的设备对接时就要改。比如想改成115200ATUART115200,0,0注意改完波特率之后模块不会自动切换你需要先把串口调试助手的波特率改成115200再按一下模块上的复位按键或者重新上电然后再次发送AT验证这样才能确认修改成功。如果先把调试助手改成115200、又没有复位模块发AT自然没反应很多人就在这里卡住。3.4 主从模式主机还是从机决定通信架构HC-05比HC-06强的一个重要能力就是它既可以做从机也可以做主机。从机就是“被连接的设备”手机搜它、连它这就是默认状态适合大多数串口透传应用。主机则是“主动去连别人的设备”比如你想让两块HC-05模块自动配对一块主一块从那就需要把其中一块设为主机。设置主机ATROLE1设置从机只需要把1改成0就行。除了ROLE还有一个CMODE参数值得关注。CMODE1表示模块可以连接任意地址的蓝牙设备CMODE0表示模块只连接BIND里指定的那个地址。主机模式下我建议你把CMODE设置为0并通过ATBIND地址绑定固定的目标设备避免它在大街上乱连别人的蓝牙。主机连接从机之后可以再执行ATSTATE?确认链路状态返回“STATE:CONNECTED”说明已经接通了。两块HC-05透传的链路建好之后你在任何一块模块的串口端发数据另一块的串口端就能收到复杂度基本为零。3.5 AT命令配置失败的几个坑我总结一下常见的AT配置失败场景帮你快速定位问题发送AT后没有任何回显大概率没进AT模式按住按键重新上电如果一直按住按键还是不行检查USB转TTL的TXD/RXD是否接反以及是否共地。发送AT返回乱码波特率不匹配把波特率换几个档位试试。命令执行成功但重新上电又恢复默认模块可能是HC-06冒充HC-05或者底板按钮损坏导致一直输出高电平。真正的HC-05主从模式配置是可以掉电保存的。用手机连不上检查模块是否还停留在AT模式AT模式下模块不会广播配对请求需要重新上电进入正常模式。4. 与Arduino联调实战从“透传”到“远程控制”4.1 接线方案HC-05在Arduino项目里最常见的连接方式是使用软串口SoftwareSerial因为很多板子的硬串口Serial被USB调试占用如果直接接硬串口调试信息就没了。硬件串口留给电脑做日志软串口给蓝牙模块用这是最舒服的组合。我的接线如下HC-05的VCC → Arduino UNO的5VHC-05的GND → Arduino UNO的GNDHC-05的RXD → Arduino UNO的数字脚10软串口TXHC-05的TXD → Arduino UNO的数字脚11软串口RXHC-05的STATE → 不接或者接一个LED指示灯注意软串口官方库对接收有要求在高波特率下同时收发时可能丢数据。所以如果项目里数据量大建议把HC-05的波特率调高到115200并且关闭串口监视器的自动滚动减小干扰。4.2 软串口双向透传代码直接贴一段我常用的双向透传代码。这段代码的功能是Arduino的硬串口和软串口互相转发从而实现电脑串口监视器与手机蓝牙APP之间的双向通信。#include SoftwareSerial.h SoftwareSerial BTSerial(10, 11); // RX, TX void setup() { Serial.begin(9600); // 与电脑串口监视器通信 BTSerial.begin(9600); // 与HC-05通信实际波特率要与模块一致 Serial.println(BT Test Start); } void loop() { // 电脑 - 蓝牙 - 手机 if (Serial.available()) { BTSerial.write(Serial.read()); } // 手机 - 蓝牙 - 电脑 if (BTSerial.available()) { Serial.write(BTSerial.read()); } }这段代码虽然简单但它是后面所有蓝牙项目的底座。你想控制的电机、舵机、传感器只需要在收到特定字符时执行对应动作就行。4.3 简单的LED远程控制示例有了透传远程控制的思路就顺了。下面这个例子在透传基础上增加了指令解析收到字符‘1’点亮LED收到字符‘0’熄灭LED#include SoftwareSerial.h SoftwareSerial BTSerial(10, 11); const int ledPin 13; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); BTSerial.begin(9600); digitalWrite(ledPin, LOW); } void loop() { if (BTSerial.available()) { char cmd BTSerial.read(); if (cmd 1) { digitalWrite(ledPin, HIGH); BTSerial.println(LED ON); } else if (cmd 0) { digitalWrite(ledPin, LOW); BTSerial.println(LED OFF); } else { BTSerial.print(Unknown cmd:); BTSerial.println(cmd); } } }手机端只需要装一个蓝牙串口APP搜索“蓝牙串口”“Serial Bluetooth Terminal”都能找到连接配对之后发送“1”和“0”就能看到Arduino板载LED亮灭同时APP里还会收到模块回传的“LED ON”“LED OFF”。这一套跑通了你就已经掌握蓝牙远程控制的最核心路径了。4.4 手机连接HC-05的注意事项手机连接HC-05时第一次配对需要输入PIN码默认是1234。如果你改了密码就输新的。配对成功后在蓝牙设置里看到的设备是“已配对”状态但有些安卓手机还会要求你“连接”一次iOS则一般会自动建立SPP连接。安卓的App里有时会出现“连接失败”或“套接字已关闭”解决办法是先在系统蓝牙设置里把设备配对好再去APP里连顺序反了很容易失败。如果你是用iPhone配HC-05因为iOS对SPP的支持很封闭系统自带的蓝牙设置不会显示串口服务必须靠第三方APP的BLE或者MFi方案。所以做HC-05的手机控制Demo我一般优先推荐安卓手机省心得多。5. 高频故障排查HC-05连不上的七个真实原因5.1 现象、根因、解法对照表我串了几年HC-05把经常遇到的故障整理成一张表按“现象→根因→解法”的顺序给你排查的时候对着来就行。现象根因解决办法上电后LED完全不亮供电异常或模块损坏检查VCC/GND用万用表量电压换一块模块交叉验证LED快闪但手机搜不到设备模块还停留在AT模式重新上电进入正常模式确认LED是快闪而非慢闪手机能搜到但配对失败PIN码输错或模块被别人占用确认密码模块空闲状态再配对配对成功但App发送无反应串口波特率不一致核对Arduino代码、模块AT配置、App波特率三者要一致能发不能收或能收不能发TXD/RXD接线错误按交叉接线原则重接交换RX/TX再试通信距离只有两三米天线被遮挡或板载天线损坏模块天线侧朝外不要贴在金属表面上频繁掉线供电电压不稳或模块过热换线性稳压电源降低输入电压检查共地5.2 排查顺序建议碰到问题我建议按下面这个顺序排查别一上来就怀疑模块坏了大部分情况其实是外部因素先看电源用万用表量一下模块VCC对GND的电压必须是稳定的4.8V到5.2V之间。我用劣质USB线供过电电压被拉到4.5V以下模块直接罢工。再看指示灯状态不亮→供电/硬件问题慢闪→AT模式快闪→正常待连接常亮→已连接。这一步能帮你把问题缩小到一半。然后查串口链路发送AT或者普通数据观察能不能收到回显。收不到就换波特率、换USB转TTL模块、换杜邦线。再验证手机端关闭蓝牙再打开重新扫描最好用另一部手机交叉测试。最后才考虑模块本身换一块已知正常的HC-05对比测试。5.3 我踩过的几个典型坑有些问题在文档里根本不会写只能靠实际踩坑才能总结出来。第一个是杜邦线接触不良。HC-05的排针比较细如果用质量差的杜邦线插上去看着紧了实际内部夹片没有完全咬合动一下板子就断连。我的习惯是接好线以后用热熔胶在排针根部点一下把线固定住一劳永逸。第二个是蓝牙地址问题。做主机模式的时候如果ATBIND绑定的地址不对或者把冒号混淆成其他格式主机会一直搜不到从机。正确的地址格式是从ATADDR?返回的格式注意有的返回是“ADDR:1234:56:789ABC”绑定的时候直接复制这个字符串不要手打手打很容易出错。第三个是USB转TTL芯片挑线。市面上便宜的CH340模块在9600波特率下问题不大但上了115200之后有些CH340的驱动不稳定会出现发一个字节丢半个字节的问题。我后来改用CP2102的USB转TTLAT配置的时候就再没出过乱码。第四个是高波特率下的软串口不稳定。Arduino的SoftwareSerial在57600以上就不太靠谱了如果你把HC-05改成115200建议用硬串口接模块或者换支持更高软串口速率的库比如AltSoftSerial或者NeoSWSerial。我在STM32上做115200透传就非常稳Arduino上还是老老实实停留在9600或者19200比较安心。5.4 一个真实的“连接不上”排查案例最后分享一个我印象很深的案例。有个朋友做毕设用HC-05无线控制机械臂反馈说“模块配对成功但手机App发送数据机械臂纹丝不动”。我远程帮他排查了一个多小时最后发现原因有三个叠加一是他用的是HC-05的AT模式状态下的配置波特率被改成了38400但Arduino代码里写的是9600导致串口根本对不上二是他的Arduino板载串口被占用了但代码里用了Serial插着USB调试线的时候Serial被电脑占用拔掉USB后Serial向USB芯片输出但没有设备接收程序逻辑被卡死三是机械臂舵机电源和蓝牙模块共用同一个5V电源舵机一动作就把电压拉低蓝牙模块直接复位。后来我把他的电路改成分开供电Arduino代码里把蓝牙改到软串口波特率统一改成9600重新上电问题就消失了。这个案例说明HC-05相关的很多问题表面上看起来是蓝牙模块的锅实际上往往是供电、串口配置、代码逻辑几个因素叠加造成的。排查的时候一定不要只盯着模块本身要把整条数据链路——从手机App到蓝牙模块从模块到单片机从单片机到执行器——逐段拆开验证。6. 写在最后一次成功的蓝牙调试体验HC-05这块模块的调试过程很多时候卡住的点并不是原理不熟悉而是操作细节不到位。有一次做两块HC-05主从配对我按照教程设了主机、从机、绑定了地址但就是连不上。后来才发现主机模块在CMODE0的情况下如果从机没有提前上电广播主机就会一直空转搜索连不上也不报错。后来我改成先给从机上电等它进入可连接状态再给主机上电一秒就配对成功了。所以在实际项目里我养成了一个习惯所有模块先单独验证OK再组合联调所有串口参数先做成宏定义方便统一修改所有电源先单独确认再接入整机。这套习惯帮我省下的调试时间远比写代码的时间多。最后再分享一个小技巧如果你想把HC-05模块用在更复杂的场景里比如同时控制多个传感器或者执行器建议把通信协议设计成“帧头数据校验”的结构而不是像示例里那种单个字符命令。比如可以定义“AA 01 02 BB”这样的帧AA是帧头01是设备号02是指令BB是校验。这样既能扩展多个设备也能避免数据错位导致误操作。蓝牙串口是个很开放的信道不加协议的话偶尔一个乱码字节就可能让执行器抽风加个简单的帧结构可靠性会提高一个档次。本文还有配套的精品资源点击获取