当前位置:   article > 正文

必看内容!STM32使用ESP8266通过串口与阿里云物联网平台通信_8266连阿里物联网_esp8266串口调试

esp8266串口调试

在这里插入图片描述

在这里插入图片描述

四、使用串口助手发送AT指令连接物联网平台

  1. AT //返回 OK
  2. AT+RST //复位
  3. AT+RESTORE //恢复出厂设置
  4. AT+CWMODE=1 //设置模式,可连接wifi热点
  5. AT+CWJAP="WIFI名字","WIFI密码" //连接热点
    例如:AT+CWJAP="qjl","11111111"

★坑3:wifi名字必须为英文!!频率为2.4G!如果是苹果手机,在个人热点处打开–最大兼容性。

  1. AT+CWJAP? //检测是否连接上热点
  2. AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com" //连接阿里云的网站
  3. //配置MQTT
    (1)设置用户名、密码
    使用指令:AT+MQTTUSERCFG=0,1,"NULL",“下图的用户名",“下图的密码”,0,0,""
    例如:AT+MQTTUSERCFG=0,1,"NULL","LED1&a1n2p8YJOux","2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b",0,0,""
    在这里插入图片描述
    (2) 设置clientld
    使用指令:AT+MQTTCLIENTID=0,"下图的clientld"
    例如:AT+MQTTCLIENTID=0,"a1n2p8YJOux.LED1|securemode=2\,signmethod=hmacsha256\,timestamp=1709691140893|"

★坑4:下图的clientld复制完成后,要在“”里面的逗号前加上‘\’ 。如上述例子中一样!!

在这里插入图片描述

  1. //设置好信息后,连接MQTT。
    使用指令: AT+MQTTCONN=0,"下图的mqttHostUrl",1883,1
    例如:AT+MQTTCONN=0,"a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
    在这里插入图片描述

★坑5:总显示连接失败。

解决:看一下之前的手机热点是不是长时间没连接给自动关闭了,我当时就是这个地方出问题,所以才一直显示ERROR。
//连接成功后,发现物联网平台设备在线。
在这里插入图片描述

  1. 使用相应的Topic进行通信。
    在这里插入图片描述
    (1)订阅内容。
    AT+MQTTSUB=0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",1
    ●测试:
    使用物联网平台发布调试。
    在这里插入图片描述
    串口助手接收到的内容:
    在这里插入图片描述

(2)发布内容,更改物联网平台数据,使用相应的Topic以及需要修改数据的参数名称。
AT+MQTTPUB=0,"/sys/a1n2p8YJOux/LED1/thing/event/property/post","{\"params\":{\"learningTime\":33}}",0,0
在这里插入图片描述

在这里插入图片描述

七、代码部分(完整工程代码私聊):

  1. usart.c
#include "usart1.h"
#include "delay.h" 
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stm32f10x.h" 
#include "wifi.h"
#include "beep.h"

u32 UART1_read_count = 0;     //接收数据的个数
char ResultBuff[2] = {0};  //返回结果存放数组
#define MAX\_STRING\_LENGTH 250

char \*p;


// 在全局范围定义一个数组来存储接收到的字符串
char receivedString[MAX_STRING_LENGTH];


static void NVIC\_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /\* 嵌套向量中断控制器组选择 \*/
  NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /\* 配置USART为中断源 \*/
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /\* 抢断优先级\*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  /\* 子优先级 \*/
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  /\* 使能中断 \*/
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /\* 初始化配置NVIC \*/
  NVIC\_Init(&NVIC_InitStructure);
}

void USART\_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// 打开串口GPIO的时钟
	DEBUG\_USART\_GPIO\_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	
	// 打开串口外设的时钟
	DEBUG\_USART\_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

	// 将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO\_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO\_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	// 配置 针数据字长
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// 配置停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	// 配置校验位
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	// 配置硬件流控制
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	// 配置工作模式,收发一起
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	// 完成串口的初始化配置
	USART\_Init(DEBUG_USARTx, &USART_InitStructure);
	
	// 串口中断优先级配置
	NVIC\_Configuration();
	
	// 使能串口接收中断
	USART\_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);	
	
	// 使能串口
	USART\_Cmd(DEBUG_USARTx, ENABLE);	    
}



//空闲中断
void USART1\_IRQHandler(void)//串口中断服务函数
{ 
	    u8 rxd = 0;//接收缓存
	if (USART\_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
			USART\_ClearITPendingBit(USART1, USART_IT_RXNE);
			rxd = USART\_ReceiveData(USART1);
			Recive\_Data(rxd);
	}
}


