当前位置:   article > 正文

一种基于stm32与esp8266进行通信上传数据至onenet的方式_esp8266与stm32串口数据交互

esp8266与stm32串口数据交互

文章目录


前言

笔者最近发现onenet平台更新了,新的onenet好像不能再和以前的接入方式一样,转而使用新的设备管理方式了。不过笔者试了一下之前的配置如果设备没有下线的话还是能用,还有onenet也开始搞缩窄功能和新增收费了感觉要和阿里云一样了.....

一、stm32的初始化配置

这里比较简单就连接esp8266的串口即可,笔者这里使用的是串口3,用的是hal库

切记RX-TX TX-RX接口确定没问题之后我们来看代码

二、使用步骤

1.引入库

代码如下(示例):

  1. //初始化IO 串口3
  2. //bound:波特率
  3. void uart3_init(u32 bound)
  4. {    
  5.     //UART 初始化设置
  6.     UART3_Handler.Instance=USART3;                        //USART3
  7.     UART3_Handler.Init.BaudRate=bound;                    //波特率
  8.     UART3_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式
  9.     UART3_Handler.Init.StopBits=UART_STOPBITS_1;        //一个停止位
  10.     UART3_Handler.Init.Parity=UART_PARITY_NONE;            //无奇偶校验位
  11.     UART3_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控
  12.     UART3_Handler.Init.Mode=UART_MODE_TX_RX;            //收发模式
  13.     HAL_UART_Init(&UART3_Handler);                        //HAL_UART_Init()会使能UART1
  14.     
  15. //    HAL_UART_Receive_IT(&UART3_Handler, (u8 *)USART3_RX_BUF, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
  16.   
  17. }

串口3的基础配置

  1.  if(huart->Instance==USART3)//如果是串口3,进行串口3 MSP初始化
  2.     {
  3.         __HAL_RCC_GPIOB_CLK_ENABLE();            //使能GPIOb时钟
  4.         __HAL_RCC_USART3_CLK_ENABLE();            //使能USART3时钟
  5.         __HAL_RCC_AFIO_CLK_ENABLE();
  6.     
  7.         GPIO_Initure.Pin=GPIO_PIN_10;            //PB10
  8.         GPIO_Initure.Mode=GPIO_MODE_AF_PP;        //复用推挽输出
  9.         GPIO_Initure.Pull=GPIO_PULLUP;            //上拉
  10.         GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
  11.         HAL_GPIO_Init(GPIOB,&GPIO_Initure);           //初始化PB10
  12.         GPIO_Initure.Pin=GPIO_PIN_11;            //PB11
  13.         GPIO_Initure.Mode=GPIO_MODE_AF_INPUT;    //模式要设置为复用输入模式!    
  14.         HAL_GPIO_Init(GPIOB,&GPIO_Initure);           //初始化PB11
  15.         
  16.         HAL_NVIC_EnableIRQ(USART3_IRQn);                //使能USART3中断通道
  17.         HAL_NVIC_SetPriority(USART3_IRQn,2,2);            
  18.     }

笔者这里的操作比较简单,直接调用串口3的发送将指令发送出去没有做接收中断,一般来说为了系统更加稳定可以增加上接收到对应的指令回传的ok在进行下一步会更好一点,笔者这里相对简单,lcd显示时笔者的一个工程里面用到的这里懒得删了就保留了,看情况删除即可。

指令的格式和内容可以自己上网找找at指令集就知道了。这里讲几个可能比较模糊的,AT+CWJAP=\"xy\",\"xiaoyang123这里是自己的热点或者wifi的名称和密码

AT+MQTTUSERCFG=0,1,这里是连接onenet平台自己的设备的重要参数,分别对应的是设备名称,soken码以及时间戳

