文章目录

  • 前言
  • 一、硬件准备
    • 1.ESP8266-01S
    • 2. STM32F103C8T6核心板或者小开发板及其程序下载器
  • 二、软件准备
    • 1.STM32CubeMX
    • 2. MDK (Keil v5)
    • 3.程序实现流程
  • 三、STM32CubeMX 配置工程
    • 1.根据芯片信号创建工程
    • 2.配置LED驱动引脚
    • 3.配置串口驱动
    • 4.FreeRTOS配置
    • 5.FreeRTOS的定时器配置
    • 6.工程配置
  • 四、串口中断驱动编写
  • 五、ESP8266的数据显示
  • 六、AT指令配置ESP8266连接WiFi和腾讯云
    • 1.连接WiFi
    • 2.连接腾讯云并订阅主题
  • 七、处理JSON数据并控制LED
    • 1.分割出Topic 和JSON数据
    • 2.JSON数据处理
  • 八、腾讯连连App控制LED灯演示
    • 源码请到转跳:

前言

昨天已经用ESP-12S成功连接上腾讯云物联网开发平台,并且还能用手机控制了,但是毕竟是在电脑上位机做的连接,还没有在STM32连接。博主经过一天的努力。成功给STM32接上了腾讯云物联网开发平台,先说明几点:
       1. 博主用的是RTOS实时操作系统,为的是更快捷的读取云的数据;
       2. 博主也是第一次使用RTOS实时操作系统,对一些API还不是特别熟悉;
       3. 本文虽然大部分介绍怎么实现功能,小部分需要同学们要有点动手能力,比如换SOP芯片啥的。
       4. 如果没有看过第一篇 的同学,请移步【STM32+ESP-12S连接腾讯云物联网开发平台 1】云平台的创建和AT固件烧录,能做到成功连接腾讯云物联网平台再看本文,不然这篇博文对大家连接云平台的帮助不会很大。
声明一下:博主是第一次使用HAL库给STAM32编程,所以有不足之处还请见谅!!

一、硬件准备

1.ESP8266-01S


       如果大家看过 STM32+ESP-12S连接腾讯云物联网开发平台 1 都应该还记得:ESP8266-01S因为Flash太小的原因,无法烧录至少需要2M Flash(ESP8266-01S一般只有1MFlash)的AT固件,这时候就需要各位同学的动手能力了。
       不就是Flash 太小吗?换一个大的就是了,所以大家可以把那个8脚的芯片拆了,换成2M以上的Flash芯片。然后烧录:QCloud_IoT_AT_ESP8266_v2.0.0_20200617_UART_1_3.bin 这个版本的固件,记住不要烧录错误,怎么烧录请移步: STM32+ESP-12S连接腾讯云物联网开发平台 1

2. STM32F103C8T6核心板或者小开发板及其程序下载器

在STM32芯片价格暴涨的年代,用STM32真是为难大家了,但是STM32F103C8T6的最小开发板的价格还是可以接受滴,博主推荐能够直插ESP8266-01S的,省得大家接线麻烦。
       程序下载器大家可以根据烧录方式来选择:
       1. 串口烧录的可以用USB转TTL模块就行;
       2 仿真调试方式下载,大家可以用STLink,或者Jlink都行。

二、软件准备

1.STM32CubeMX