/\*
1.功能:将阿里云下发的数据 存到 字符串数组中。
2.接收数据格式例子:
 +MQTTSUBRECV:0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",159,{"method":"thing.service.property.set","id":"1891523621","params":{"brightness":77,"learningTime":78,"powerstate":1,"AlarmFrequencyLevel":2},"version":"1.0.0"}
3.因为下发的数据格式第一个字符为'+',所以以'+'为开始接收标志的头。
\*/
void Recive\_Data(u8 rxd)
{
		static u8 Start_recive = 0;//开始接收标志
		static u8 stringIndex = 0;	

		if(rxd=='+')  //如果接收到 '+'
			{
				memset(receivedString,0,400); //清空接收数组
				stringIndex=0;                //字符串索引号,从0开始接收
				Start_recive=1;               //开始接收标志
			}
	  if(Start_recive == 1)      
		{
				receivedString[stringIndex++] = rxd;
				if(stringIndex == MAX_STRING_LENGTH)
				{
					stringIndex=0;
					Start_recive=0;
				 }
		}	
}


/\*
1.功能:输入模块名称,返回该模块的值。用于读取阿里云平台模块的值。
2.订阅消息后接收的数据格式如下,用于理解代码:
 +MQTTSUBRECV:0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",159,{"method":"thing.service.property.set","id":"1891523621","params":{"brightness":77,"learningTime":78,"powerstate":1,"AlarmFrequencyLevel":2},"version":"1.0.0"}
3.如果输入模块名称不存在,则返回-1。
\*/
int Get\_Module\_Val(char \*Module_name)   
{
	 int Module_Val=-1;
   if( (p=strstr(receivedString,Module_name) )!=NULL ) //判断receivedString中是否包含模块名。执行完此行代码后,指针p指向模块名的第一个字符!!!
 	 {
					p=p+strlen(Module_name)+strlen("\":");                   //将指针后移至第一位值的位置。具体需要后移多少位到该位置,请分析开头注释2中数据格式。
					Module_Val= \*p -'0';                                      //解析出该值。 
			 
				 while( (\*(p+1)-'0') >=0 && (\*(p+1)-'0')<=9 )               //用于判断模块的值,是一位数,还是两位数,还是更多位。直到不为0~9的值为止。
				 {
						Module_Val=Module_Val\*10+(\*(p+1)-'0');                  //计算模块的值。
						p++;                                                    //后移指针。
				 } 
	 }
	 return Module_Val;
}



/\*
 发送字符串,用于发送AT指令
