ESP32+Blufi+Tcp+UART

本文讲述了作者如何在ESP32上实现蓝牙配网并通过微信小程序控制,解决了WiFi配置问题,并优化了蓝牙广播以降低能耗。讨论了蓝牙名称匹配和任务调度策略,以及心跳检测和重启机制来确保稳定连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP32+Blufi+TCP+UART

在上上一篇文章的基础上添加了蓝牙配网的功能,第一次连接WiFi时,通过手机微信小程序蓝牙配网,第二次通过记录的WiFi内容就能够直接连接。

参考的文档有:

ESP32 IDF官方参考指南:

https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/blufi.html

优快云大佬的参考文档:

https://xuhong.blog.youkuaiyun.com/article/details/114676681

上图为乐鑫官方文档中的配网流程图,参考的程序为ESP-IDF工程下面examples/bluetooth/bluedroid/ble/blufi/这个目录下面的工程。

例程示意图

      如上图所示,在ESP32上面运行了example目录下面的三个例程,使用微信小程序进行蓝牙配网后就能直接进行后续的操作,Blufi例程只有蓝牙配网的部分,在蓝牙配网成功后继续广播信号等待新的蓝牙连接。在用微信小程序的配网时注意一个地方,就是蓝牙名称的过滤,在Blufi例程中有对蓝牙广播名称的设置,在小程序中有对蓝牙名称的过滤,我在使用时先修改了Blufi中的名称,在使用小程序时没有看程序直接连接,就导致了微信一直不能搜出来ESP32设置的名称。

入上图所示在微信小程序的util.js文件中的过滤名称函数要与Blufi例程主函数中设置的名称有包含关系,保证过滤函数能把名称过滤出来。

上图是通过小程序搜出来的名称。

例程组合

程序我就是将三个程序都放到examples目录下面sockets目录下面的tcp_client目录的tcp_client.c文件中。

上图是我文件的组织方式,将Blufi的程序写成一个任务函数,在主函数里面启动这个任务,然后在获取到IP地址的地方启动我的另外两个任务。

当Blufi获取到蓝牙连接并断开的事件后就启动两个任务并停止蓝牙广播,但是这样有个问题就是每次连接的时候都需要通过蓝牙连接一下板子。

在断开后启动任务程序能够运行,只是每次都需要重新连接,肯定不行,会被打死。然后我在获取到IP地址后就直接启动任务了,第一次连接后,后面的每次就不用重新连接蓝牙配置WiFi网络了。

最后

ESP32的初学者,希望大家给出宝贵的意见。程序目前能够运行了,但是经过检测,蓝牙还一直在广播,这个耗电啊,后面又在与服务器通信的心跳包中添加了超时重启函数,当板子超过规定的时间没有收到服务器的心跳就直接重启。重启大法好啊。能解决断网的问题,目前就先这样,后面在修改。目前想到在Blufi初始化的时候增加一个标志位,当获取到IP时间后就不执行Blufi初始化函数,当没有获取到IP是就执行初始化函数进行蓝牙配网。这种方式应该还是有点问题,后面再研究研究,谢谢大家。

 

 

 

 

 

 

