ESP32_WROOM_32D.c 27 KB

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