bsp_esp8266.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. /* 包含头文件 ----------------------------------------------------------------*/
  2. #include "bsp_esp8266.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdbool.h>
  6. #include <stdarg.h>
  7. #include "main.h"
  8. extern UART_HandleTypeDef wifi_UartHandle;
  9. /* 私有类型定义 --------------------------------------------------------------*/
  10. /* 私有宏定义 ----------------------------------------------------------------*/
  11. /* 私有变量 ------------------------------------------------------------------*/
  12. UART_HandleTypeDef husartx_esp8266;
  13. extern UART_HandleTypeDef huart3;
  14. STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 };
  15. uint8_t esp8266_rxdata;
  16. /* 扩展变量 ------------------------------------------------------------------*/
  17. /* 私有函数原形 --------------------------------------------------------------*/
  18. static char * itoadata( int value, char * string, int radix );
  19. /* 函数体 --------------------------------------------------------------------*/
  20. /**
  21. * 函数功能: 初始化ESP8266用到的GPIO引脚
  22. * 输入参数: 无
  23. * 返 回 值: 无
  24. * 说 明:无
  25. */
  26. static void ESP8266_GPIO_Config ( void )
  27. {
  28. GPIO_InitTypeDef GPIO_InitStruct;
  29. ESP8266_RST_GPIO_ClK_ENABLE();
  30. ESP8266_USARTx_GPIO_ClK_ENABLE();
  31. // /* 串口外设功能GPIO配置 */
  32. // GPIO_InitStruct.Pin = ESP8266_USARTx_Tx_PIN;
  33. // GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  34. // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  35. // HAL_GPIO_Init(ESP8266_USARTx_Port, &GPIO_InitStruct);
  36. // GPIO_InitStruct.Pin = ESP8266_USARTx_Rx_PIN;
  37. // GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  38. // GPIO_InitStruct.Pull = GPIO_NOPULL;
  39. // HAL_GPIO_Init(ESP8266_USARTx_Port, &GPIO_InitStruct);
  40. HAL_GPIO_WritePin(ESP8266_RST_PORT,ESP8266_RST_PIN,GPIO_PIN_RESET);
  41. GPIO_InitStruct.Pin = ESP8266_RST_PIN;
  42. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  43. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  44. HAL_GPIO_Init(ESP8266_RST_PORT, &GPIO_InitStruct);
  45. }
  46. /**
  47. * 函数功能: 初始化ESP8266用到的 USART
  48. * 输入参数: 无
  49. * 返 回 值: 无
  50. * 说 明:无
  51. */
  52. static void ESP8266_USART_Config ( void )
  53. {
  54. /* 串口外设时钟使能 */
  55. ESP8266_USART_RCC_CLK_ENABLE();
  56. __HAL_RCC_USART3_CLK_ENABLE();
  57. ESP8266_GPIO_Config();
  58. husartx_esp8266.Instance = ESP8266_USARTx;
  59. husartx_esp8266.Init.BaudRate = ESP8266_USARTx_BAUDRATE;
  60. husartx_esp8266.Init.WordLength = UART_WORDLENGTH_8B;
  61. husartx_esp8266.Init.StopBits = UART_STOPBITS_1;
  62. husartx_esp8266.Init.Parity = UART_PARITY_NONE;
  63. husartx_esp8266.Init.Mode = UART_MODE_TX_RX;
  64. husartx_esp8266.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  65. husartx_esp8266.Init.OverSampling = UART_OVERSAMPLING_16;
  66. HAL_UART_Init(&husartx_esp8266);
  67. /* USART1_IRQn interrupt configuration */
  68. HAL_NVIC_SetPriority(ESP8266_USARTx_IRQn, 1, 0);
  69. HAL_NVIC_EnableIRQ(ESP8266_USARTx_IRQn);
  70. /* 使能接收,进入中断回调函数 */
  71. HAL_UART_Receive_IT(&huart3,&esp8266_rxdata,1);
  72. }
  73. /**
  74. * 函数功能: 格式化输出,类似于C库中的printf,但这里没有用到C库
  75. * 输入参数: USARTx 串口通道,这里只用到了串口2,即USART2
  76. * Data 要发送到串口的内容的指针
  77. * ... 其他参数
  78. * 返 回 值: 无
  79. * 说 明:典型应用 USART2_printf( USART2, "\r\n this is a demo \r\n" );
  80. * USART2_printf( USART2, "\r\n %d \r\n", i );
  81. * USART2_printf( USART2, "\r\n %s \r\n", j );
  82. */
  83. void USART_printf(USART_TypeDef * USARTx, char * Data, ... )
  84. {
  85. const char *s;
  86. int d;
  87. char buf[16];
  88. uint8_t txdata;
  89. va_list ap;
  90. va_start(ap, Data);
  91. while ( * Data != 0 ) // 判断是否到达字符串结束符
  92. {
  93. if ( * Data == 0x5c ) //'\'
  94. {
  95. switch ( *++Data )
  96. {
  97. case 'r': //回车符
  98. txdata=0x0d;
  99. HAL_UART_Transmit(&wifi_UartHandle,&txdata,1,1000);
  100. Data ++;
  101. break;
  102. case 'n': //换行符
  103. txdata=0x0a;
  104. HAL_UART_Transmit(&wifi_UartHandle,&txdata,1,1000);
  105. Data ++;
  106. break;
  107. default:
  108. Data ++;
  109. break;
  110. }
  111. }
  112. else if ( * Data == '%')
  113. { //
  114. switch ( *++Data )
  115. {
  116. case 's': //字符串
  117. s = va_arg(ap, const char *);
  118. for ( ; *s; s++)
  119. {
  120. HAL_UART_Transmit(&wifi_UartHandle,(uint8_t *)s,1,1000);
  121. while(__HAL_UART_GET_FLAG(&wifi_UartHandle,UART_FLAG_TXE)==0);
  122. }
  123. Data++;
  124. break;
  125. case 'd':
  126. //十进制
  127. d = va_arg(ap, int);
  128. itoadata(d, buf, 10);
  129. for (s = buf; *s; s++)
  130. {
  131. HAL_UART_Transmit(&wifi_UartHandle,(uint8_t *)s,1,1000);
  132. while(__HAL_UART_GET_FLAG(&wifi_UartHandle,UART_FLAG_TXE)==0);
  133. }
  134. Data++;
  135. break;
  136. default:
  137. Data++;
  138. break;
  139. }
  140. }
  141. else
  142. {
  143. HAL_UART_Transmit(&wifi_UartHandle,(uint8_t *)Data,1,1000);
  144. Data++;
  145. while(__HAL_UART_GET_FLAG(&wifi_UartHandle,UART_FLAG_TXE)==0);
  146. }
  147. }
  148. }
  149. /**
  150. * 函数功能: 将整形数据转换成字符串
  151. * 输入参数: radix =10 表示10进制,其他结果为0
  152. * value 要转换的整形数
  153. * buf 转换后的字符串
  154. * radix = 10
  155. * 返 回 值: 无
  156. * 说 明:被USART_printf()调用
  157. */
  158. static char * itoadata( int value, char *string, int radix )
  159. {
  160. int i, d;
  161. int flag = 0;
  162. char *ptr = string;
  163. /* This implementation only works for decimal numbers. */
  164. if (radix != 10)
  165. {
  166. *ptr = 0;
  167. return string;
  168. }
  169. if (!value)
  170. {
  171. *ptr++ = 0x30;
  172. *ptr = 0;
  173. return string;
  174. }
  175. /* if this is a negative value insert the minus sign. */
  176. if (value < 0)
  177. {
  178. *ptr++ = '-';
  179. /* Make the value positive. */
  180. value *= -1;
  181. }
  182. for (i = 10000; i > 0; i /= 10)
  183. {
  184. d = value / i;
  185. if (d || flag)
  186. {
  187. *ptr++ = (char)(d + 0x30);
  188. value -= (d * i);
  189. flag = 1;
  190. }
  191. }
  192. /* Null terminate the string. */
  193. *ptr = 0;
  194. return string;
  195. } /* NCL_Itoa */
  196. /**
  197. * 函数功能: ESP8266初始化函数
  198. * 输入参数: 无
  199. * 返 回 值: 无
  200. * 说 明:无
  201. */
  202. void ESP8266_Init ( void )
  203. {
  204. // ESP8266_GPIO_Config ();
  205. ESP8266_USART_Config ();
  206. }
  207. /**
  208. * 函数功能: 停止使用ESP8266
  209. * 输入参数: 无
  210. * 返 回 值: 无
  211. * 说 明:无
  212. */
  213. void ESP8266_stop( void )
  214. {
  215. ESP8266_RST_LOW();
  216. HAL_NVIC_DisableIRQ(ESP8266_USARTx_IRQn);
  217. ESP8266_USART_RCC_CLK_DISABLE();
  218. }
  219. /**
  220. * 函数功能: 重启ESP8266模块
  221. * 输入参数: 无
  222. * 返 回 值: 无
  223. * 说 明:被ESP8266_AT_Test调用
  224. */
  225. void ESP8266_Rst ( void )
  226. {
  227. #if 0
  228. ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );
  229. #else
  230. ESP8266_RST_LOW();
  231. HAL_Delay( 500 );
  232. ESP8266_RST_HIGH();
  233. #endif
  234. }
  235. /**
  236. * 函数功能: 对ESP8266模块发送AT指令
  237. * 输入参数: cmd,待发送的指令
  238. * reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系
  239. * waittime,等待响应的时间
  240. * 返 回 值: 1,指令发送成功
  241. * 0,指令发送失败
  242. * 说 明:无
  243. */
  244. bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, uint32_t waittime )
  245. {
  246. strEsp8266_Fram_Record .InfBit .FramLength = 0; //从新开始接收新的数据包
  247. ESP8266_Usart ( "%s\r\n", cmd );
  248. if ( ( reply1 == 0 ) && ( reply2 == 0 ) ) //不需要接收数据
  249. return true;
  250. HAL_Delay( waittime ); //延时
  251. strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
  252. // PC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );
  253. // printf("%s->%s\n",cmd,strEsp8266_Fram_Record .Data_RX_BUF);
  254. if ( ( reply1 != 0 ) && ( reply2 != 0 ) )
  255. return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) ||
  256. ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
  257. else if ( reply1 != 0 )
  258. return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );
  259. else
  260. return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
  261. }
  262. /**
  263. * 函数功能: 对ESP8266模块进行AT测试启动
  264. * 输入参数: 无
  265. * 返 回 值: 1,选择成功
  266. * 0,选择失败
  267. * 说 明:无
  268. */
  269. bool ESP8266_AT_Test ( void )
  270. {
  271. char count=0;
  272. ESP8266_RST_HIGH();
  273. HAL_Delay(1000 );
  274. while(count<10)
  275. {
  276. if(ESP8266_Cmd("AT","OK",NULL,1000)) return 1;
  277. ESP8266_Rst();
  278. HAL_Delay(1000);
  279. ++count;
  280. }
  281. return 0;
  282. }
  283. /**
  284. * 函数功能: 选择ESP8266模块的工作模式
  285. * 输入参数: enumMode,工作模式
  286. * 返 回 值: 1,选择成功
  287. * 0,选择失败
  288. * 说 明:无
  289. */
  290. bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
  291. {
  292. bool result=0;
  293. char count=0;
  294. while(count<10)
  295. {
  296. switch ( enumMode )
  297. {
  298. case STA:
  299. result=ESP8266_Cmd ( "AT+CWMODE=1", "OK", NULL, 2500 );
  300. break;
  301. case AP:
  302. result=ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 );
  303. break;
  304. case STA_AP:
  305. result=ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 );
  306. break;
  307. default:
  308. result=false;
  309. break;
  310. }
  311. if(result) return result;
  312. ++count;
  313. }
  314. return 0;
  315. }
  316. /**
  317. * 函数功能: ESP8266模块连接外部WiFi
  318. * 输入参数: pSSID,WiFi名称字符串
  319. * pPassWord,WiFi密码字符串
  320. * 返 回 值: 1,连接成功
  321. * 0,连接失败
  322. * 说 明:无
  323. */
  324. bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
  325. {
  326. char cCmd [120];
  327. char count=0;
  328. sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
  329. while(count<10)
  330. {
  331. if(ESP8266_Cmd(cCmd,"OK",NULL,5000))return 1;
  332. ++count;
  333. }
  334. return 0;
  335. }
  336. /**
  337. * 函数功能: ESP8266模块创建WiFi热点
  338. * 输入参数: pSSID,WiFi名称字符串
  339. * pPassWord,WiFi密码字符串
  340. * enunPsdMode,WiFi加密方式代号字符串
  341. * 返 回 值: 1,创建成功
  342. * 0,创建失败
  343. * 说 明:无
  344. */
  345. bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode )
  346. {
  347. char cCmd [120];
  348. char count=0;
  349. sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode );
  350. while(count<10)
  351. {
  352. if(ESP8266_Cmd(cCmd,"OK",0,1000))return 1;
  353. ++count;
  354. }
  355. return 0;
  356. }
  357. /**
  358. * 函数功能: ESP8266模块启动多连接
  359. * 输入参数: enumEnUnvarnishTx,配置是否多连接
  360. * 返 回 值: 1,配置成功
  361. * 0,配置失败
  362. * 说 明:无
  363. */
  364. bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx )
  365. {
  366. char cStr [20];
  367. char count=0;
  368. sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );
  369. while(count<10)
  370. {
  371. if(ESP8266_Cmd(cStr,"OK",0,500))return 1;
  372. ++count;
  373. }
  374. return 0;
  375. }
  376. /**
  377. * 函数功能: ESP8266模块连接外部服务器
  378. * 输入参数: enumE,网络协议
  379. * ip,服务器IP字符串
  380. * ComNum,服务器端口字符串
  381. * id,模块连接服务器的ID
  382. * 返 回 值: 1,连接成功
  383. * 0,连接失败
  384. * 说 明:无
  385. */
  386. bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
  387. {
  388. char cStr [100] = {0}, cCmd [120];
  389. switch (enumE)
  390. {
  391. case enumTCP:
  392. sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );
  393. break;
  394. case enumUDP:
  395. sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );
  396. break;
  397. default:
  398. break;
  399. }
  400. if ( id < 5 )
  401. sprintf ( cCmd,"AT+CIPSTART=%d,%s",id,cStr);
  402. else
  403. sprintf ( cCmd,"AT+CIPSTART=%s",cStr );
  404. return ESP8266_Cmd ( cCmd, "OK", NULL, 4000 );
  405. }
  406. /**
  407. * 函数功能: ESP8266模块开启或关闭服务器模式
  408. * 输入参数: enumMode,开启/关闭
  409. * pPortNum,服务器端口号字符串
  410. * pTimeOver,服务器超时时间字符串,单位:秒
  411. * 返 回 值: 1,操作成功
  412. * 0,操作失败
  413. * 说 明:无
  414. */
  415. bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver )
  416. {
  417. char cCmd1 [120], cCmd2 [120];
  418. if ( enumMode )
  419. {
  420. sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );
  421. sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver );
  422. return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) &&
  423. ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) );
  424. }
  425. else
  426. {
  427. sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum );
  428. return ESP8266_Cmd ( cCmd1, "OK", 0, 500 );
  429. }
  430. }
  431. /**
  432. * 函数功能: 获取ESP8266 的连接状态,较适合单端口时使用
  433. * 输入参数: 无
  434. * 返 回 值: 2,获得ip
  435. * 3,建立连接
  436. * 4,失去连接
  437. * 0,获取状态失败
  438. * 说 明:无
  439. */
  440. uint8_t ESP8266_Get_LinkStatus ( void )
  441. {
  442. if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", NULL, 1000 ) )
  443. {
  444. if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2\r\n" ) )
  445. return 2;
  446. else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3\r\n" ) )
  447. return 3;
  448. else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4\r\n" ) )
  449. return 4;
  450. else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:5\r\n" ) )
  451. return 5;
  452. }
  453. return 0;
  454. }
  455. /**
  456. * 函数功能: 获取ESP8266 的端口(Id)连接状态,较适合多端口时使用
  457. * 输入参数: 无
  458. * 返 回 值: 端口(Id)的连接状态,低5位为有效位,分别对应Id5~0,某位若置1表该Id建立了连接,若被清0表该Id未建立连接
  459. * 说 明:无
  460. */
  461. uint8_t ESP8266_Get_IdLinkStatus ( void )
  462. {
  463. uint8_t ucIdLinkStatus = 0x00;
  464. if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) )
  465. {
  466. if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) )
  467. ucIdLinkStatus |= 0x01;
  468. else
  469. ucIdLinkStatus &= ~ 0x01;
  470. if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) )
  471. ucIdLinkStatus |= 0x02;
  472. else
  473. ucIdLinkStatus &= ~ 0x02;
  474. if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) )
  475. ucIdLinkStatus |= 0x04;
  476. else
  477. ucIdLinkStatus &= ~ 0x04;
  478. if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) )
  479. ucIdLinkStatus |= 0x08;
  480. else
  481. ucIdLinkStatus &= ~ 0x08;
  482. if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) )
  483. ucIdLinkStatus |= 0x10;
  484. else
  485. ucIdLinkStatus &= ~ 0x10;
  486. }
  487. return ucIdLinkStatus;
  488. }
  489. /**
  490. * 函数功能: 获取ESP8266 的 AP IP
  491. * 输入参数: pApIp,存放 AP IP 的数组的首地址
  492. * ucArrayLength,存放 AP IP 的数组的长度
  493. * 返 回 值: 1,获取成功
  494. * 0,获取失败
  495. * 说 明:无
  496. */
  497. uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength )
  498. {
  499. char uc;
  500. char * pCh;
  501. ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 );
  502. pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,\"" );
  503. if ( pCh )
  504. pCh += 6;
  505. else
  506. return 0;
  507. for ( uc = 0; uc < ucArrayLength; uc ++ )
  508. {
  509. pApIp [ uc ] = * ( pCh + uc);
  510. if ( pApIp [ uc ] == '\"' )
  511. {
  512. pApIp [ uc ] = '\0';
  513. break;
  514. }
  515. }
  516. return 1;
  517. }
  518. /**
  519. * 函数功能: 配置ESP8266模块进入透传发送
  520. * 输入参数: 无
  521. * 返 回 值: 1,配置成功
  522. * 0,配置失败
  523. * 说 明:无
  524. */
  525. bool ESP8266_UnvarnishSend ( void )
  526. {
  527. if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 1000 ) )
  528. return false;
  529. return ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 1000 );
  530. }
  531. /**
  532. * 函数功能: 配置ESP8266模块退出透传模式
  533. * 输入参数: 无
  534. * 返 回 值: 无
  535. * 说 明:无
  536. */
  537. void ESP8266_ExitUnvarnishSend ( void )
  538. {
  539. HAL_Delay(1000);
  540. ESP8266_Usart("+++");
  541. HAL_Delay(500);
  542. }
  543. /**
  544. * 函数功能: ESP8266模块发送字符串
  545. * 输入参数: enumEnUnvarnishTx,声明是否已使能了透传模式
  546. * pStr,要发送的字符串
  547. * ucId,哪个ID发送的字符串
  548. * ulStrLength,要发送的字符串的字节数
  549. * 返 回 值: 1,发送成功
  550. * 0,发送失败
  551. * 说 明:无
  552. */
  553. bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, uint32_t ulStrLength, ENUM_ID_NO_TypeDef ucId )
  554. {
  555. char cStr [20];
  556. bool bRet = false;
  557. if ( enumEnUnvarnishTx )
  558. {
  559. ESP8266_Usart ( "%s", pStr );
  560. bRet = true;
  561. }
  562. else
  563. {
  564. if ( ucId < 5 )
  565. sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );
  566. else
  567. sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );
  568. ESP8266_Cmd ( cStr, NULL ,0, 1000 );
  569. bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 );
  570. }
  571. return bRet;
  572. }
  573. /**
  574. * 函数功能: ESP8266模块接收字符串
  575. * 输入参数: enumEnUnvarnishTx,声明是否已使能了透传模式
  576. * 返 回 值: 接收到的字符串首地址
  577. * 说 明:无
  578. */
  579. char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
  580. {
  581. char * pRecStr = 0;
  582. strEsp8266_Fram_Record .InfBit .FramLength = 0;
  583. strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;
  584. while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );
  585. strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
  586. if ( enumEnUnvarnishTx )
  587. pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
  588. else
  589. {
  590. if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
  591. pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
  592. }
  593. return pRecStr;
  594. }
  595. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/