ESP32_WROOM_32D.c 24 KB

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