soken码可以去onenet的开发者手册里面有连接自行下载配置即可。

  1. void ESP8266_Init(void)
  2. {
  3. uint8_t aaa[]="AT\r\n";
  4. uint8_t abb[]="AT+RST\r\n\r\n";
  5. uint8_t acc[]="AT+CWMODE=1\r\n";
  6. uint8_t add[]="AT+CWDHCP=1,1\r\n";
  7. uint8_t aee[]="AT+CWJAP=\"xy\",\"xiaoyang123\"\r\n";
  8. uint8_t aff[]="AT+MQTTUSERCFG=0,1,\"basketball\",\"ogdIZ57P1f\",\"version=2018-10-31&res=products%2FogdIZ57P1f%2Fdevices%2Fbasketball&et=2810295940&method=md5&sign=g0d4e%2B2W18mJcW8q4VRWCQ%3D%3D\",0,0,\"\"\r\n";
  9. uint8_t agg[]="AT+MQTTCONN=0,\"mqtts.heclouds.com\",1883,1\r\n";
  10. ESP8266_Clear();
  11. LCD_ShowString(8,32,"system is init.",0x00,0xffff,16,0);
  12. LCD_ShowString(8,48,"please wait.",0x00,0xffff,16,0);
  13. printf("0. AT\r\n");
  14. HAL_UART_Transmit(&UART3_Handler,aaa,strlen(aaa),100); //发送数据
  15. // while(ESP8266_SendCmd("AT\r\n", "OK"))
  16. delay_ms(200);
  17. LCD_DrawLine(0,80,20,80,0X7D7C);
  18. LCD_DrawLine(0,81,20,81,0X7D7C);
  19. LCD_DrawLine(0,82,20,82,0X7D7C);
  20. printf("1. AT+RST\r\n");
  21. HAL_UART_Transmit(&UART3_Handler,abb,strlen(abb),100); //发送数据
  22. // while(ESP8266_SendCmd("AT+RST\r\n", ""))
  23. delay_ms(200);
  24. LCD_DrawLine(20,80,40,80,0X7D7C);
  25. LCD_DrawLine(20,81,40,81,0X7D7C);
  26. LCD_DrawLine(20,82,40,82,0X7D7C);
  27. printf("2. CWMODE\r\n");
  28. HAL_UART_Transmit(&UART3_Handler,acc,strlen(acc),100); //发送数据
  29. // while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
  30. delay_ms(200);
  31. LCD_DrawLine(40,80,60,80,0X7D7C);
  32. LCD_DrawLine(40,81,60,81,0X7D7C);
  33. LCD_DrawLine(40,82,60,82,0X7D7C);
  34. printf( "3. AT+CWDHCP\r\n");
  35. HAL_UART_Transmit(&UART3_Handler,add,strlen(add),100); //发送数据
  36. // while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
  37. delay_ms(500);
  38. LCD_DrawLine(60,80,80,80,0X7D7C);
  39. LCD_DrawLine(60,81,80,81,0X7D7C);
  40. LCD_DrawLine(60,82,80,82,0X7D7C);
  41. printf("4. CWJAP\r\n");
  42. HAL_UART_Transmit(&UART3_Handler,aee,strlen(aee),100); //发送数据
  43. // while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
  44. delay_ms(2000);
  45. LCD_DrawLine(80,80,100,80,0X7D7C);
  46. LCD_DrawLine(80,81,100,81,0X7D7C);
  47. LCD_DrawLine(80,82,100,82,0X7D7C);
  48. printf( "5. MQTTUSERCFG\r\n");
  49. HAL_UART_Transmit(&UART3_Handler,aff,strlen(aff),100); //发送数据
  50. // while(ESP8266_SendCmd(ESP8266_USERCFG_INFO, "OK"))
  51. delay_ms(2000);
  52. LCD_DrawLine(100,80,120,80,0X7D7C);
  53. LCD_DrawLine(100,81,120,81,0X7D7C);
  54. LCD_DrawLine(100,82,120,82,0X7D7C);
  55. printf( "6. MQTTCONN\r\n");
  56. HAL_UART_Transmit(&UART3_Handler,agg,strlen(agg),100); //发送数据
  57. // while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "OK"))
  58. delay_ms(2000);
  59. LCD_DrawLine(120,80,144,80,0X7D7C);
  60. LCD_DrawLine(120,81,144,81,0X7D7C);
  61. LCD_DrawLine(120,82,144,82,0X7D7C);
  62. printf("7. ESP8266 Init OK\r\n");
  63. LCD_ShowString(8,64,"Init success!",0x00,0xffff,16,0);
  64. delay_ms(500);
  65. }
  1. //==========================================================
  2. // 函数名称: ESP8266_SendData
  3. //
  4. // 函数功能: 发送数据
  5. //
  6. // 入口参数: temp:角度
  7. // humi:角度2
  8. // adcx:角度3
  9. //
  10. // 返回参数: 无
  11. //
  12. // 说明:
  13. //==========================================================
  14. void ESP8266_SendData(double angle,double angle_2,double angle_3)
  15. {
  16. char cmdBuf[512];
  17. ESP8266_Clear(); //清空接收缓存
  18. //先发送要发送数据的指令做准备
  19. sprintf(cmdBuf, "AT+MQTTPUB=0,\"%s\",\"{\\\"id\\\":\\\"123\\\"\\,\\\"params\\\":{\\\"angle\\\":{\\\"value\\\":%f\}\\,\\\"angle_2\\\":{\\\"value\\\":%f\}\\,\\\"angle_3\\\":{\\\"value\\\":%f\}}}\",0,0\r\n",pubtopic,angle,angle_2,angle_3); //发送命令
  20. HAL_UART_Transmit(&UART3_Handler,cmdBuf,strlen(cmdBuf),100); //发送数据
  21. //while(ESP8266_SendCmd(cmdBuf, "OK"))
  22. delay_ms(50);
  23. memset(cmdBuf,0,sizeof(cmdBuf));
  24. }

上面是发送数据的函数参考格式修改对应的id号和数据内容即可

下面这里补上接收指令回传ok的函数可以自行参考修改

  1. //==========================================================
  2. // 函数名称: ESP8266_SendCmd
  3. //
  4. // 函数功能: 发送命令
  5. //
  6. // 入口参数: cmd:命令
  7. // res:需要检查的返回指令
  8. //
  9. // 返回参数: 0-成功 1-失败
  10. //
  11. // 说明:
  12. //==========================================================
  13. _Bool ESP8266_SendCmd(char *cmd, char *res)
  14. {
  15. unsigned char timeOut = 200;
  16. //Usart_SendString((unsigned char *)cmd, strlen((const char *)cmd));
  17. HAL_UART_Transmit(&UART3_Handler,(unsigned char *)cmd,strlen((const char *)cmd),100); //发送数据
  18. while(timeOut--)
  19. {
  20. if(ESP8266_WaitRecive() == REV_OK) //如果收到数据
  21. {
  22. if(strstr((const char *)esp8266_buf, res) != NULL) //如果检索到关键词
  23. {
  24. ESP8266_Clear(); //清空缓存
  25. return 0;
  26. }
  27. }
  28. delay_ms(10);
  29. }
  30. return 1;
  31. }


总结

介绍的比较粗略主要是代码贴出来比较多,可以自行参考修改,使用起来还是比较简单,如果对接入onenet的方式感兴趣可以去参考新onenet的接入方式和数据平台的相关教程。代码也有很多可以修改的地方自行参考修改即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/470135
推荐阅读
相关标签
  

闽ICP备14008679号