蓝牙串口模块通讯实战:从选型到STM32透传排错
2026/9/16 22:51:38 网站建设 项目流程

简介:这是一份围绕蓝牙模块与串口通信结合的Android源码工程,面向嵌入式开发者、物联网爱好者及需要快速实现无线透传的工程师。工程包含完整的项目代码与可运行APK,可帮助读者理解蓝牙经典模式与BLE低功耗模式的选择、UART透传配置、设备发现与配对、连接管理、错误恢复及低功耗处理等关键环节。压缩包共879个文件,约5.36MB,以png图片、xml布局与配置、class编译文件、jar库、java源码、aidl接口、gradle构建脚本及APK安装包为主,涵盖从源码到构建产物再到演示应用的完整链路。已有271人学习下载。通过阅读源码和对照示例,可掌握串口与蓝牙桥接的数据封装、解封装流程,并参考其电源管理和异常中断处理机制,便于快速移植到自己的智能硬件或IoT项目中。

1. 蓝牙串口模块通讯:把有线串口变成无线,先搞懂它在数据链路里的位置

调试一块 STM32 板子,需要把传感器数据实时传回电脑,但现场没法拖一根 USB 线;或者两台设备之间要隔几十米无线同步数据,这时候最常见的做法就是加一个蓝牙串口模块。这类模块在嵌入式圈子里叫 SPP 蓝牙模块,也有人叫蓝牙转串口透传模块。它做的事情很直接:一端是 UART 接 MCU,另一端是蓝牙射频,数据从串口进,经过模块内部的蓝牙协议栈发出;对端设备装好蓝牙驱动后,会把连接识别成一个虚拟 COM 口。也就是说,你原来写的串口收发程序几乎不用改,把有线连接换成两个蓝牙透传模块,就能按串口语义做无线通讯。这种方案不挑 MCU,只要串口数量够、电平匹配、波特率两边一致就能跑,所以到今天仍然是低成本无线通讯里最省事的路子。这篇文章按硬件选型、AT 配置、MCU 透传代码、排错调试这条线走,把蓝牙串口模块通讯里真正会踩的坑逐个说清楚。

2. 从选型到接线:SPP 蓝牙模块的参数差异和最小电路

2.1 HC-05、HC-06、JDY-31:三款主流模块差异点

市面上常见的串口蓝牙模块以 CSR 芯片方案居多,典型型号是 HC-05、HC-06,以及完全兼容 HC-05/06 从机指令的 JDY-31。它们都不是传统意义上的低频 2.4G 透传,而是支持 SPP 协议的经典蓝牙模块,工作频段同为 2.4GHz,通信距离在空旷环境下大约 10 米。选型时要抓三个点:是否支持主从一体、AT 指令怎么进入、以及波特率范围。HC-05 主从一体,需要引脚拉高才能进 AT 模式;HC-06 只能做从机,上电就是 AT 指令模式,直接发指令即可;JDY-31 的底板设计类似 HC-06,但从机指令完全兼容 HC-05/06,而且蓝牙 3.0 版本在连接稳定性上更好一些。我做项目通常优先考虑 JDY-31,因为它的底板跳线和指示灯更直观,调硬件时能少花点时间。

参数HC-05HC-06JDY-31
主从模式主从一体,AT 可切换仅从机从机,兼容 HC-05/06 指令
蓝牙版本2.02.03.0
进入 AT 模式EN 脚拉高再上电上电即 AT底板 AT 开关或兼容指令
默认波特率960096009600
工作电压3.6-6V3.6-6V3.6-6V

对于需要两块板子自动配对再通讯的场景,主从一体是硬需求,HC-05 或 JDY-31 都能满足;如果只做从机、由手机或电脑主动连,HC-06 就够用。这里要提醒一句,所谓“完全兼容”指的是 AT 指令层面兼容,硬件引脚定义和底板的外围电路不一定一致,买模块时要看对应型号的手册,别用同一个接线图硬套。

2.2 串口电平匹配:TTL 和 RS232/RS485 不能混接