`       博主玩这么多年的STM32,也是第一次用这个软件,不得不说,比起自己搭开发环境来说,这个真是太省时间了。

2. MDK (Keil v5)

这个软件,博主只用来学习,不做任何商业用途。推荐使用正版MDK。

3.程序实现流程

三、STM32CubeMX 配置工程

博主也是第一次使用这个软件来配置工程,有什么不足之处非常欢迎指正,

1.根据芯片信号创建工程



       到这里就需要开始配置功能引脚了。

2.配置LED驱动引脚

3.配置串口驱动

4.FreeRTOS配置

5.FreeRTOS的定时器配置

FreeRTOS是要使用定时器来管理任务的并行关系,所以要对定时器进行更改:

6.工程配置

配置完引脚之后,还要对工程输出进行配置:



这样,我们的工程就配置好了,下面就能编写功能代码了。

四、串口中断驱动编写

STM32CubeMx生成的代码使用HAL库写的,而且对串口中断做了一下改变,现在并不是说直接就可以在串口中断函数中处理数据。目前,串口中断函数中只有一个函数:

void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 *//* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}

这个 HAL_UART_IRQHandler(&huart1) 函数只是判断中断类型而已,并没有处理数据的相关代码在里面。有兴趣的同学可以到函数里面看看。
        那既然这个函数并没有做数据处理,那肯定是有个函数专门负责接收串口数据的:
串口中断接收函数: HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
这个函数的功能:这个函数是把husart 串口接收到的 Size数据量的字节存到pData中, 并且关掉中断。
也就说,当我们接受完数据之后,要重新使用这个函数来开启中断。另外还要介绍另一个和这个函数息息相关的函数:
串口接收回调函数: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
这个函数默认不会自动生成,需要我们自己写。
函数功能:当HAL_UART_Receive_IT函数结束后,会进来这个函数当中,用户可以在这个函数中对数据进行处理。
方便大家,给各位同学贴出我自己写的函数HAL_UART_RxCpltCallback

 if(huart->Instance==USART2){UART2_DATA.UART_Data[UART2_DATA.UART_Cnt] = *UART2_DATA.UART_DataBuf;UART2_DATA.UART_Cnt++;if(*UART2_DATA.UART_DataBuf==0X0A){UART2_DATA.UART_Flag = 1;}}HAL_UART_Receive_IT(huart,(uint8_t *)UART2_DATA.UART_DataBuf,sizeof(UART2_DATA.UART_DataBuf));

相关宏结构体:

typedef struct usart
{unsigned char UART_Data[512]; unsigned char UART_Flag;unsigned int UART_Cnt;unsigned char UART_DataBuf[1];
}USART_DataBuf;

我把接收到的数据存在结构体当中进行同意处理,而且这个结构体是全局的,方便使用。

五、ESP8266的数据显示

这个函数可以把ESP8266接收到的数据通过USART1打印出来,方便我们查看调试和了解AT指令的进度。这个函数我把它放在了一个独立线程当中,这样就可以不断地读取并显示出来。

ESP8266DATATypedef esp8266data;
//获取串口数据
uint8_t *Esp8266GetData(void)
{if (UART2_DATA.UART_Flag == 1){strcpy((char *)esp8266data.data, (const char *)UART2_DATA.UART_Data);esp8266data.data_size = UART2_DATA.UART_Cnt;printf("%s", UART2_DATA.UART_Data);for (; UART2_DATA.UART_Cnt > 0; UART2_DATA.UART_Cnt--)UART2_DATA.UART_Data[UART2_DATA.UART_Cnt] = 0;esp8266data.flag += 1;  if(esp8266data.flag>16) esp8266data.flag=16;UART2_DATA.UART_Flag = 0;return esp8266data.data;}return esp8266data.data;
}
void StartTask02(void *argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */uint8_t *sub_buf;HAL_UART_RxCpltCallback(&huart2);for (;;){sub_buf = Esp8266GetData();

六、AT指令配置ESP8266连接WiFi和腾讯云

有了串口中断及之前地AT指令流程,就可以连接腾讯云了:

1.连接WiFi

//连接WiFi
void Esp8266LinkAp(uint8_t *ssid, uint8_t *passwd)
{uint8_t *linkap;linkap = (uint8_t *)malloc(128);HAL_UART_Transmit(&huart2, " \r\n", 3, 1000);do{switch (esp8266data.flag){case 0: //复位ESP8266HAL_UART_Transmit(&huart2, "AT+RST\r\n", strlen("AT+RST\r\n"), 5000);osDelay(2000);break;case 2: //设置连接模式case 3:HAL_UART_Transmit(&huart2, "AT+CWMODE=1\r\n", strlen("AT+CWMODE=1\r\n"), 5000);osDelay(1000);break;//开始连接WiFicase 4:case 5:sprintf((char *)linkap, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, passwd);HAL_UART_Transmit(&huart2, (uint8_t *)linkap, strlen((const char *)linkap), 5000);osDelay(5000);break;default:break;}} while (esp8266data.flag < 7);free(linkap);
}

2.连接腾讯云并订阅主题

void Esp8266LinkloTExplorer(void)
{uint8_t *device_massage;device_massage = (uint8_t *)malloc(128);do{switch (esp8266data.flag){// case 7: //设置连接信息case 7:case 8:sprintf((char *)device_massage, "AT+TCDEVINFOSET=1,\"%s\",\"%s\",\"%s\"\r\n", PRODUCT_ID, DEVUICE_NAME, DEVICE_SECRET);HAL_UART_Transmit(&huart2, device_massage, strlen((const char *)device_massage), 5000);osDelay(1000);break;case 9:case 10:HAL_UART_Transmit(&huart2, "AT+TCMQTTDISCONN\r\n", strlen("AT+TCMQTTDISCONN\r\n"), 5000); //先断开现有链接osDelay(500);break;case 11:HAL_UART_Transmit(&huart2, "AT+TCMQTTCONN=1,5000,240,0,1\r\n", strlen("AT+TCMQTTCONN=1,5000,240,0,1\r\n"), 5000);osDelay(500);break;case 12: //检查是否已经连接HAL_UART_Transmit(&huart2, "AT+TCMQTTSTATE?\r\n", strlen("AT+TCMQTTSTATE?\r\n"), 5000);osDelay(100);break;case 13: //订阅主题sprintf((char *)device_massage, "AT+TCMQTTSUB=\"$thing/down/property/%s/%s\",0\r\n", PRODUCT_ID, DEVUICE_NAME);HAL_UART_Transmit(&huart2, device_massage, strlen((const char *)device_massage), 5000);osDelay(500);break;default:esp8266data.flag = 16;break;}} while (esp8266data.flag < 15);free(device_massage);
}

七、处理JSON数据并控制LED

博主的腾讯云下发的数据在ESP8266中的打印是这样的:

+TCMQTTRCVPUB:"$thing/down/property/C9N29PAEXK/LED",105,
"{"method":"control","clientToken":"clientToken-d4c2c848-b930-44e7-bc4f-55c0226b0907","params":{"led1":1}}"

1.分割出Topic 和JSON数据

根据打印出来的信息可以看出,只要使用字符串操作就能轻松分割出Topic和JSON:

void loTMessageHandler(void)
{char *pub_buf;unsigned int i = 0;if (TCMQTTRCVPUB != 0){//分离出Topicpub_buf = strstr((const char *)TCMQTTRCVPUB, "$thing/down/property");if (pub_buf != NULL){while (*pub_buf != '\"'){Sub_Topic[i] = *pub_buf++;i++;}i = 0;
#if LOT_Debugprintf("Topic=%s\r\n", Sub_Topic);
#endif}//分离出数据pub_buf = strstr((const char *)TCMQTTRCVPUB, "{\"method\":\"control\"");if (pub_buf != NULL){while (*pub_buf != '\n'){Sub_Data[i] = *pub_buf++;i++;}//去掉结尾的双引号Sub_Data[i - 2] = '\0';
#if LOT_Debugprintf("Data=%s\r\n", Sub_Data);
#endifi = 0;}}

2.JSON数据处理

处理JSON数据,大家可以去下载cJSON的库,就两个文件,cJSON.c和cJSON.h:cJson官网下载;把这两个文件加入到自己的工程中,引用一下头文件即可,下面是我代码:

oid cJsonMessageHandler(uint8_t *cJsonDATA)
{if (cJsonDATA != NULL){cJSON *_JsonRoot = cJSON_Parse((const char *)cJsonDATA);if (_JsonRoot == NULL)goto __cJSON_Delete;cJSON *cJSON_params = cJSON_GetObjectItem(_JsonRoot, "params");if (cJSON_params == NULL)goto __cJSON_Delete;cJSON *cJSON_led1 = cJSON_GetObjectItem(cJSON_params, "led1");
#if LOT_Debugprintf("led1=%d\r\n", cJSON_led1->valueint);#endifif (cJSON_led1->valueint == 1)HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);//亮灯elseHAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);//关灯__cJSON_Delete:cJSON_Delete(_JsonRoot);memset(Sub_Data, 0, sizeof(Sub_Data));}
}

八、腾讯连连App控制LED灯演示

源码请到转跳:

【STM32+ESP8266连接腾讯云物联网开发平台 3】STM32+ESP8266-01S在腾讯云上动态注册设备(AT指令方式)–附带源码

【STM32+ESP8266连接腾讯云物联网开发平台 2】STM32+ESP8266-01S连接腾讯云相关推荐

  1. 【STM32+ESP-12S连接腾讯云物联网开发平台 1】云平台的创建和AT固件烧录

    腾讯云物联网开发平台创建和ESP-12S的固件烧录 前言 一.腾讯云物联网开发平台的创建 1. 创建产品 2. 配置产品和创建设备 3. 设备三元组说明 二.ESP-12S固件烧录 1.固件获取 2. ...

  2. STM32节点移植lorawan协议连接腾讯云物联网开发平台(IoT Explorer)

    STM32移植lorawan协议栈连接腾讯云物联网开发平台(IoT Explorer) 前言 开发环境的准备 正文 初始化 入网 发送与接收 前言 在移植协议之前,先给大家科普一下Lora 和 lor ...

  3. ESP32接入腾讯云物联网开发平台

    文章目录 前言 1 资料参考 2 对接总体思路 3 代码移植 3.1 component qcloud_iot 3.2 项目顶层处理 3.3 component main 4 移植问题备忘 CMake ...

  4. RAK7258 LoRaWAN 网关接入腾讯云物联网开发平台

    文章目录 前言 1 控制台操作 LoRa 网关 2 RAK 7258 LoRa网关实物操作 连接配置 网络配置 LoRa参数配置 网关上线确认 END 前言 这篇笔记记录采用 RAK7258 LoRa ...

  5. 腾讯云物联网开发平台 LoRaWAN 透传接入 更新版

    前言 之前有一篇文章介绍LoRaWAN透传数据,不过还是用物模型+云端数据解析脚本,不是真正的透传.腾讯云物联网开发平台也支持对LoRaWAN原始数据的透传.转发.今天来介绍下. 腾讯云 IoT Ex ...

  6. 腾讯云物联网开发平台 IoT Explorer 全面指引

    文章目录 * 1 设备侧开发教程 * 1.1 [腾讯云](https://l.gushuji.site/tencent)端侧资源 1.2 LoRa 设备 * LoRaWAN 节点接入 LoRaWAN ...

  7. 腾讯云-物联网开发平台测试(联合mqtt.fx 1.7.1)

    腾讯云-物联网开发平台测试(联合mqtt.fx 1.7.1) 文章目录 腾讯云-物联网开发平台测试(联合mqtt.fx 1.7.1) 环境介绍: 实验目的: 1.新建产品 2.新建功能 3.设备开发 ...

  8. 使用创思通信4G Cat1 DTU基于TencentOS-tiny对接腾讯云物联网开发平台

    一.简介 本文档主要讲述如何使用创思通信4G Cat1 DTU开发板,基于TencentOS-tiny对接腾讯云物联网开发平台IoT Explorer,演示温度数据上报平台.平台下发控制指令控制继电器 ...

  9. 腾讯云-物联网开发平台IoT Explorer

    应用场景 腾讯云的物联网开发平台能做什么?举一个简单的例子,作者就经常有这样的场景:三十度高温的广州,每当你刚踏进家门便急不可耐的寻找空调遥控器把温度调到最低,然后站在空调前迎面吹着冷风:但也可以是这 ...

最新文章

  1. 文档相似度之doc2vec、文档聚类
  2. mysql windows编译_Windows平台下编译Mysql源码 | 学步园
  3. 进程特征码遍历VC版
  4. SAP Cloud Connector里的virtual host和internal host有什么区别
  5. Linux学习笔记-使用管道通信实现cat /etc/passwd | grep root这条命令
  6. 论文阅读01:大规模人脸图像检索的深度度量哈希
  7. vue 实现表格循环滚动 vue-seamless-scroll插件的安装与使用
  8. Plotly基础教程
  9. 图片打标签labelimg
  10. 安卓--记账软件课程设计
  11. 计算机桌面有什么,电脑桌面是什么
  12. 八年级作文-倾听春雨的喜悦
  13. 知到/智慧树——英语听说:实境主题与技能(参考答案)
  14. RPG Maker MV-去掉开头动画
  15. IDEA的修改背景照片and使用技巧
  16. exit和_exit,fock和vfock
  17. 黎曼猜想推导的数学基础
  18. 洛谷刷题P1914 小书童——凯撒密码(c语言)
  19. 迎双11十周年,OceanBase 2.0挑战新巅峰
  20. Bootstrap搭建背景轮播的登录界面

热门文章

  1. 安卓班级同学录校友录系统app毕业设计
  2. VBA常见错误 - “错误3706,未找到提供程序,该程序可能未正确安装”解决方法
  3. 医生提醒:坐办公室一族应1小时活动5分钟
  4. 光栅位移传感器如何安装
  5. 中科大 南大计算机专业哪个好,南京大学与中国科学技术大学的计算机专业哪个好?...
  6. word只粘贴为文本快捷键设置
  7. 排列组合乘法原理与加法原理
  8. 玩猎魂觉醒久了,发现这游戏越来越肝,天天都在肝防具和武器....
  9. python-app自动化查找微信僵尸好友
  10. 什么是程序化自动交易接口?