STM32-笔记29-蓝牙模块实战:从零搭建无线通信系统

张开发
2026/4/17 3:21:05 15 分钟阅读

分享文章

STM32-笔记29-蓝牙模块实战:从零搭建无线通信系统
1. 蓝牙模块选型与硬件连接第一次接触蓝牙模块时我被市面上五花八门的型号搞晕了头。HC-05、HC-06、HC-08这些编号看起来差不多实际功能差异可不小。以这次要用的HC-08为例它最大的优势是支持主从模式切换而像HC-02这类模块只能固定作为从机使用。这意味着HC-08既能主动搜索连接其他设备主机模式也能被动等待被连接从机模式灵活性直接翻倍。模块引脚排布看似简单但新手最容易栽在电源问题上。我遇到过至少三个学生把5V直接怼到模块VCC引脚上结果模块当场冒烟。HC-08的供电范围虽然是3.2-6V但要注意模块版本差异——邮票孔封装的版本必须接3.3V而带底板的版本可以通过板载LDO兼容5V输入。最稳妥的做法是先用万用表确认模块工作电压或者直接查阅卖家提供的规格书。实际接线时记住这个口诀T对RR对TGND对GND。蓝牙模块的TXD要接STM32的RX引脚如USART2_RX/PA3RXD接STM32的TX引脚USART2_TX/PA2。STATE引脚可以接个LED指示灯蓝牙未连接时LED熄灭连接成功自动点亮这种视觉反馈对调试特别有用。曾经有个项目因为没加状态指示调试时死活找不到连接失败的原因后来才发现是手机蓝牙列表里还存着旧配对记录。2. AT指令配置实战技巧拿到蓝牙模块第一步不是急着写代码而是用串口助手进行基础配置。打开PC端串口调试工具推荐使用XCOM或SSCOM设置波特率默认一般是9600注意要勾选发送新行选项因为AT指令必须以\r\n结尾。有次我调试半小时没反应最后发现是漏了换行符这种低级错误新手特别容易犯。常用AT指令组合建议保存成文本模板ATNAMEMyDevice\r\n //修改设备名称 ATROLE1\r\n //设置为主机模式 ATPSWD1234\r\n //设置配对密码 ATUART115200,0,0\r\n //修改波特率执行每条指令后模块会回复OK或ERROR。有个坑要注意修改波特率后必须断电重启才能生效我有次改了波特率但没重启后续所有指令都收不到回复还以为模块坏了。进阶技巧是使用ATINQ指令扫描周边设备。当模块设为主机模式时这个指令会返回附近蓝牙设备的MAC地址和信号强度格式类似于98:D3:31:FB:12:45,-75。在代码里可以解析这些数据实现自动配对功能。记得扫描前先执行ATINIT初始化SPP协议栈否则会返回ERROR。3. STM32串口驱动开发硬件串口配置建议使用CubeMX生成初始化代码。在Connectivity选项卡下启用USART2模式选择Asynchronous参数与蓝牙模块保持一致如115200波特率、8数据位、无校验。有个细节容易忽略需要开启串口全局中断NVIC Settings里勾选USART2中断否则无法接收数据。调试时遇到过最诡异的问题是数据接收不全。后来发现是HAL库的接收缓冲区太小在bluetooth.h里把UART2_RX_BUF_SIZE从128改成256才解决。接收中断服务函数要处理两个关键标志位void USART2_IRQHandler(void) { if(__HAL_UART_GET_FLAG(huart2, UART_FLAG_RXNE)) { // 单字节接收处理 HAL_UART_Receive_IT(huart2, rx_data, 1); uart2_rx_buf[uart2_rx_len] rx_data; } if(__HAL_UART_GET_FLAG(huart2, UART_FLAG_IDLE)) { // 空闲中断处理 __HAL_UART_CLEAR_IDLEFLAG(huart2); printf(Received: %s\r\n, uart2_rx_buf); uart2_rx_clear(); } }特别注意空闲中断检测逻辑这是实现不定长数据接收的关键。我见过有人用定时器判断接收超时其实完全没必要STM32硬件自带空闲检测功能更可靠。数据发送函数建议采用可变参数设计void bt_send(char *format, ...) { uint8_t send_buf[128]; va_list args; va_start(args, format); vsprintf((char*)send_buf, format, args); HAL_UART_Transmit(huart2, send_buf, strlen((char*)send_buf), 100); va_end(args); }这样就能像printf一样方便地发送格式化数据比如bt_send(Temperature:%.1f℃, temp_value)。4. 典型应用场景测试无线控制LED是最基础的验证实验。在手机端安装蓝牙调试助手推荐BLE调试器或Serial Bluetooth Terminal发送字符指令如A开灯、B关灯。STM32端代码这样处理if(uart2_rx_buf[0] A) { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); bt_send(LED ON\r\n); }进阶版可以做个无线温湿度监测系统。用DHT11传感器采集数据通过蓝牙发送到手机端显示。这里有个数据传输格式的讲究建议采用JSON格式如{temp:25.6,hum:60}手机端用现成的串口工具就能直接解析显示曲线图。最让我头疼的是传输距离测试。在无遮挡环境下HC-08标称10米但实际在办公室环境有WiFi干扰超过5米就开始丢包。解决方法有三个降低波特率到9600、在模块天线周围铺地、或者换用Class1功率的蓝牙模块。如果项目对距离要求高建议直接上蓝牙5.0模块如JDY-31实测穿墙能力提升明显。稳定性测试时发现个有趣现象连续发送大数据量如每秒1KB超过5分钟后模块会发热导致通信失败。后来在代码里加入500ms的发送间隔并在数据包中加入序号校验丢包率从15%降到0.3%。这也提醒我们无线通信一定要设计简单的重传机制比如每发送10个数据包就等待接收方回复ACK。

更多文章