很多从工控设备上拆出来的串口是 RS232 电平,负逻辑、±12V 摆幅;而蓝牙模块的 UART 引脚是 3.3V TTL 正逻辑。直接把 RS232 设备引出线接到模块上,轻则电平识别不了产生乱码,重则烧坏模块。正确的做法是在中间加一颗 MAX3232 做电平转换;如果工业现场走的是 RS485,还得再挂一个 485 收发器,因为 485 是差分信号,和 TTL 完全不兼容。

对于板载串口是 5V TTL 的 MCU,比如老款 AVR 或某些 5V 单片机,模块能承受的 TXD 输入范围往往不够。按常见做法,我会在 MCU 的 TXD 和模块 RXD 之间串联一个 1kΩ 电阻,利用模块内部钳位二极管限制电压;更可靠的是用双向电平转换芯片或者分压电路。很多人一上来就跳过这个细节,结果模块偶尔能收到数据但乱码率很高,用示波器一看波形高电平被拉到 5V,模块内部却按 3.3V 判断。

2.3 用 USB 转 TTL 模块在电脑上先点亮一个蓝牙模块

配置 AT 指令之前,最稳妥的做法是先把模块接到电脑上,用串口调试助手确认能收发数据。你需要一个 USB 转 TTL 模块,常见方案是 CH340 或 FTDI,驱动名分别是 CH340、FTDI VCP。接线顺序是:

  1. 将 USB 转 TTL 的 TXD 接模块 RXD,RXD 接模块 TXD,GND 必须共地。
  2. VCC 根据模块规格接 5V 或 3.3V,HC-05 等模块通常可接受 5V,但推荐 3.3V,避免板载稳压器发热。
  3. 插上 USB 转 TTL,在设备管理器里看到新增 COM 口,比如 COM3。
  4. 打开串口调试助手,选择 COM3,波特率设为 9600,数据位 8,停止位 1,无校验、无流控。
  5. 先让模块处于 AT 模式,发送AT,如果返回OK,说明模块和电脑之间链路通了。

这段过程里最容易出问题的地方是驱动。设备管理器出现黄色感叹号或者显示“barrot bluetooth adapter 驱动”之类不相关设备时,先卸载重装 CH340 驱动,再把 USB 线插到电脑直出的 USB 口,不要插在扩展 HUB 上。另外注意,有些 USB 转 TTL 的板载输出能力有限,蓝牙模块搜索配对瞬间电流可能冲到几十毫安,如果电压跌落会导致模块反复重启,这时换一个带稳压电路的 USB 转 TTL 板,或者单独用 LDO 给模块供电。

2.4 底板跳线和状态指示:JDY-31 的 AT 进入方式与指示灯含义

JDY-31 底板一般带一个拨码开关,一边是 AT 模式,另一边是通讯模式,拨到 AT 再接电脑直接发 AT 指令。有些兼容板没有拨码,直接把 KEY 或者 EN 引脚拉高再上电。HC-05 则要求第 34 脚接高电平再上电,时序错一点就进不了 AT 模式。状态指示灯的闪烁频率是关键信号:慢闪表示等待连接,快闪表示进入 AT 模式,配对成功后常亮或双灯同时亮。不同批次板子闪烁定义略有差别,但这是判断模块是否在工作状态的第一个线索。如果发现上电后灯不亮,优先查 VCC 和 GND,不要急着怀疑模块坏了。

3. 用 AT 指令配置蓝牙模块:主从模式、配对码、波特率一次调对

3.1 进入 AT 指令状态:HC-05 与 JDY-31 的控制脚时序

配置蓝牙模块的第一步是让它进入 AT 指令状态。HC-05 必须拉高 EN 之后再给 VCC 上电,顺序反了模块只会默认进入透传状态,发AT会原样返回给你。JDY-31 底板通常有 AT 开关,拨到 ON 再上电即可。HC-06 最简单,上电后任何时刻发 AT 指令都会响应。很多开发者卡在“hc05 蓝牙模块连接不上”,除了这类时序问题,还有两种情况:一是模块还保留着上一次的配对信息,需要执行AT+ORGL恢复出厂设置;二是使用的串口调试助手勾选了“发送新行”之外的其他选项,导致没有发送回车符,模块不认为这是一条完整指令。

