Transmit data over WiFi modem
Diff: ESP_8266.cpp
- Revision:
- 0:0b46638559b3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ESP_8266.cpp Thu Jun 13 13:49:26 2019 +0000 @@ -0,0 +1,176 @@ +#include "mbed.h" +#include "ESP_8266.h" +//#define DEBUG + +char tr_data[256]; +Serial *pwifi; +DigitalOut *pCH_PD; +DigitalOut *pled; + +//------------ +Timeout ift; +RxWiFi_t rx_wifi; + +//----------- +void ift_isr() +{ +rx_wifi.event=1; +} + +//--------------------- +void RxWiFi_interrupt() +{ + while(pwifi->readable()) { + rx_wifi.buffer[rx_wifi.in] = pwifi->getc(); + ift.attach(ift_isr, 0.01); + if(rx_wifi.event==0 && rx_wifi.in<(RXWIFI_BUFFER_SIZE-1) ) + rx_wifi.in = (rx_wifi.in + 1); + } +} +//---------------------------------------------------- +void IniWiFi(Serial *pw,DigitalOut *pcs,DigitalOut *pl) +{ + pCH_PD=pcs; + pled=pl; + pwifi=pw; + + *pCH_PD=0; + pwifi->baud(115200); + pwifi->attach(&RxWiFi_interrupt, Serial::RxIrq); + *pCH_PD=1; + rx_wifi.event=0; + rx_wifi.cipdinfo=0; + while(rx_wifi.event==0) { + wait_ms(25); + *pled=!*pled; + } + rx_wifi.event=0; + rx_wifi.in=0; + rx_wifi.app=0; +} + +//------------------------------------ +void WriteWiFi(uint8_t *sbuf, int len) +{ + if(pwifi->writeable()) { + for (int i=0; i<len; i++) + pwifi->putc(sbuf[i]); + } +} + +//---------------------------------- +void SendToWiFi_(char *data,int len) +{ + pwifi->printf("AT+CIPSEND=%d\r\n",len); + while(rx_wifi.event==0) wait_us(10); + rx_wifi.in =0; + rx_wifi.event=0; + WriteWiFi((uint8_t *)data,len); +} + +//----------------------- +void WiFiDataProcessing() +{ + char *bptr,*aptr,*pptr; + char data[256]; + + if(rx_wifi.event){ + rx_wifi.app=0; + rx_wifi.buffer[rx_wifi.in]=0; + bptr=strstr(rx_wifi.buffer,"+IPD"); +//-----------recive UDP data-------------------------- + if(bptr!=NULL) { + bptr=strchr(rx_wifi.buffer,','); + bptr++; + rx_wifi.len=strtol(bptr,&aptr,10); + bptr=strchr(aptr,':'); + pptr=strchr(aptr,','); + if((bptr>pptr)&&(bptr!=NULL)&&(pptr!=NULL)) { + aptr++; + pptr=strchr(aptr,','); + *pptr=0; + pptr++; + *bptr=0; + } else + bptr=NULL; + if (bptr!=NULL) { + bptr++; + for (int i=0; i<rx_wifi.len; i++) + data[i]=bptr[i]; + rx_wifi.answer=wifi_executeCallback(data);//<------action------ + #ifdef DEBUG + pc_printfCallback("wifi_executeCallback"); +#endif + rx_wifi.app=1; + rx_wifi.ipd=0; + if(strcmp(rx_wifi.IPaddr,aptr)!=0) { + sprintf(rx_wifi.IPaddr,"%s",aptr); + sprintf(rx_wifi.UDPport,"%s",pptr); + rx_wifi.event=0; + rx_wifi.in =0; + pwifi->printf("AT+CIPCLOSE\r\n"); + while(rx_wifi.event==0) wait_us(10); + rx_wifi.buffer[rx_wifi.in]=0; +#ifdef DEBUG + pc_printfCallback(rx_wifi.buffer); +#endif + rx_wifi.event=0; + rx_wifi.in =0; + pwifi->printf("AT+CIPSTART=\"UDP\",\"%s\",%s,1112,2\r\n",rx_wifi.IPaddr,rx_wifi.UDPport); + rx_wifi.ipd=1; + + } else if(rx_wifi.answer==0) { +/*//---------------------information feedback ----------------- + rx_wifi.event=0; + rx_wifi.in =0; + SendToWiFi_(data,rx_wifi.len); +*/ + } + } + } else { +//-----------------------------recive Modem answer------------------------------------------- +#ifdef DEBUG + if(rx_wifi.buffer[0]<128) + pc_printfCallback(rx_wifi.buffer); +#else + if(rx_wifi.buffer[0]<128){ + char *endptr=strstr(rx_wifi.buffer,"AT+CIFSR"); + if(endptr!=NULL) + pc_printfCallback(rx_wifi.buffer);//pc.printf("%s",rx_wifi_buffer); + } +#endif + if(strstr(rx_wifi.buffer,"WIFI GOT IP")!=NULL) { + pwifi->printf("AT+CIPSTART=\"UDP\",\"192.168.255.255\",1112,1112,2\r\n"); + } else if(strstr(rx_wifi.buffer,"CONNECT")!=NULL) { + if (rx_wifi.cipdinfo==0) { + rx_wifi.cipdinfo=1; + pwifi->printf("AT+CIPDINFO=1\r\n"); + } else if(rx_wifi.ipd) { + rx_wifi.ipd=0; + rx_wifi.event=0; + rx_wifi.in =0; + if(data[1]==' ') + SendToWiFi_(data,rx_wifi.len); + } else + pwifi->printf("AT+CIFSR\r\n"); + } + } + rx_wifi.in =0; + rx_wifi.event=0; + } +} + +//-------------------- +void SendResponseWiFi() +{ + if(rx_wifi.app){ + if (rx_wifi.answer&&rx_wifi.ipd==0){ + ResponseWiFiCallback(tr_data,rx_wifi.answer); + if(rx_wifi.answer) + SendToWiFi_(tr_data,strlen(tr_data)); + } + rx_wifi.answer=0; + rx_wifi.app=0; + } +} + \ No newline at end of file