<think>嗯,用户想找关于STM32和ESP8266通过QT的TCP进行通信的实现例子。首先,我需要理清楚这几个组件之间的关系。STM32是微控制器,ESP8266是WiFi模块,QT通常指跨平台的应用程序开发框架,可能用于上位机。用户可能希望STM32通过ESP8266连接到QT开发的TCP服务器,实现数据传输。 首先,我应该回顾ESP8266的基本用法。ESP8266通常通过AT指令进行配置,比如设置WiFi模式、连接到路由器,然后建立TCP连接。STM32需要通过串口发送这些AT指令给ESP8266模块。用户提到的QT TCP部分,可能是在电脑上运行一个用QT编写的TCP服务器,接收STM32通过ESP8266发送的数据。 接下来,我需要考虑硬件连接。STM32和ESP8266之间通常通过UART通信,需要确认引脚连接是否正确,比如TX、RX、GND,以及是否需要使能引脚(如CH_PD或RST)。然后,软件部分需要STM32的串口驱动,发送AT指令并处理响应。这部分可能涉及到状态机,因为AT指令的响应可能有不同的情况,需要正确处理。 然后,QT端的实现。用户可能需要编写一个TCP服务器,监听特定端口,接收来自ESP8266的连接。QT的QTcpServer和QTcpSocket类可以用于此。需要处理新连接、数据接收和发送。同时,可能需要处理多线程,避免界面卡顿。 接下来,我需要检查是否有相关的引用资料。在用户提供的引用中,引用[1]提到ESP8266的串口使用,引用[3]提到了与STM32相关的头文件,比如bsp_esp8266.h,这可能包含ESP8266的驱动函数。引用[2]涉及Modbus协议栈的实现,可能不直接相关,但状态机的处理方式可能有参考价值。 用户可能需要具体的步骤,比如配置ESP8266为Station模式,连接到WiFi,建立TCP连接到QT的服务器,然后发送数据。代码示例方面,STM32部分需要初始化串口,发送AT指令,并解析响应。例如,发送AT+CWMODE=1设置模式,AT+CWJAP="SSID","PASSWORD"连接WiFi,AT+CIPSTART="TCP","服务器IP",端口建立连接,然后发送数据AT+CIPSEND。 在QT部分,需要创建服务器,监听连接,接收数据。可能需要展示如何使用QTcpServer和QTcpSocket,处理新的连接,读取数据,并发送响应。 可能还需要考虑错误处理,比如网络断开重连,超时处理,数据帧的完整性。例如,使用状态机处理不同的AT指令响应,确保每一步都成功后再进行下一步操作。 此外,用户可能需要参考资料或示例代码的位置,比如引用[3]中的文件可能包含ESP8266的驱动函数,可以指导如何集成到现有工程中。需要指出用户查阅这些文件,并可能提供代码结构。 最后,应该提醒用户注意IP地址和端口的配置,确保防火墙允许连接,以及数据格式的正确性。可能还需要提到调试工具,如串口调试助手,帮助排查问题。 总结回答结构:先介绍整体架构,分STM32端和QT端的实现步骤,提供关键代码片段,注意事项,以及相关引用资料。然后生成相关问题,如优化连接稳定性,数据协议设计,错误处理等。</think>### STM32与ESP8266通过QT TCP通信实现方法 #### 系统架构 1. **硬件连接** - STM32通过UART与ESP8266通信(波特率通常为115200) - ESP8266连接至WiFi路由器,QT TCP服务器运行在PC或云端 2. **通信流程** - STM32发送AT指令配置ESP8266 - ESP8266建立TCP连接至QT服务器 - 双向数据传输 --- #### STM32端实现步骤 1. **硬件初始化** 配置UART外设(参考引用[3]的`bsp_esp8266.h`): ```c void ESP8266_Init(UART_HandleTypeDef *huart) { // 初始化UART及GPIO } ``` 2. **AT指令控制** 发送关键指令序列: ```c ESP8266_SendCmd("AT+CWMODE=1", 1000); // 设置为Station模式 ESP8266_SendCmd("AT+CWJAP=\"SSID\",\"PASSWORD\"", 5000); // 连接WiFi ESP8266_SendCmd("AT+CIPSTART=\"TCP\",\"192.168.1.100\",8080", 3000); // 连接QT服务器 ``` 3. **数据传输** 发送数据示例: ```c void SendData(uint8_t *data, uint16_t len) { HAL_UART_Transmit(&huart2, "AT+CIPSEND=", strlen("AT+CIPSEND="), 100); HAL_UART_Transmit(&huart2, data, len, 100); } ``` --- #### QT TCP服务器实现 1. **创建服务器** 使用`QTcpServer`监听端口: ```cpp QTcpServer *server = new QTcpServer(this); server->listen(QHostAddress::Any, 8080); connect(server, &QTcpServer::newConnection, this, &MainWindow::onNewConnection); ``` 2. **处理数据接收** 在槽函数中读取数据: ```cpp void MainWindow::onReadyRead() { QByteArray data = tcpSocket->readAll(); qDebug() << "Received:" << data; // 发送响应(可选) tcpSocket->write("ACK"); } ``` --- #### 关键注意事项 1. **ESP8266配置验证** - 使用`AT+CIFSR`查询获取的IP地址 - 通过`AT+CIPSTATUS`检查连接状态[^1] 2. **数据帧格式** - 建议定义应用层协议(如首部+长度+数据+校验) - 可参考引用[2]的状态机实现保证数据完整性 --- #### 示例工程结构 ``` 工程目录/ ├── STM32/ │ ├── Core/Inc/bsp_esp8266.h # 引用[3]中的驱动文件 │ └── Src/main.c # 主控制逻辑 └── QT_Server/ └── server.pro # QT项目文件 ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值