ESP8266.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #include "main.h"
  2. //#include "stm32f10x.h"
  3. //#include "ESP8266.h"
  4. //#include "delay.h"
  5. //#include "usart.h"
  6. //#include <string.h>
  7. //#include <stdio.h>
  8. #define ESP8266_GPIO_PORT GPIOA /* GPIO端口 */
  9. #define ESP8266_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
  10. #define ESP8266_GPIO_PIN GPIO_Pin_1 /* 连接到SCL时钟线的GPIO */
  11. #define ESP8266_UART USART2 /* 串口号 */
  12. // WIFI信息配置
  13. #define ESP8266_WIFI_INFO "AT+CWJAP=\"MNIAS\",\"0123456789\"\r\n"
  14. // TCP信息配置 默认不更改
  15. #define ESP8266_ONENET_INFO "AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002\r\n"
  16. unsigned char ESP8266_buf[128];
  17. unsigned short ESP8266_cnt = 0, ESP8266_cntPre = 0;
  18. /**
  19. * @brief OneNET使用串口的串口中断函数
  20. * @param None
  21. * @retval None
  22. */
  23. void USART2_IRQHandler(void)
  24. {
  25. if(USART_GetITStatus(ESP8266_UART, USART_IT_RXNE) != RESET)
  26. {
  27. if(ESP8266_cnt >= sizeof(ESP8266_buf)) ESP8266_cnt = 0; //防止串口被刷爆
  28. ESP8266_buf[ESP8266_cnt++] = ESP8266_UART->DR;
  29. USART_ClearFlag(ESP8266_UART, USART_FLAG_RXNE);
  30. }
  31. }
  32. /**
  33. * @brief ESP8266初始化
  34. * @param None
  35. * @retval None
  36. */
  37. void ESP8266_Init(void)
  38. {
  39. GPIO_InitTypeDef GPIO_Initure;
  40. RCC_APB2PeriphClockCmd(ESP8266_GPIO_CLK, ENABLE);
  41. // ESP8266复位引脚
  42. GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
  43. GPIO_Initure.GPIO_Pin = ESP8266_GPIO_PIN;
  44. GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
  45. GPIO_Init(ESP8266_GPIO_PORT, &GPIO_Initure);
  46. GPIO_WriteBit(ESP8266_GPIO_PORT, ESP8266_GPIO_PIN, Bit_RESET);
  47. DELAYClass.DelayMs(250);
  48. GPIO_WriteBit(ESP8266_GPIO_PORT, ESP8266_GPIO_PIN, Bit_SET);
  49. DELAYClass.DelayMs(500);
  50. ESP8266_Clear();
  51. #ifdef DEBUG_printf
  52. printf("1. AT\r\n");
  53. #endif
  54. while(ESP8266_SendCmd("AT\r\n", "OK")) DELAYClass.DelayMs(500);
  55. #ifdef DEBUG_printf
  56. printf("2. CWMODE\r\n");
  57. #endif
  58. while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK")) DELAYClass.DelayMs(500);
  59. // printf( "3.AT+CWSTARTSMART=3\r\n");//支持ESP-Touch和Airkiss智能配网
  60. // while(ESP8266_SendCmd("AT+CWSTARTSMART=3\r\n", "GOT IP")) DELAYClass.DelayMs(500);
  61. #ifdef DEBUG_printf
  62. printf("4. AT+CWDHCP\r\n");
  63. #endif
  64. while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK")) DELAYClass.DelayMs(500);
  65. #ifdef DEBUG_printf
  66. printf("5. CWJAP\r\n");
  67. #endif
  68. while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP")) DELAYClass.DelayMs(500);
  69. #ifdef DEBUG_printf
  70. printf("6. CIPSTART\r\n");
  71. #endif
  72. while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")) DELAYClass.DelayMs(500);
  73. #ifdef DEBUG_printf
  74. printf("7. ESP8266 Init OK\r\n");
  75. #endif
  76. }
  77. /**
  78. * @brief 清空WIFI串口缓存区
  79. * @param None
  80. * @retval None
  81. */
  82. void ESP8266_Clear(void)
  83. {
  84. memset(ESP8266_buf, 0, sizeof(ESP8266_buf));
  85. ESP8266_cnt = 0;
  86. }
  87. /**
  88. * @brief 等待接收完成
  89. * @param None
  90. * @retval REV_OK-接收完成 REV_WAIT-接收超时未完成
  91. * @note 循坏调用检测是否接收完成
  92. */
  93. _Bool ESP8266_WaitRecive(void)
  94. {
  95. if(ESP8266_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
  96. return REV_WAIT;
  97. if(ESP8266_cnt == ESP8266_cntPre) //如果上一次的值和这次相同,则说明接收完毕
  98. {
  99. ESP8266_cnt = 0; //清0接收计数
  100. return REV_OK; //返回接收完成标志
  101. }
  102. ESP8266_cntPre = ESP8266_cnt; //置为相同
  103. return REV_WAIT; //返回接收未完成标志
  104. }
  105. /**
  106. * @brief 向WIFI串口发送命令
  107. * @param cmd:命令字符串
  108. * @param res:期待返回的内容
  109. * @retval 0-成功 1-失败
  110. * @note None
  111. */
  112. _Bool ESP8266_SendCmd(char *cmd, char *res)
  113. {
  114. unsigned char timeOut = 200;
  115. USARTClass.USART_SendString1(ESP8266_UART, (unsigned char *)cmd, strlen((const char *)cmd));
  116. while(timeOut--)
  117. {
  118. // 如果收到数据
  119. if(ESP8266_WaitRecive() == REV_OK)
  120. {
  121. // 如果检索到关键词
  122. if(strstr((const char *)ESP8266_buf, res) != NULL)
  123. {
  124. ESP8266_Clear(); // 清空缓存
  125. return 0;
  126. }
  127. }
  128. DELAYClass.DelayMs(10);
  129. }
  130. return 1;
  131. }
  132. /**
  133. * @brief 向WIFI串口TCP发送数据
  134. * @param data:数据字符串
  135. * @param len:长度
  136. * @retval None
  137. * @note None
  138. */
  139. void ESP8266_SendData(unsigned char *data, unsigned short len)
  140. {
  141. char cmdBuf[32];
  142. ESP8266_Clear(); //清空接收缓存
  143. sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len); //发送命令
  144. if(!ESP8266_SendCmd(cmdBuf, ">")) //收到‘>’时可以发送数据
  145. {
  146. USARTClass.USART_SendString1(ESP8266_UART, data, len); //发送设备连接请求数据
  147. }
  148. }
  149. /**
  150. * @brief 获取平台返回的数据
  151. * @param timeOut:等待的时间(乘以10ms)
  152. * @retval 平台返回的原始数据
  153. * @note 不同网络设备返回的格式不同,需要去调试如ESP8266的返回格式为 "+IPD,x:yyy" x代表数据长度,yyy是数据内容
  154. */
  155. unsigned char *ESP8266_GetIPD(unsigned short timeOut)
  156. {
  157. char *ptrIPD = NULL;
  158. do
  159. {
  160. if(ESP8266_WaitRecive() == REV_OK) //如果接收完成
  161. {
  162. ptrIPD = strstr((char *)ESP8266_buf, "IPD,"); //搜索“IPD”头
  163. if(ptrIPD == NULL) //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间
  164. {
  165. //printf( "\"IPD\" not found\r\n");
  166. }
  167. else
  168. {
  169. ptrIPD = strchr(ptrIPD, ':'); //找到':'
  170. if(ptrIPD != NULL)
  171. {
  172. ptrIPD++;
  173. return (unsigned char *)(ptrIPD);
  174. }
  175. else
  176. {
  177. return NULL;
  178. }
  179. }
  180. }
  181. DELAYClass.DelayMs(5); //延时等待
  182. } while(timeOut--);
  183. return NULL; //超时还未找到,返回空指针
  184. }