别再只会用串口了!STM32通过AT指令玩转ESP32-C3蓝牙(含手机APP通信实战)

张开发
2026/4/17 15:08:53 15 分钟阅读

分享文章

别再只会用串口了!STM32通过AT指令玩转ESP32-C3蓝牙(含手机APP通信实战)
STM32与ESP32-C3蓝牙通信实战AT指令高效开发指南在物联网设备开发中蓝牙通信已成为短距离无线传输的标配功能。但对于已经熟悉STM32开发的工程师来说从头学习蓝牙协议栈开发不仅耗时费力还可能影响项目进度。本文将介绍一种更高效的解决方案——通过AT指令让STM32控制ESP32-C3的蓝牙模块快速实现设备间的无线通信。1. 为什么选择AT指令控制蓝牙模块传统蓝牙开发通常需要开发者深入理解复杂的蓝牙协议栈这对于资源有限的嵌入式系统开发来说是个不小的挑战。而AT指令模式提供了一种更轻量级的解决方案降低学习成本无需深入研究蓝牙协议栈细节快速原型开发缩短从概念验证到产品实现的周期资源占用少特别适合内存有限的STM32系列MCU灵活性高可随时更换蓝牙模块而不影响主控代码ESP32-C3作为一款集成了Wi-Fi和蓝牙功能的芯片提供了完善的AT指令集支持。通过UART接口STM32可以方便地发送AT指令来控制ESP32-C3的蓝牙功能实现包括广播、扫描、连接和数据传输等完整通信流程。2. 硬件连接与环境搭建2.1 硬件连接方案要实现STM32与ESP32-C3的通信首先需要正确连接硬件。推荐以下连接方式STM32引脚ESP32-C3引脚说明USART_TXUART_RX数据发送USART_RXUART_TX数据接收GNDGND共地3.3VVCC电源供电注意确保两端的逻辑电平匹配ESP32-C3是3.3V器件如果STM32使用5V逻辑需要添加电平转换电路。2.2 开发环境配置在开始编码前需要准备以下开发环境STM32开发环境STM32CubeIDE或Keil MDKSTM32 HAL库或LL库串口调试工具ESP32-C3固件准备下载支持AT指令的固件使用esptool.py烧录固件# ESP32-C3固件烧录示例命令 esptool.py --chip esp32c3 --port /dev/ttyUSB0 --baud 921600 write_flash 0x0 firmware.bin测试AT指令 通过串口工具直接向ESP32-C3发送AT指令验证基本功能是否正常AT ATBLEINIT?3. AT指令框架设计与实现3.1 基础通信函数封装为了简化AT指令的发送和接收过程我们可以封装一组基础函数#define ESP32_UART huart2 // 根据实际使用的UART修改 #define AT_TIMEOUT 2000 // 响应超时时间(ms) // 发送AT指令 void ESP32_SendAT(const char* cmd) { HAL_UART_Transmit(ESP32_UART, (uint8_t*)cmd, strlen(cmd), AT_TIMEOUT); } // 带响应的AT指令发送 bool ESP32_SendATWithResponse(const char* cmd, const char* expected, uint32_t timeout) { char response[256] {0}; ESP32_SendAT(cmd); HAL_UART_Receive(ESP32_UART, (uint8_t*)response, sizeof(response)-1, timeout); return (strstr(response, expected) ! NULL); }3.2 蓝牙功能初始化流程完整的蓝牙初始化包含多个步骤每个步骤都需要特定的AT指令重置模块ATRST设置蓝牙模式服务器模式ATBLEINIT2客户端模式ATBLEINIT1创建GATT服务ATBLEGATTSSRVCRE设置广播参数ATBLEADVPARAM50,50,0,0,7,0,,设置广播数据ATBLEADVDATAEXMyDevice,1234,0102030405,1启动广播ATBLEADVSTART将这些步骤封装成一个初始化函数bool BLE_Server_Init() { if(!ESP32_SendATWithResponse(ATRST\r\n, ready, 3000)) return false; if(!ESP32_SendATWithResponse(ATBLEINIT2\r\n, OK, 1000)) return false; if(!ESP32_SendATWithResponse(ATBLEGATTSSRVCRE\r\n, OK, 1000)) return false; if(!ESP32_SendATWithResponse(ATBLEADVPARAM50,50,0,0,7,0,,\r\n, OK, 1000)) return false; if(!ESP32_SendATWithResponse(ATBLEADVDATAEX\MyDevice\,\1234\,\0102030405\,1\r\n, OK, 1000)) return false; return ESP32_SendATWithResponse(ATBLEADVSTART\r\n, OK, 1000); }4. 蓝牙通信实战从手机到STM32的数据链路4.1 手机端连接准备在手机端我们可以使用现成的蓝牙调试工具或开发自定义APP推荐APPnRF ConnectLightBlue蓝牙调试助手连接流程手机扫描并找到我们的设备MyDevice建立连接发现服务与特征值开启通知或准备写入数据4.2 数据透传模式设置ESP32-C3支持SPP-like的透传模式简化数据交换过程void Enable_BLE_TransparentMode() { // 设置透传参数 ESP32_SendAT(ATBLESPPCFG1,1,7,1,5\r\n); // 当检测到连接时开启透传 if(CheckConnection()) { ESP32_SendAT(ATBLESPP\r\n); } }4.3 数据收发处理在透传模式下数据可以直接通过UART收发但需要处理连接状态变化void BLE_Data_Handler(uint8_t *buffer, uint16_t *length) { *length 0; if(UART_Receive(buffer, length)) { if(strstr((char*)buffer, BLECONN:)) { // 新连接建立 ESP32_SendAT(ATBLESPP\r\n); } else if(strstr((char*)buffer, BLEDISCONN:)) { // 连接断开 ESP32_SendAT(); HAL_Delay(1500); ESP32_SendAT(ATBLEADVSTART\r\n); } else { // 实际数据到达 Process_Application_Data(buffer, *length); } } }5. 高级功能与性能优化5.1 多连接管理ESP32-C3支持多个蓝牙连接可以通过以下方式管理设置最大连接数ATBLECONNMAX3区分不同连接 每个连接会分配一个索引号(0,1,2...)发送数据时需要指定ATBLESPP0, Hello5.2 低功耗优化虽然ESP32-C3本身功耗较低但通过AT指令仍可进一步优化调整广播间隔ATBLEADVPARAM1600,1600,0,0,7,0,,进入睡眠模式ATSLEEP15.3 安全增强增加配对和加密功能设置配对模式ATBLEAUTH1配置IO能力ATBLEIOCAP1设置加密参数ATBLEENCRYPT1,166. 常见问题与调试技巧6.1 AT指令无响应可能原因及解决方案检查硬件连接确认TX/RX交叉连接共地良好验证波特率ESP32-C3默认波特率通常是115200供电不足确保提供足够的电流至少500mA6.2 连接不稳定优化建议调整连接参数ATBLECONNPARAM0,6,12,1000,0减少干扰避开2.4GHz频段的其他设备增加天线或改善PCB布局6.3 数据丢失或错误处理方法添加数据校验如CRC或校验和实现重传机制在应用层实现简单的ACK/NACK协议调整MTU大小ATBLEMTU256在实际项目中我发现最有效的调试方法是使用逻辑分析仪同时捕获STM32和ESP32-C3之间的UART通信这样可以清晰看到AT指令的发送和响应过程。另外保持AT指令处理状态机的简洁性非常重要过于复杂的状态机容易导致难以追踪的问题。

更多文章