我一般建议配置前先发一个不带任何参数的AT,看返回是不是OK。如果返回是一串乱码,说明波特率不对;如果返回包含ERROR,则要检查指令末尾的换行符格式。模块 AT 指令对回车符的敏感度不太一样,HC-05 系列支持AT\r\n,部分新固件只认AT\r,配置前先试两种。

3.2 常用 AT 指令表:名称、密码、波特率、角色

以 HC-05 和兼容指令的 JDY-31 为参考,常用 AT 指令如下:

指令作用示例说明
AT测试通信返回 OK判断是否进入 AT 模式
AT+NAME设置蓝牙名称AT+NAME=myuart对端扫描时看到的设备名
AT+PSWD设置配对码AT+PSWD=1234默认是 1234,长度 4 位
AT+UART设置串口参数AT+UART=115200,0,0波特率、停止位、校验位
AT+ROLE设置主从角色AT+ROLE=0 从机 / 1 主机仅主从一体模块支持
AT+BIND绑定对端地址见 3.3用于固定配对
AT+CMODE连接模式AT+CMODE=00 表示仅绑定地址连接
AT+ORGL恢复出厂设置无参数清除所有自定义配置
AT+RESET软复位无参数配置后执行,让参数生效

参数说明:AT+UART的三个数字依次是波特率、停止位位数、校验位类型。停止位 0 表示 1 位,1 表示 2 位;校验位 0 表示无校验。这里的设置决定模块透传时使用什么串口参数,而 AT 指令本身的响应速度由模块固件默认波特率决定。多数模块上电后 AT 模式固定使用 9600 响应,但也有例外。如果你在 9600 下发送指令不响应,可以尝试 38400,这个值在部分 HC-05 固件里是 AT 模式专用波特率。改完AT+UART后必须复位,之后主机和从机都要用新波特率重新连接。

3.3 配置一对主从模块实现开机自动配对

点对点透传是最常见的场景。我配置两个模块时会这样操作:

  1. 先把两个模块都设为从机AT+ROLE=0,波特率都改成同一个值,比如 115200。
  2. 给其中一个从机发AT+ADDR,读出它的蓝牙地址,例如12:34:56:ab:cd:ef
  3. 把另一个模块设为主机AT+ROLE=1,然后发送AT+BIND=1234,56,abcdef,地址中的冒号换成逗号。
  4. 主机再执行AT+CMODE=0,让主机只去连接绑定的地址。
  5. 两个模块都发AT+RESET,断电重新上电。

这套配置完成之后,主机上电就会主动搜索绑定地址,从机的状态灯会从慢闪变成常亮,两边串口数据相当于一条虚拟串口线。这里最容易出错的是AT+BIND的地址格式。有些固件要求AT+BIND=1234,56,abcdef,有些则接受不带逗号的AT+BIND=123456abcdef。我遇到这个问题时,会先发AT+ADDR看返回值格式,返回值里用什么分隔符,AT+BIND就用什么分隔符。

如果还想让主机自动扫描任意从机,而不是绑定固定地址,可以把AT+CMODE设为 1,但这样会带来配对安全问题,也可能误连附近其他蓝牙模块。产品化设计建议始终绑定地址。

3.4 配置失败后的恢复策略

最让人头痛的是配置到一半模块不响应了。这时先给模块断电,按住底板上的按键再上电,通常可以让模块回到默认的 AT 模式。如果无效,发AT+ORGL恢复出厂设置,再按流程重新配置。HC-05 还有一个小细节:如果上电时 EN 脚浮空,模块可能进入透传模式而忽略 AT。检验是否进入 AT 模式的方法,是发送AT+VERSION看能不能读到固件版本。读到版本说明模块活着,问题只是在配置流程;读不到才需要考虑硬件连线。