\*/
void SendChar(char \*buff){   
	unsigned char i=0;
	while(buff[i]!='\0'){
			while(USART\_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //等待接收完成标志
			USART\_SendData(USART1,buff[i]);
			USART\_ClearFlag(USART1,USART_FLAG_TC);  //清除完成标志
			i++;	
	}	
}




//---------------------------------------------下面没用用到/ 备用----------------------

/\*
 串口1发送一个字节
\*/
void usart1\_send\_byte(u8 data)
{
	while(!(USART\_GetFlagStatus(USART1,USART_FLAG_TC)==SET)); //获取发送完成标志位
	USART\_SendData(USART1,data);  //传输数据
}


/\*
 串口1接收一个字节
\*/
char usart1\_read\_byte(void)
{
	while(!(USART\_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)); //获取发送完成标志位
	return USART\_ReceiveData(USART1);    //返回数据 
}



/\*
 发送命令字符串,参数:命令、预期返回结果
\*/
bool USRT\_Send\_ATCmd(char \*cmd,char \*result)
{
	unsigned char i = 0;
	unsigned char ret = 0;
	while(1)
	{	
			USART1\_Clear\_Buf();
			SendChar(cmd);
			delay\_ms(100);
			if(NULL != strstr(ResultBuff,result))
			{
				ret = SUCCESS;
				break;
			}
			else if(i++ >=10)
			{
				ret = ERROR;
				break;
			}
  } 
	return ret;
}


/\*
 清空数组
\*/
void USART1\_Clear\_Buf(void)  
{
	  memset(ResultBuff, 0, strlen(ResultBuff));
    UART1_read_count = 0;
}




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  1. usart.h
#ifndef \_\_USART1\_H
#define \_\_USART1\_H
#include "stm32f10x.h" 
#include "stdio.h"



#define DEBUG\_USART1 1

#if DEBUG\_USART1

// 串口1-USART1
#define DEBUG\_USARTx USART1
#define DEBUG\_USART\_CLK RCC\_APB2Periph\_USART1
#define DEBUG\_USART\_APBxClkCmd RCC\_APB2PeriphClockCmd
#define DEBUG\_USART\_BAUDRATE 115200

// USART GPIO 引脚宏定义
#define DEBUG\_USART\_GPIO\_CLK (RCC\_APB2Periph\_GPIOA)
#define DEBUG\_USART\_GPIO\_APBxClkCmd RCC\_APB2PeriphClockCmd
	
#define DEBUG\_USART\_TX\_GPIO\_PORT GPIOA 
#define DEBUG\_USART\_TX\_GPIO\_PIN GPIO\_Pin\_9
#define DEBUG\_USART\_RX\_GPIO\_PORT GPIOA
#define DEBUG\_USART\_RX\_GPIO\_PIN GPIO\_Pin\_10

#define DEBUG\_USART\_IRQ USART1\_IRQn
#define DEBUG\_USART\_IRQHandler USART1\_IRQHandler


#endif
void Recive\_Data(u8 rxd);  //接收数据,将字符串数据存到数组中。
int Get\_Module\_Val(char \*Module_name);       //获得模块的值
void USART\_Config(void);  
static void NVIC\_Configuration(void); 
char usart1\_read\_byte(void);    //读取字节
void SendChar(char \*buff);    //发送字符串
void usart1\_send\_byte(u8 data); //发送字节
void USART1\_Clear\_Buf(void);   //清除buff
#endif 


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  1. wifi.c
#include "wifi.h"
#include "usart1.h"


//需要修改的内容: 在物联网平台查看MQTT参数
#define Device\_name "LED1" //设备名称
#define ProductKey "a1n2p8YJOux" //产品密钥
#define User\_Password "2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b" //用户密码
#define ClientId "a1n2p8YJOux.LED1|securemode=2\\,signmethod=hmacsha256\\,timestamp=1709691140893|"
#define MqttHostUrl "a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com" //MQTT代理地址

#define Wifi\_Account "JL" //手机热点的账号 一定要是2.4Ghz频段
#define Wifi\_Password "88888888" //手机热点的密码


//不需要修改的内容:
#define User\_Name ""Device\_name"&"ProductKey"" //用户账号
#define Publish\_TOPIC "/sys/"ProductKey"/"Device\_name"/thing/event/property/post" //发布Topic
#define Subscribe\_TOPIC "/sys/"ProductKey"/"Device\_name"/thing/service/property/set" //订阅Topic

/\* ESP8266连接阿里云的AT指令--连接方法一: (可用)
void Esp8266\_ALiyun\_Init() //初始化wifi连接
{ 
 USRT\_Send\_ATCmd("AT\r\n","OK"); //测试
 USRT\_Send\_ATCmd("AT+RST\r\n","OK"); //重启
 // USRT\_Send\_ATCmd("AT+RESTORE\r\n","OK"); //回复出厂设置
 USRT\_Send\_ATCmd("AT+CWMODE=1\r\n","OK"); //使用wifi
 USRT\_Send\_ATCmd("AT+CWJAP=\"JL\",\"88888888\"\r\n","WIFI CONNECTED"); //连接热点
 USRT\_Send\_ATCmd("AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"\r\n","OK"); //连接阿里云
 USRT\_Send\_ATCmd("AT+MQTTUSERCFG=0,1,\"NULL\",\"LED1&a1n2p8YJOux\",\"2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b\",0,0,\"\"\r\n","OK");//设置MQTT的信息
 USRT\_Send\_ATCmd("AT+MQTTCLIENTID=0,\"a1n2p8YJOux.LED1|securemode=2\\,signmethod=hmacsha256\\,timestamp=1709691140893|\"\r\n","OK"); //设置MQTT的信息
 USRT\_Send\_ATCmd("AT+MQTTCONN=0,\"a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,1\r\n","OK");//开始连接阿里云的MQTT
} 
\*/

//ESP8266连接阿里云的AT指令---连接方法二:
void Esp8266\_ALiyun\_Init()   
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/5dab60ba274fafdb1e97baf522486c54.png)

![img](https://img-blog.csdnimg.cn/img_convert/07c3db3561bc6e7d4aeb45052f7421e3.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/192ef50b0428e9d5479e0b38e28da4b7.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/451713bd9a74df0fb15cfbbb1433892d.png)

![img](https://img-blog.csdnimg.cn/img_convert/6536c4cfeb8fc7eeefd3b7de8d3a6c24.png)

![img](https://img-blog.csdnimg.cn/img_convert/2b87fe262328684054c5c21271dd01ca.png)

![](https://img-blog.csdnimg.cn/img_convert/790db0657bbf20f03f1e5a7efdf962bf.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


18866906)]

 [外链图片转存中...(img-lWYjG6K2-1715718866907)]

[外链图片转存中...(img-rP5AVqz8-1715718866907)]

[外链图片转存中...(img-4k0r1be1-1715718866908)]

[外链图片转存中...(img-Hj32RUAu-1715718866908)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/920047
推荐阅读
相关标签
  

闽ICP备14008679号