ESP32_WROOM_32D.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946
  1. #include "ESP32_WROOM_32D.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <stdarg.h>
  6. extern int Flag3S;
  7. #define g_uMsgCmdFrameLen (6)
  8. extern uint8_t Devicenum;
  9. extern uint8_t g_wifi_rx_buf[WIFI_RX_BUF_SIZE];
  10. extern uint8_t g_wifi_rx_len;
  11. uint8_t wifi_tx_buf[WIFI_TX_BUF_SIZE];
  12. uint16_t wifi_tx_len;
  13. static int wifi_state = 0; //WiFi模块当前状态
  14. static int wifi_ack_delay = 0; //WiFi应答等待
  15. static int wifi_set_ssid = 0; //WiFi应答SSID设置
  16. uint32_t unlink_time = 0;
  17. extern uint32_t pc_link_timeout;
  18. uint32_t connectTcpFlag = 0;
  19. char TCP_IP_PORT[8] = {"8001"};
  20. char MAC_ADDR[20] = {0};
  21. uint32_t broadDevFlag = 0;
  22. extern uint8_t pc_channel_recv;
  23. static int resendtime = 0;
  24. uint16_t WriteComm2(char *data, uint16_t len)
  25. {
  26. //return UART_Write(UART2, data, len);
  27. HAL_UART_Transmit_DMA((UART_HandleTypeDef *)sysinf.ESPUart,(const uint8_t *)data, len);
  28. return 0;
  29. }
  30. /*WIFI单次发送指令*/
  31. void ESP32_Send_AT_Cmd(char *cmd,uint32_t time)
  32. {
  33. char buff[100] = {0};
  34. strcpy(buff, cmd);
  35. strcat(buff, "\r\n");
  36. Van_Device_Printf(VAN_LOG_NOTICE,"\nW--> %s", buff);
  37. WriteComm2(buff, strlen(buff));
  38. wifi_ack_delay = time;
  39. }
  40. void ESP32_AT(void)
  41. {
  42. ESP32_Send_AT_Cmd("AT",5000);
  43. }
  44. /*恢复出厂设置*/
  45. void ESP32_AT_Restore(void)
  46. {
  47. ESP32_Send_AT_Cmd("AT+RESTORE",500);
  48. }
  49. /*复位*/
  50. void ESP32_AT_RST(void)
  51. {
  52. ESP32_Send_AT_Cmd("AT+RST",8000);
  53. }
  54. /*上电自动连接AP*/
  55. void ESP32_AT_AUTOCONN(void)
  56. {
  57. ESP32_Send_AT_Cmd("AT+CWAUTOCONN=0",5000);
  58. }
  59. /*WIFI AP/STA/AP+STA模式选择*/
  60. void ESP32_Net_Mode_Choose(ENUM_Net_ModeTypeDef enumMode)
  61. {
  62. switch ( enumMode )
  63. {
  64. case STA:
  65. ESP32_Send_AT_Cmd ( "AT+CWMODE=1", 5000 );
  66. break;
  67. case AP:
  68. ESP32_Send_AT_Cmd ( "AT+CWMODE=2", 5000 );
  69. break;
  70. case STA_AP:
  71. ESP32_Send_AT_Cmd ( "AT+CWMODE=3", 5000 );
  72. break;
  73. default:
  74. break;
  75. }
  76. }
  77. /*WIFI加入AP*/
  78. void ESP32_JoinAP( char * pSSID, char * pPassWord, char * pMacAddr)
  79. {
  80. char cCmd [80];
  81. my_sprintf ( cCmd, sizeof(cCmd), "AT+CWJAP=\"%s\",\"%s\",\"%s\"", pSSID, pPassWord,pMacAddr);
  82. ESP32_Send_AT_Cmd( cCmd,5000 );
  83. }
  84. /*WIFI建立AP*/
  85. void ESP32_SetupAP( char * pSSID, char * pPassWord)
  86. {
  87. char cCmd [40];
  88. my_sprintf ( cCmd,sizeof(cCmd), "AT+CWSAP=\"%s\",\"%s\"", pSSID, pPassWord );
  89. ESP32_Send_AT_Cmd( cCmd, 5000 );
  90. }
  91. /*WIFI查询IP*/
  92. void ESP32_GetIp(void)
  93. {
  94. ESP32_Send_AT_Cmd( "AT+CIPSTA?", 5000 );
  95. }
  96. /*WIFI禁止自动连接*/
  97. void ESP32_DisAutoLink(void)
  98. {
  99. ESP32_Send_AT_Cmd( "AT+CWAUTOCONN=0", 5000 );
  100. }
  101. void ESP32_CWLAP(char * pSSID)
  102. {
  103. char cCmd [80];
  104. my_sprintf ( cCmd, sizeof(cCmd), "AT+CWLAP=\"%s\"", pSSID);
  105. ESP32_Send_AT_Cmd( cCmd, 5000 );
  106. }
  107. /*WIFI关闭回显*/
  108. void ESP32_EchoOff(void)
  109. {
  110. ESP32_Send_AT_Cmd( "ATE0", 5000 );
  111. }
  112. /*WIFI初始化*/
  113. void ESP32_Init(void)
  114. {
  115. ESP32_Send_AT_Cmd( "+++", 5000 );
  116. }
  117. /*WIFI 单/多连接*/
  118. void ESP32_Enable_MultipleId (uint8_t enumEnUnvarnishTx )
  119. {
  120. char cCmd [20];
  121. my_sprintf ( cCmd, sizeof(cCmd), "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );
  122. ESP32_Send_AT_Cmd ( cCmd, 5000 );
  123. }
  124. /*WIFI AP作为服务端开启或关闭,1---开启服务:0---关闭服务*/
  125. void ESP32_AP_Server (uint8_t open)
  126. {
  127. char cCmd [40];
  128. my_sprintf ( cCmd,sizeof(cCmd), "AT+CIPSERVER=%d", open);
  129. ESP32_Send_AT_Cmd( cCmd, 5000 );
  130. }
  131. /*WIFI STA选择TCP或UDP协议*/
  132. void ESP32_Link_Server(ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
  133. {
  134. char cStr [100] = { 0 }, cCmd [60];
  135. switch ( enumE )
  136. {
  137. case enumTCP:
  138. my_sprintf ( cStr, sizeof(cCmd), "\"%s\",\"%s\",%s,6", "TCP", ip, ComNum );
  139. break;
  140. case enumUDP:
  141. my_sprintf ( cStr,sizeof(cCmd), "\"%s\",\"%s\",%s,9090,0", "UDP", ip, ComNum );
  142. break;
  143. default:
  144. break;
  145. }
  146. if ( id < 5 )
  147. my_sprintf ( cCmd,sizeof(cCmd), "AT+CIPSTART=%d,%s", id, cStr);
  148. else
  149. my_sprintf ( cCmd, sizeof(cCmd), "AT+CIPSTART=%s", cStr );
  150. ESP32_Send_AT_Cmd ( cCmd,5000 );
  151. }
  152. /*WIFI透传*/
  153. void ESP32_UnvarnishSend ( void )
  154. {
  155. ESP32_Send_AT_Cmd( "AT+CIPMODE=1", 5000 );//设置透传模式
  156. }
  157. /*WIFI停止TCP*/
  158. void ESP32_STOPTCP ( ENUM_ID_NO_TypeDef id )
  159. {
  160. char cCmd [60];
  161. my_sprintf ( cCmd,sizeof(cCmd), "AT+CIPCLOSE=%d", id);
  162. ESP32_Send_AT_Cmd ( cCmd, 5000 );
  163. }
  164. /*退出透传*/
  165. void ESP32_ExitUnvarnishSend( void )
  166. {
  167. ESP32_Send_AT_Cmd("+++", 5000);
  168. }
  169. ///*设置默认波特率为460800*/
  170. //void ESP32_SET_BUAR(void)
  171. //{
  172. // ESP32_Send_AT_Cmd("AT+UART_DEF=460800,8,1,0,0","OK",NULL,500);
  173. //}
  174. /********************************************************************
  175. * int WIFI_Send_Data(uint8_t *data, uint8_t len, uint8_t flag)
  176. *
  177. *描述:通过WIFI发送数据,异步
  178. *参数:data:数据
  179. *参数:len:数据长度
  180. *参数:flag:1:立即发送,0:暂存
  181. *返回:无
  182. *其他:无
  183. *--------------------------------------------------------------------
  184. *记录:
  185. ********************************************************************/
  186. int WIFI_Send_Data(uint8_t *data, uint16_t len, uint8_t flag)
  187. {
  188. char cStr [40] = {0};
  189. if (wifi_state < WIFI_TRANS)
  190. return -1;
  191. if(wifi_ack_delay > 0)
  192. return -2;
  193. if(wifi_tx_len)
  194. return -3;
  195. if(len > WIFI_TX_BUF_SIZE){
  196. Van_Device_Printf(VAN_LOG_NOTICE,"WIFI_Send len:%d error ", len);
  197. return -1;
  198. }
  199. memcpy(&wifi_tx_buf[wifi_tx_len], data, len);
  200. wifi_tx_len += len;
  201. if(flag)
  202. {
  203. wifi_ack_delay = 3000;
  204. my_sprintf ( cStr, sizeof(cStr),"AT+CIPSEND=0,%d", wifi_tx_len );
  205. ESP32_Send_AT_Cmd ( cStr, 3000 );
  206. return wifi_tx_len;
  207. }
  208. return 0;
  209. }
  210. int WIFI_Send_MSG(uint8_t*msgHead,uint8_t *data, uint8_t * crc, uint16_t len)
  211. {
  212. char cStr [40] = {0};
  213. if (wifi_state != WIFI_TRANS)
  214. return -1;
  215. if(wifi_ack_delay > 0)
  216. return -2;
  217. if(wifi_tx_len > 0)
  218. return -3;
  219. memcpy(&wifi_tx_buf[0], msgHead, g_uMsgCmdFrameLen);
  220. memcpy(&wifi_tx_buf[g_uMsgCmdFrameLen], data, len);
  221. memcpy(&wifi_tx_buf[g_uMsgCmdFrameLen+len], crc, 2);
  222. wifi_tx_len = g_uMsgCmdFrameLen+len+2;
  223. wifi_ack_delay = 3000;
  224. my_sprintf ( cStr, sizeof(cStr),"AT+CIPSEND=0,%d", wifi_tx_len );
  225. ESP32_Send_AT_Cmd ( cStr, 3000 );
  226. return wifi_tx_len;
  227. }
  228. int WIFI_SendIlde(void){
  229. if(wifi_tx_len == 0)
  230. return 0;
  231. if (wifi_state < WIFI_TRANS)
  232. return 0;
  233. if(wifi_ack_delay > 0)
  234. return 0;
  235. return 1;
  236. }
  237. int WIFI_ReSend(void)
  238. {
  239. char cStr [40] = {0};
  240. if(wifi_tx_len == 0)
  241. return 0;
  242. if (wifi_state < WIFI_TRANS)
  243. return -1;
  244. if(wifi_ack_delay > 0)
  245. return -2;
  246. wifi_ack_delay = 3000;
  247. my_sprintf ( cStr, sizeof(cStr),"AT+CIPSEND=0,%d", wifi_tx_len );
  248. ESP32_Send_AT_Cmd ( cStr, 3000 );
  249. return 0;
  250. }
  251. //wifi修改SSID
  252. void WIFI_set_ssid(void)
  253. {
  254. wifi_ack_delay = 0;
  255. wifi_state = WIFI_POWEROFF;
  256. wifi_set_ssid = 1;
  257. if(wifi_tx_len > 0)
  258. {
  259. WriteComm2((char *)wifi_tx_buf, wifi_tx_len);
  260. wifi_tx_len = 0;
  261. }
  262. }
  263. //wifi修改SSID
  264. void WIFI_set_CloseConnect(void)
  265. {
  266. wifi_state = WIFI_CLOSE;
  267. }
  268. //在内存中查找字符串
  269. char* find_str(void *src, int size, char *str)
  270. {
  271. char *p = (char*)src;
  272. int len = strlen((const char *)str);
  273. if(len < 1)
  274. return p;
  275. for(int i = 0; i < size; i++)
  276. {
  277. if(p[i] == *str)
  278. {
  279. if( 0 == memcmp(&p[i], str, len))
  280. {
  281. return &p[i];
  282. }
  283. }
  284. }
  285. return NULL;
  286. }
  287. /********************************************************************
  288. * WIFI_recv_deal()
  289. *
  290. *描述:接收帧解析
  291. *参数:无
  292. *返回:无
  293. *其他:无
  294. *--------------------------------------------------------------------
  295. *记录:
  296. ********************************************************************/
  297. void WIFI_recv_deal(void)
  298. {
  299. char *p;
  300. int data_len = g_wifi_rx_len;
  301. int udp_data_len = 0;
  302. char* data = (char*)g_wifi_rx_buf;
  303. if(g_wifi_rx_len < 5)
  304. return;
  305. //判断是否接收完成
  306. if(wifi_state > WIFI_LISTEN)
  307. {
  308. if(data[data_len-1] != '\n' && data[data_len-2] != '\n')
  309. {
  310. return;
  311. }
  312. }
  313. switch (wifi_state)
  314. {
  315. //指令模式
  316. case WIFI_POWEROFF:
  317. case WIFI_ERROR:
  318. if(NULL != find_str(data, data_len , "ready") || NULL != find_str(data, data_len , "boot"))
  319. {
  320. wifi_state = WIFI_POWERON;
  321. wifi_ack_delay = 0;
  322. memset(wifi_tx_buf,0,sizeof(wifi_tx_buf));
  323. wifi_tx_len = 0;
  324. }
  325. break;
  326. case WIFI_POWERON:
  327. case WIFI_INIT:
  328. case WIFI_STATION:
  329. case WIFI_DISAUTO:
  330. case WIFI_LINK_AP:
  331. case WIFI_GET_IP:
  332. case WIFI_SETMUX:
  333. case WIFI_LISTEN:
  334. Van_Device_Printf(VAN_LOG_NOTICE,"\nW<-- %s", data);
  335. if(NULL != find_str(data, data_len , "OK\r\n"))
  336. {
  337. wifi_ack_delay = 0;
  338. if(WIFI_LISTEN == wifi_state){
  339. /*上电需要广播地址*/
  340. broadDevFlag = 1;
  341. sysinf.s10_flag = 1;
  342. if(sysinf.connectTcpFlag == 1){
  343. if(wifi_tx_len){
  344. char cStr [40] = {0};
  345. my_sprintf ( cStr,sizeof(cStr), "AT+CIPSEND=0,%d", wifi_tx_len );
  346. ESP32_Send_AT_Cmd ( cStr, 3000 );
  347. }
  348. sysinf.pc_link_timeout = 0;
  349. }
  350. }
  351. wifi_state++;
  352. resendtime = 0;
  353. }
  354. break;
  355. case WIFI_CWLAP:
  356. Van_Device_Printf(VAN_LOG_NOTICE,"\nW<-- %s", data);
  357. if((NULL != find_str(data, data_len , "OK\r\n")) ||
  358. (NULL != find_str(data, data_len , sysinf.wifiname)))
  359. {
  360. wifi_ack_delay = 0;
  361. /*char APname [70];
  362. my_sprintf ( APname, sizeof(APname), "\"%s\"", sysinf.wifiname);*/
  363. char* strStart = find_str(data, data_len ,sysinf.wifiname);
  364. if(NULL != strStart){
  365. strStart+=strlen(sysinf.wifiname);
  366. strStart = find_str(strStart, data_len ,",\"");
  367. strStart += 2;/*跳过,\*/
  368. memcpy(&MAC_ADDR[0], strStart, 17);
  369. MAC_ADDR[18] = 0;
  370. wifi_state++;
  371. }
  372. }
  373. break;
  374. //数据模式
  375. case WIFI_TRANS:
  376. //收到AT+CIPSEND回应,可发送数据
  377. if(NULL != find_str(data, data_len , "CLOSED"))
  378. {
  379. Van_Device_Printf(VAN_LOG_NOTICE,"\nW<-- %d %s", g_wifi_rx_len,data);
  380. wifi_state = WIFI_LISTEN;
  381. wifi_ack_delay = 0;//从发送写指令,到此才算发送完成
  382. broadDevFlag = 0;
  383. }
  384. else if ((NULL != find_str(data, data_len , "ERROR"))||
  385. (NULL != find_str(data, data_len , "SEND FAIL")))
  386. {
  387. if(resendtime < MAX_RESEND_TIME){
  388. char cStr [40] = {0};
  389. my_sprintf ( cStr,sizeof(cStr), "AT+CIPSEND=0,%d", wifi_tx_len );
  390. ESP32_Send_AT_Cmd ( cStr, 3000 );
  391. resendtime ++;
  392. }else{
  393. wifi_state = WIFI_POWEROFF;
  394. wifi_ack_delay = 0;
  395. }
  396. } else if(NULL != find_str(data, data_len , "SEND OK"))
  397. {
  398. //收到AT+CIPSEND回应,可发送数据
  399. Van_Device_Printf(VAN_LOG_NOTICE,"\nW--> SEND OK", wifi_tx_len);
  400. wifi_ack_delay = 0;//从发送写指令,到此才算发送完成
  401. wifi_tx_len = 0;
  402. resendtime = 0;
  403. wifi_tx_len = 0;
  404. memset(wifi_tx_buf, 0, sizeof(wifi_tx_buf));
  405. }
  406. else if(NULL != find_str(data, data_len , "OK\r\n"))
  407. {
  408. Van_Device_Printf(VAN_LOG_NOTICE,"\nW--> %d", wifi_tx_len);
  409. WriteComm2((char *)wifi_tx_buf, wifi_tx_len);
  410. wifi_ack_delay = 3000;
  411. }
  412. if(NULL != find_str(data, data_len , "DISCONNECT"))
  413. {
  414. Van_Device_Printf(VAN_LOG_NOTICE,"\nW--> %s", data);
  415. wifi_state = WIFI_POWEROFF;
  416. wifi_ack_delay = 0;
  417. }
  418. //收到PC数据
  419. p = find_str(data, data_len , "+IPD,0,");
  420. if(NULL != p)
  421. {
  422. Van_Device_Printf(VAN_LOG_NOTICE,"\nW<-- %d", g_wifi_rx_len);
  423. //计算数据长度(sscanf函数有问题!)
  424. p += sizeof("+IPD,0");
  425. udp_data_len = atoi(p);
  426. //数据
  427. p = strchr(p, ':') +1;
  428. if( p - data > data_len - udp_data_len) //未接收完成
  429. {
  430. p = find_str(data, data_len , "+IPD,0,");
  431. memset(data, 0 ,p - data);
  432. return;
  433. }
  434. // set_pc_chanel_recv(1);
  435. // b2b_recv_data(p, udp_data_len);
  436. }
  437. break;
  438. case WIFI_CLOSE:{
  439. if(NULL != find_str(data, data_len , "CLOSED\r\n"))
  440. {
  441. wifi_state = WIFI_LISTEN;
  442. wifi_ack_delay = 0;
  443. }
  444. }
  445. break;
  446. default:
  447. break;
  448. }
  449. wifi_receive_clear();
  450. }
  451. void WIFI_send_deal(void)
  452. {
  453. static uint8_t try_count = 0;
  454. static uint8_t try_con = 0;
  455. static uint32_t wifi_start_delay = 0;
  456. static uint8_t res_count = 0;
  457. uint8_t wifi_result = 0;
  458. //启动超时
  459. if(wifi_state < WIFI_LISTEN && wifi_start_delay++ > 120*10)
  460. {
  461. wifi_start_delay = 0;
  462. wifi_state = WIFI_POWEROFF;
  463. wifi_ack_delay = 0;
  464. }
  465. //等待模块应答
  466. if(wifi_ack_delay > 0)
  467. {
  468. wifi_ack_delay -= 100;
  469. return;
  470. }
  471. if(resendtime >= MAX_RESEND_TIME){
  472. wifi_state = WIFI_POWEROFF;
  473. }
  474. if((WIFI_TRANS != wifi_state )|| ((WIFI_TRANS == wifi_state)&& wifi_tx_len )){
  475. resendtime++;
  476. }
  477. switch (wifi_state)
  478. {
  479. case WIFI_POWEROFF:
  480. case WIFI_ERROR:
  481. ESP32_AT_RST();
  482. wifi_start_delay = 0;
  483. resendtime = 0;
  484. try_count = 0;
  485. if(sysinf.connectTcpFlag){
  486. /*持续5次均不能链接到tcp,状态回退,重启链接udp*/
  487. res_count++;
  488. if(res_count > 5){
  489. sysinf.connectTcpFlag = 0;
  490. }
  491. }
  492. break;
  493. case WIFI_POWERON:
  494. ESP32_AT();
  495. break;
  496. case WIFI_INIT:
  497. ESP32_EchoOff();
  498. break;
  499. case WIFI_STATION:
  500. ESP32_Net_Mode_Choose(STA);
  501. break;
  502. case WIFI_DISAUTO:
  503. ESP32_DisAutoLink();
  504. try_count = 0;
  505. break;
  506. case WIFI_CWLAP:
  507. ESP32_CWLAP(sysinf.wifiname);
  508. if(try_count++ > 7)
  509. {
  510. wifi_state = WIFI_POWEROFF;
  511. if(wifi_set_ssid == 1)
  512. {
  513. wifi_set_ssid = 0;
  514. wifi_result = 0xff;
  515. data_send_to_pc(PC_CMD_SETWIFI, (char *)&wifi_result, 1);
  516. }
  517. }
  518. try_con = 0;
  519. break;
  520. case WIFI_LINK_AP:
  521. ESP32_JoinAP(sysinf.wifiname, sysinf.password,MAC_ADDR);
  522. if(try_con++ >= 5)
  523. {
  524. wifi_state = WIFI_POWEROFF;
  525. if(wifi_set_ssid == 1)
  526. {
  527. wifi_set_ssid = 0;
  528. wifi_result = 0xfe;
  529. data_send_to_pc(PC_CMD_SETWIFI, (char *)&wifi_result, 1);
  530. }
  531. }
  532. break;
  533. case WIFI_GET_IP:
  534. ESP32_GetIp();
  535. if(wifi_set_ssid == 1)
  536. {
  537. wifi_set_ssid = 0;
  538. wifi_result = 1;
  539. data_send_to_pc(PC_CMD_SETWIFI, (char *)&wifi_result, 1);
  540. }
  541. break;
  542. case WIFI_SETMUX:
  543. ESP32_Enable_MultipleId(1);
  544. break;
  545. case WIFI_LISTEN:
  546. if(sysinf.connectTcpFlag){
  547. if(resendtime < MAX_RESEND_TIME)
  548. {
  549. ESP32_Link_Server(enumTCP,sysinf.TCP_IP_Addr, TCP_IP_PORT, Multiple_ID_0);
  550. }else{
  551. /*多次TCP未链接,链接UDP*/
  552. // connectTcpFlag = 0;
  553. // resendtime = 0;
  554. wifi_tx_len = 0;
  555. memset(wifi_tx_buf, 0, sizeof(wifi_tx_buf));
  556. }
  557. }else{
  558. if(resendtime < MAX_RESEND_TIME)
  559. {
  560. ESP32_Link_Server(enumUDP,User_ESP32_UDPServer_IP, User_ESP32_UDPServer_PORT, Multiple_ID_0);
  561. }
  562. }
  563. break;
  564. case WIFI_TRANS:
  565. if(resendtime < MAX_RESEND_TIME)
  566. {
  567. if(wifi_tx_len){
  568. char cStr [40] = {0};
  569. my_sprintf ( cStr,sizeof(cStr),"AT+CIPSEND=0,%d", wifi_tx_len );
  570. ESP32_Send_AT_Cmd ( cStr, 3000 );
  571. }
  572. }
  573. if(sysinf.connectTcpFlag){
  574. /*tcp链接上,复位计数清零*/
  575. res_count = 0;
  576. }
  577. break;
  578. case WIFI_CLOSE:
  579. ESP32_STOPTCP(Multiple_ID_0);
  580. break;
  581. default:
  582. wifi_state = WIFI_ERROR;
  583. break;
  584. }
  585. }
  586. //wifi任务
  587. void WIFI_process()
  588. {
  589. if(sysinf.pc_channel_recv == 2 && wifi_state > WIFI_SETMUX){
  590. /*串口状态下,不走wifi处理*/
  591. return;
  592. }
  593. WIFI_recv_deal();
  594. WIFI_send_deal();
  595. }
  596. static uint32_t m_pow_n(uint32_t m, int32_t n)
  597. {
  598. uint32_t i = 0, ret = 1;
  599. if (n < 0) return 0;
  600. for (i = 0; i < n; i++)
  601. {
  602. ret *= m;
  603. }
  604. return ret;
  605. }
  606. // 返回值为打印字符的个数
  607. // 支持%d,%o, %x,%s,%c,%f(只打印6位数字)
  608. int my_sprintf(char *pdes,unsigned int len, const char* str, ...)
  609. {
  610. if (str == NULL) return -1;
  611. uint32_t ret_num = 0;// 返回打印字符的个数
  612. char* pStr = (char*)str;// 指向str
  613. int ArgIntVal = 0; // 接收整型
  614. uint32_t ArgHexVal = 0;// 接十六进制
  615. char* ArgStrVal = NULL; // 接收字符型
  616. double ArgFloVal = 0.0; // 接受浮点型
  617. uint32_t val_seg = 0; // 数据切分
  618. uint32_t val_temp = 0; // 临时保存数据
  619. int cnt = 0; // 数据长度计数
  620. int cnt_float = 0; // 数据长度计数
  621. va_list pArgs; // 定义va_list类型指针,用于存储参数的地址
  622. va_start(pArgs, str); // 初始化pArgs
  623. while (*pStr != '\0')
  624. {
  625. switch (*pStr)
  626. {
  627. case ' ':
  628. case '\r':
  629. case '\n':
  630. *pdes++ = (*pStr); ret_num++; break;
  631. case '\t':
  632. *pdes++ =(*pStr); ret_num += 4; break;
  633. case '%':
  634. pStr++;
  635. // % 格式解析
  636. if('.' == *pStr)
  637. {
  638. pStr++;
  639. cnt_float = *pStr - '0';// %.Nf,输出指定位数小数
  640. pStr++;
  641. }
  642. switch (*pStr)
  643. {
  644. case '%':
  645. *pdes++ =('%');// %%,输出%
  646. ret_num++;
  647. pStr++;
  648. continue;
  649. case 'c':
  650. ArgIntVal = va_arg(pArgs, int);// %c,输出char
  651. *pdes++ =((char)ArgIntVal);
  652. ret_num++;
  653. pStr++;
  654. continue;
  655. case 'd':
  656. // 接收整型
  657. ArgIntVal = va_arg(pArgs, int);
  658. if (ArgIntVal < 0)// 如果为负数打印,负号
  659. {
  660. ArgIntVal = -ArgIntVal;// 取相反数
  661. *pdes++ =('-');
  662. ret_num++;
  663. }
  664. val_seg = ArgIntVal;// 赋值给 val_seg处理数据
  665. // 计算ArgIntVal长度
  666. if (ArgIntVal)
  667. {
  668. while (val_seg) {
  669. cnt++;
  670. val_seg /= 10;
  671. }
  672. }
  673. else cnt = 1;// 数字0的长度为1
  674. ret_num += cnt;// 字符个数加上整数的长度
  675. // 将整数转为单个字符打印
  676. while (cnt)
  677. {
  678. val_seg = ArgIntVal / m_pow_n(10, cnt - 1);
  679. ArgIntVal %= m_pow_n(10, cnt - 1);
  680. *pdes++ =((char)val_seg + '0');
  681. cnt--;
  682. }
  683. pStr++;
  684. continue;
  685. case 'o':
  686. // 接收整型
  687. ArgIntVal = va_arg(pArgs, int);
  688. if (ArgIntVal < 0)// 如果为负数打印,负号
  689. {
  690. ArgIntVal = -ArgIntVal;// 取相反数
  691. *pdes++ =('-');
  692. ret_num++;
  693. }
  694. val_seg = ArgIntVal;// 赋值给 val_seg处理数据
  695. // 计算ArgIntVal长度
  696. if (ArgIntVal)
  697. {
  698. while (val_seg) {
  699. cnt++;
  700. val_seg /= 8;
  701. }
  702. }
  703. else cnt = 1;// 数字0的长度为1
  704. ret_num += cnt;// 字符个数加上整数的长度
  705. // 将整数转为单个字符打印
  706. while (cnt)
  707. {
  708. val_seg = ArgIntVal / m_pow_n(8, cnt - 1);
  709. ArgIntVal %= m_pow_n(8, cnt - 1);
  710. *pdes++ =((char)val_seg + '0');
  711. cnt--;
  712. }
  713. pStr++;
  714. continue;
  715. case 'x':
  716. // 接收16进制
  717. ArgHexVal = va_arg(pArgs, uint32_t);
  718. val_seg = ArgHexVal;
  719. // 计算ArgIntVal长度
  720. if (ArgHexVal)
  721. {
  722. while (val_seg) {
  723. cnt++;
  724. val_seg /= 16;
  725. }
  726. }
  727. else cnt = 1;// 数字0的长度为1
  728. ret_num += cnt;// 字符个数加上整数的长度
  729. // 将整数转为单个字符打印
  730. while (cnt)
  731. {
  732. val_seg = ArgHexVal / m_pow_n(16, cnt - 1);
  733. ArgHexVal %= m_pow_n(16, cnt - 1);
  734. if (val_seg <= 9)
  735. *pdes++ =((char)val_seg + '0');
  736. else
  737. {
  738. //*pdes++ =((char)val_seg - 10 + 'a'); //小写字母
  739. *pdes++ =((char)val_seg - 10 + 'A');
  740. }
  741. cnt--;
  742. }
  743. pStr++;
  744. continue;
  745. case 'b':
  746. // 接收整型
  747. ArgIntVal = va_arg(pArgs, int);
  748. val_seg = ArgIntVal;
  749. // 计算ArgIntVal长度
  750. if (ArgIntVal)
  751. {
  752. while (val_seg) {
  753. cnt++;
  754. val_seg /= 2;
  755. }
  756. }
  757. else cnt = 1;// 数字0的长度为1
  758. ret_num += cnt;// 字符个数加上整数的长度
  759. // 将整数转为单个字符打印
  760. while (cnt)
  761. {
  762. val_seg = ArgIntVal / m_pow_n(2, cnt - 1);
  763. ArgIntVal %= m_pow_n(2, cnt - 1);
  764. *pdes++ =((char)val_seg + '0');
  765. cnt--;
  766. }
  767. pStr++;
  768. continue;
  769. case 's':
  770. // 接收字符
  771. ArgStrVal = va_arg(pArgs, char*);
  772. ret_num += (uint32_t)strlen(ArgStrVal);
  773. while (*ArgStrVal)
  774. {
  775. *pdes++ =(*ArgStrVal);
  776. ArgStrVal++;
  777. }
  778. pStr++;
  779. continue;
  780. case 'f':
  781. // 接收浮点型 保留6为小数,不采取四舍五入
  782. ArgFloVal = va_arg(pArgs, double);
  783. val_seg = (uint32_t)ArgFloVal;// 取整数部分
  784. val_temp = val_seg; // 临时保存整数部分数据
  785. ArgFloVal = ArgFloVal - val_seg;// 得出余下的小数部分
  786. // 计算整数部分长度
  787. if (val_seg)
  788. {
  789. while (val_seg) {
  790. cnt++;
  791. val_seg /= 10;
  792. }
  793. }
  794. else cnt = 1;// 数字0的长度为1
  795. ret_num += cnt;// 字符个数加上整数的长度
  796. // 将整数转为单个字符打印
  797. while (cnt)
  798. {
  799. val_seg = val_temp / m_pow_n(10, cnt - 1);
  800. val_temp %= m_pow_n(10, cnt - 1);
  801. *pdes++ =((char)val_seg + '0');
  802. cnt--;
  803. }
  804. // 打印小数点
  805. *pdes++ =('.');
  806. ret_num++;
  807. // printf("\r\n %f\r\n", ArgFloVal);
  808. if(cnt_float == 0)
  809. cnt_float = 6;
  810. // 开始输出小数部分
  811. //ArgFloVal *= 1000000;
  812. ArgFloVal *= m_pow_n(10, cnt_float);
  813. val_temp = (int)ArgFloVal;// 取整数部分
  814. while (cnt_float)
  815. {
  816. val_seg = val_temp / m_pow_n(10, cnt_float - 1);
  817. val_temp %= m_pow_n(10, cnt_float - 1);
  818. *pdes++ =((char)val_seg + '0');
  819. cnt_float--;
  820. }
  821. ret_num += 6;
  822. pStr++;
  823. continue;
  824. default:// % 匹配错误,暂输出空格
  825. *pdes++ =(' '); ret_num++;
  826. break;
  827. }
  828. break;
  829. default:
  830. *pdes++ =(*pStr); ret_num++;
  831. break;
  832. }
  833. pStr++;
  834. if(ret_num > len){
  835. break;
  836. }
  837. }
  838. va_end(pArgs);// 结束取参数
  839. *pdes++ = 0;
  840. return ret_num;
  841. }