STM32+ESP-01s+EMQX实现单片机MQTT协议传输数据上云(二)STM32F103与ESP-01s的Usart通信,实现STM32连接上网上云

单片机:STM32F103c8t6

WiFi模块:ESP8266-01s

EMQX:自身服务器上搭载emq服务器或者借用emqx window 版本 

USB TO TTL模块:CH340

因为CH340不能给ESP-01s供3.3V的电,所以测试时需要外加供电

 

        本章中涉及到的技术原理主要为ESP01S wfi模块的AT指令通信,我在上一篇文章给大家提到了ESP01S AT指令的使用,大家可以先通过我的上一篇文章入门。

 STM32+ESP-01s+EMQX实现单片机MQTT协议传输数据上云(一)ESP-01s的AP-MQTT bin文件安装以及指令使用_JASON丶LI的博客-CSDN博客

如果大家嫌我啰嗦,也可以直接去看乐鑫公司AT指令集合,链接我也放下面了

AT 命令集 - ESP32 - — ESP-AT 用户指南 latest 文档 (espressif.com)

一、原理

连接:首先通过STM32的Usart通信给ESP01S(下面简称ESP)模块发送相关指令,开启ESP模块的Station(客户端模式),在进行配网模式,连接进入STM32设定好的WIFI信息,然后定义ESP的MQTT属性,最后连接进入STM32设定好的MQTT服务器。

 发送指令:STM32发送指令到ESP使其向对应topic发送任意QOS等级的Message

接收指令:STM32发送指令到ESP使其订阅定义的topic,在指令接收发送方面,采用Usart接收文本数据包的形式。由于MQTT下发的通知默认格式为 '+' 为开头换行符( '/r/n' )为结尾的,所以如下图所示以 '+' 为数据的接收提取标志位,换行符作为接收标志位。

 二、接线

ESP-01s STM32
TXD RXD
RXD TXD
3.3v 3.3v
GND GND

三、AT指令

STM32 连网+连服务器 AT指令:

//ESP模块初始化
Serial_SendString("AT+RST\r\n");
Delay_s(1);

//ESP模块设置为Station模式
Serial_SendString("AT+CWMODE=1\r\n");
Delay_s(1);

//ESP模块连接进入WIFI(ID:JASON;  PASSWORD:88888888)
Serial_SendString("AT+CWJAP=\"JASON\",\"88888888\"\r\n");
Delay_s(1);

//设定ESP模块MQTT属性(服务器ID:JASON123456car;  ID:JASON;  PASSWORD:123)
Serial_SendString("AT+MQTTUSERCFG=0,1,\"JASON123456car\",\"JASON\",\"123\",0,0,\"\"\r\n");
Delay_s(1);

//ESP模块连接MQTT服务器(服务器域名:123.0.0.1;  服务器端口:1883)
Serial_SendString("AT+MQTTCONN=0,\"127.0.0.1\",1883,0\r\n");
Delay_s(1);

STM32 订阅服务器端口 AT指令:

//ESP订阅TOESP01S端口
Serial_SendString("AT+MQTTSUB=0,\"TOESP01S\",0\r\n");

STM32 发送指令到服务器端口 AT指令:

//不带参:向FROMESP01S端口发送STM_OK信息  消息服务等级QOS为;0
Serial_SendString("AT+MQTTPUB=0,\"FROMESP01S\",\"STM_OK\",0,0\r\n");

//带参:向FROMESP01S端口发送信息i  消息服务等级QOS为;0
printf("AT+MQTTPUB=0,\"FROMESP01S\",\"Num=%d\",0,0\r\n",i)

STM接收订阅的服务器端口的指令信息

if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
        {
            uint8_t RxData = USART_ReceiveData(USART1);
            
            if (RxStare == 0) //状态1
            {
                if (RxData == '+' && Serial_RxFlag == 0)
                {
                    RxStare = 1;
                    pRxPacket = 0;
                }
                
            }
            else if (RxStare == 1) //状态2
            {
                if (RxData == '\r')
                {
                    RxStare =2;
                }
                else
                {
                    Serial_RxPacket[pRxPacket] = RxData;
                    pRxPacket ++;
                }
                
            }
            else if (RxStare == 2) //状态3
            {
                if (RxData == '\n')
                {
                    RxStare = 0;
                    Serial_RxPacket[pRxPacket] = '\0';
                    Serial_RxFlag = 1;
                }
            }
            USART_ClearITPendingBit(USART1, USART_FLAG_RXNE);
        }

四、联网代码

STM32C8T6-learning-project: STM32 project (gitee.com)

点赞后,发表评论后评论区即可领取解压密码,作者24小时冲浪,秒回!

 本文为作者独立编写

 本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。

猜你喜欢

转载自blog.csdn.net/weixin_61908666/article/details/130130570