4. 用 STM32 和串口蓝牙透传:最小收发代码与数据流边界

4.1 SPP 透传的链路结构:MCU 只看到一根虚拟串口线

蓝牙串口模块对 MCU 来说就是一根 UART 外设。SPP 协议栈、射频链路、基带调度都由模块内部完成,我们真正要负责的是三件事:串口初始化参数与模块一致、用中断或 DMA 收发数据、处理缓冲区和丢包。不要试图在 MCU 侧实现蓝牙协议,那是模块固件的工作。透传链路可以简化为:MCU UART 发送 → 模块 TX 串口接收 → 蓝牙空中包 → 对端模块 → 对端 UART 输出。数据在每一段都是字节流,所以只要两端波特率一致,数据内容不会变。区别在于蓝牙通道有延迟和抖动,当串口速率高过蓝牙吞吐量时,模块内部 FIFO 会溢出,这是丢包的根本原因。

4.2 STM32F103 串口中断收发的最小回环代码

以 STM32F103C8T6 + HAL 库为例,写一个最小无线回环测试:把串口收到的数据原样发回,用来验证蓝牙链路两端通不通。

/* 串口句柄,配置为 115200-8-N-1,无硬件流控 */ UART_HandleTypeDef huart1; uint8_t rx_buf[128]; uint8_t rx_index = 0; volatile uint8_t rx_flag = 0; uint8_t temp_byte; /* 接收回调:每收到一个字节就存进缓冲区 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { rx_buf[rx_index++] = temp_byte; if (rx_index >= 128) { rx_index = 0; rx_flag = 1; // 缓冲区满,主循环统一发送 } // 继续接收下一个字节 HAL_UART_Receive_IT(&huart1, &temp_byte, 1); } } int main(void) { HAL_Init(); SystemClock_Config(); // 一般是 72MHz 配置 MX_GPIO_Init(); MX_USART1_UART_Init(); // 波特率 115200 HAL_UART_Receive_IT(&huart1, &temp_byte, 1); while (1) { if (rx_flag) { // 把缓冲区的数据整包发回蓝牙模块 HAL_UART_Transmit(&huart1, rx_buf, rx_index, 100); rx_index = 0; rx_flag = 0; } } }

代码逻辑说明:这里没有直接回发当前字符,而是等缓冲区攒满后再整包发送,目的是减少高频单字节发送对主循环的挤压。HAL_UART_Receive_IT的第三个参数是每次接收几个字节,这里填 1,表示每接到一个字节就触发一次中断,处理完必须重新调用它,否则中断不会再触发。HAL_UART_Transmit的最后一个参数是超时时间,单位毫秒。115200 波特率下发送 128 字节大约耗时 11ms,100ms 超时余量足够。

参数化说明:如果蓝牙模块配置成 9600,必须把MX_USART1_UART_Init里的波特率同步改成 9600。默认huart1对应 PA9/PA10 引脚,别接到 PA2/PA3,否则数据根本不会到达蓝牙模块。工程里如果同时使用打印串口和蓝牙串口,建议用两个不同的 USART,避免调试日志和业务数据混在一起。

4.3 透传的边界:硬件流控、缓冲区大小和波特率上限

蓝牙 SPP 的实际吞吐量受模块内部蓝牙版本和缓冲区大小限制。经典蓝牙 2.0 版本在 SPP 模式下,实测有效吞吐大约在 100-200KB/s 左右,蓝牙 3.0 的 JDY-31 会略好一些,但仍远达不到串口理论速率。当串口波特率设为 921600 时,数据到模块后依然会按蓝牙实际速率排队发送,模块 FIFO 很快占满,再多出来的数据只能丢。

有硬件流控的模块可以接 RTS/CTS 通知 MCU 暂停发送,但绝大多数 HC-05 兼容模块只引出了 RXD/TXD/GND,没有流控线。实用建议是:波特率控制在 115200 及以下,单包长度不要超过 256 字节,发送端加上帧间隔。如果数据量很大,考虑用 DMA 加环形缓冲区,把串口中断的耗时压到最低,给主循环留出处理时间。

这里还要区分与 RS485 的差异。RS485 是半双工总线,发送前需要拉高方向控制脚;蓝牙串口模块是全双工,直接接 USART 的 TX 和 RX 即可,不需要方向切换。如果产品里同时有蓝牙模块和 RS485,注意电源走线要分开,保持地线单点连接,避免蓝牙射频噪声耦合进 485 差分线导致偶发误码。这是很多现场“485 通讯不稳定”的隐藏原因之一。

5. 连接不上、乱码、自动掉线的排查顺序与验证技巧

5.1 先查 USB 转串口,再查 PC 蓝牙驱动

“电脑连不上蓝牙模块”这句话里其实包含了两种不同的链路,第一段是 USB 转 TTL 和模块之间的串口链路,第二段是 PC 蓝牙射频到模块的空中链路。排查时先发AT,如果串口助手能返回OK,说明串口链路正常,问题在 PC 蓝牙适配器;如果AT无响应,则回头查 CH340 驱动、COM 口号和 TX/RX 接线。

当 PC 蓝牙适配器驱动异常,比如设备管理器里出现“Bluetooth Support Service 不存在”或“蓝牙外围设备找不到驱动程序”时,不影响 USB 转 TTL 的 AT 调试,但会影响最终虚拟串口的建立。处理方式是先卸载异常蓝牙设备,再让系统重新扫描硬件改动;笔记本自带的蓝牙模块常用的是 Realtek 或 Intel 方案,去官网下对应驱动即可。我把这个排查顺序固定下来:

  1. 串口助手发AT是否返回OK:不返回,查 USB 转 TTL 接线、CH340 驱动、COM 口号。
  2. 手机蓝牙能否搜到模块名:搜不到,检查模块是否上电、AT 模式是否卡死、执行AT+RESET
  3. 手机能否配对并出现蓝牙串口服务:部分手机不原生支持 SPP,需要装专用蓝牙串口软件。
  4. PC 蓝牙能否连接并虚拟出 COM 口:没有串口,则检查蓝牙适配器驱动与 SPP 服务。

5.2 用逻辑分析仪或串口数据记录仪定位波特率失配

收发乱码绝大多数是两端波特率不一致。当模块配的是 9600,MCU 初始化却是 115200,每个字节都会错位。最直接的验证是逻辑分析仪接模块 TXD,抓一组数据波形,测量位宽。比如发送 0x55,示波器会出现 01010101 的方波,一个位的时间如果刚好是 104us,说明波特率是 9600。逻辑分析仪软件自带 UART 解码器,在配置里选波特率就能直接解出内容。

没有分析仪时,可以用一个独立的 USB 转 TTL 模块,从 4800 到 921600 逐档扫描,看哪一档能解出可读字符串,这能快速确定模块当前实际波特率。在长时稳定性测试里,我还会用串口数据记录仪把两端收发数据打上时间戳保存下来,对比同一个包在两端的到达时间,能从时间差判断蓝牙链路是否存在明显抖动。

5.3 低电量掉线和自动重连的配置策略

模块掉线重连主要和配对模式及电源稳定性相关。电池供电时,蓝牙模块发射瞬间电流可能冲到几十毫安,如果电源线压降过大,模块电压跌出工作范围会直接断开。解决方法是在模块电源引脚就近加一颗 100uF 电解电容和一颗 0.1uF 陶瓷电容。重连策略上,主机模块在配对失败后一般会持续扫描,只要从机处于可发现状态,会自动回连。如果发现需要手动按键才能重连,可以把AT+CMODE设为 0 并重新绑定对端地址。对低功耗产品,我习惯让模块平时断电,需要通讯时 MCU 通过 MOS 管给模块上电,再用主机模式主动发起连接,握手成功后进入透传状态,这样既能省电,又能避开长期待机后模块内部状态机卡死的隐患。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询