阿里云 MQTT协议 AT指令 ESP8266-01S 数据上下传输

立山  金牌会员 | 2024-10-23 15:28:37 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 859|帖子 859|积分 2577

printf重定义资料来自江科大自动化协---<<stm32入门教程>>---<<串口发送+接收>>一节视频讲解
1、调试ESP8266

细节请看b站这个up主的视频阿里云+ESP8266+STM32远程点灯(流程讲解)
阿里云平台配置细节请看10分钟玩转阿里云物联网平台装备接入、管理、运维
这里只记录一下大概内容,方便日后调试。
1、用USB转串口工具毗连ESP8266,先调通esp8266到阿里云端的线路(此步在后续调试esp8266时也尤为重要,由于这样不需要反复修改代码反复烧写,只需几个AT指令)

接线方式  ESP8266USB转串口工具3.33.3GNDGNDTXRXRXTX  注意:有时会出现接线精确发送不出指令的情况,网上查到的原因是,USB转串口工具输出的3.3V电压驱动能力不可,带不动ESP8266,可以更换其他稳固的供电装备,我手边没有万用表,没法测量验证,但是更换电源可以解决此问题;别的官方文件说ESP8266供电电压范围是3.0V-3.6V,我器件尝试接过5V电压,ESP8266没有烧坏,但发热显着,保守期间不要尝试此接法。
AT指令  ATAT+RST重启模块AT+RESTORE规复出厂设置--擦除全部保存在flash中的参数AT+CWMODE=1设置wifi模式-----AP模式AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"设置时域和SNTP服务器 AT+CWJAP="wifiname","password" 毗连APAT+MQTTUSERCFG=0,1,"NULL","username","passwd",0,0,""AT+MQTTCLIENTID=0,"ClientId"AT+MQTTCONN=0,"mqttHostUrl",1883,1AT+MQTTSUB=0,"/{ProductKey}/{DeviceName}/user/get",1订阅自定义topicAT+MQTTPUB=0,"/{ProductKey}/{DeviceName}/user/update","{\"temp\":50.5}",1,0发布自定义TopicAT+MQTTSUB=0,"/sys/{ProductKey}/{DeviceName}/thing/service/property/set",1订阅物模型AT+MQTTPUB=0,"/sys/{ProductKey}/{DeviceName}/thing/event/property/post","{\"params\":{\"EnvironmentTemperature\":35}}",1,0上报装备属性 Clientld需要在‘,’之前加转义字符 '\'
例:

指令中topic:


2、用stm32调试esp8266

接线方式  STM32ESP8266USB转串口工具3.33.3GNDGNDGNDRXTXRXTXRX 可以利用面包板,对线路进行拓展,将ESP8266的TX同时接到STM32和串口工具的RX引脚,方便利用电脑的串口调试软件观察ESP8266的配置状态,方便调试。
ESP8266的初始化函数(用STM32的串口发送AT指令给ESP8266)
  1. //初始化ESP8266连接到阿里云函数
  2. void ESP8266_Init(void)
  3. {
  4.         OLED_ShowString(1,1,"loading...");
  5.         //1
  6.         Serial_String("AT+RST\r\n");
  7.         ESP_FeedBack(1);
  8.         Delay_ms(2000);
  9.         //2
  10.         Serial_String("AT+RESTORE\r\n");
  11.         ESP_FeedBack(2);
  12.         Delay_ms(2000);
  13.         //3
  14.         Serial_String("AT+CWMODE=1\r\n");
  15.         ESP_FeedBack(3);
  16.         Delay_ms(2000);
  17.         //4
  18.         Serial_String("AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"\r\n");//加转义字符
  19.         ESP_FeedBack(4);
  20.         Delay_ms(3000);
  21.         //5
  22.         Serial_String("AT+CWJAP="LAPTOP","asdfghjkl"\r\n");//加转义字符
  23.         ESP_FeedBack(5);
  24.         Delay_ms(3000);
  25.         //6
  26.         Serial_String("AT+MQTTUSERCFG=0,1,"NULL","ESP8266-01&ibln7d8PcHp","e0ae924e8007d0259c7a7d31bd3f01fd1bfdc270b8e689fa757e4f23de4cccb4",0,0,""\r\n");
  27.         ESP_FeedBack(6);
  28.         Delay_ms(5000);
  29.         //7
  30.         Serial_String("AT+MQTTCLIENTID=0,"ibln7d8PcHp.ESP8266-01|securemode=2\\,signmethod=hmacsha256\\,timestamp=1679206129784|"\r\n");
  31.         ESP_FeedBack(7);
  32.         Delay_ms(5000);
  33.         //8
  34.         Serial_String("AT+MQTTCONN=0,"iot-06z00ehfqvp2bgm.mqtt.iothub.aliyuncs.com",1883,1\r\n");
  35.         ESP_FeedBack(8);
  36.         Delay_ms(5000);
  37.         //9
  38. //        Serial_String("/ibln7d8PcHp/ESP8266-01/user/get",1\r\n");
  39. //        ESP_FeedBack(9);
  40. //        Delay_ms(5000);
  41.         //10订阅物模型
  42.         Serial_String("AT+MQTTSUB=0,"/sys/ibln7d8PcHp/ESP8266-01/thing/service/property/set",1\r\n");
  43.         ESP_FeedBack(9);
  44.         Delay_ms(5000);
  45.        
  46. }
复制代码
ESP8266日志接收函数(STM32接收ESP8266发送返来的日志数据,分析数据做出初始化反馈)
  1. //查看错误反馈函数
  2. void ESP_FeedBack(uint8_t t)
  3. {
  4.         Delay_ms(1000);
  5.         if( strstr((const char *)ESP8266_To_Serial,"ERROR") )
  6.         {
  7.                 Refresh_DMA();//刷新DMA缓冲区以及计数器
  8.                 memset(ESP8266_To_Serial,0,100);//将数组清零
  9.                 OLED_ShowString(2,1,"ERR:");
  10.                 OLED_ShowNum(2,4+t,t,1);
  11.         }
  12. }
复制代码
main.c
  1. int main(void)
  2. {       
  3.         OLED_Init();
  4.         Serial_Init();//初始化串口2配置
  5.         USART_DMA_Init();//初始化DMA转运USART2_RX配置
  6.         ESP8266_Init();//ESP8266连接服务器
  7.         while(1)
  8.         {
  9.                 i++;
  10.         //一次发送多个物模型数据
  11.                 printf("AT+MQTTPUB=0,"/sys/ibln7d8PcHp/ESP8266-01/thing/event/property/post","{\\"params\\":{\\"EnvironmentTemperature\\":%d},\\"LightLux\\":%d,\\"AirSpeed\\":%d}}",1,0\r\n",i,i+1,i+2);
  12.         //一次发送一个物模型数据
  13.                 printf("AT+MQTTPUB=0,"/sys/ibln7d8PcHp/ESP8266-01/thing/event/property/post","{\\"params\\":{\\"LightLux\\":%d}}",1,0\r\n",i);
  14. //                printf("AT+MQTTPUB=0,"/sys/ibln7d8PcHp/ESP8266-01/thing/event/property/post","{\\"params\\":{\\"LightLux\\":%d}}",1,0\r\n",i);
  15.                 Delay_ms(10000);//延时10秒
  16.         }
  17. }
复制代码
请求数据格式要求:

 
发送数据时需要利用变量,若直接利用串口发送函数,则不能存在变量,因此解决此问题需要重定义printf函数实现。步骤如下:

1、在keil中利用printf之前需要线设置一下


2、 打印函数

方法一:重定向printf

将printf打印的东西输出到串口
重写fputc()函数,由于printf函数利用时也是调用fputc函数一个个的打印。fputc函数发送到串口,printf函数自然也就打印输出到了串口
重写fputc函数:
  1. #include <stdio.h>
  2. int fputc(int ch,FILE *f)
  3. {
  4.     Serial_SendByte(ch);//这里调用自己写的串口发送字节函数
  5.     return ch;
  6. }
  7. //主函数
  8. void main(void)
  9. {
  10.     printf("NUm=%d\n",666);
  11.     while(1)
  12.     {
  13.     }
  14.    
  15. }
复制代码
方法二:用sprintf函数(此处是实现打印到串口的第二种方法)

sprintf函数不需要重定义,由于此函数第一个参数是指定打印位置
sprintf函数作用是把格式化字符输出到一个字符串里
  1. #include <stdio.h>
  2. char string[100];//定义一个足够大的缓存空间
  3. sprintf(string,"NUM=5d\n",666);//输出到string中
复制代码
方法三:封装sprintf函数(此方法用到了可变参数列表,记录下来只是学习一下)

  1. void Serial_printf(char *format,...)
  2. {
  3.     char string[100];
  4.     va_list arg;//存放可变参数列表的变量
  5.     va_start(arg,format)//从format开始存放参数列表到arg中
  6.     vsprintf(string,format,arg);//打印格式   这里up解释是sprintf只能接收直接写的参数
  7.     va_end(arg);//释放arg空间
  8.     Serial_SendByte(string);//调用自己写的串口发送字节函数
  9. }
复制代码
keil修改一下配置






免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表