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

4 篇文章 1 订阅
3 篇文章 0 订阅

单片机: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-01sSTM32
TXDRXD
RXDTXD
3.3v3.3v
GNDGND

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

  • 44
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
stm32f103c8t6和esp-01s可以通过串口连接。 1. 首先,在stm32f103c8t6上找到两个串口引脚:PA2和PA3。 2. 将ESP-01S的TX引脚连接stm32f103c8t6的PA3引脚,将ESP-01S的RX引脚连接stm32f103c8t6的PA2引脚。 3. 使用软件串口库,如STM32F1xx_HAL_UART库,进行串口通信。 4. 在程序中,配置stm32f103c8t6的串口为主机,ESP-01S的串口为从机,并进行相应的数据传输。 示例代码: ```c #include "stm32f1xx_hal.h" UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { //发送数据 char data[] = "Hello World!"; HAL_UART_Transmit(&huart1, (uint8_t*)data, strlen(data), HAL_MAX_DELAY); HAL_Delay(1000); //接收数据 char buffer[100]; HAL_UART_Receive(&huart1, (uint8_t*)buffer, 100, HAL_MAX_DELAY); printf("%s", buffer); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 注意:在使用printf函数进行串口输出时,需要在Keil的Options for Target -> C/C++ -> Preprocessor中添加USE_FULL_ASSERT和USE_HAL_DRIVER宏定义,否则会出现编译错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JASON丶LI

作者码力不足了,卑微的求个打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值