TA的每日心情 | 奋斗 2023-7-6 08:48 |
---|
签到天数: 169 天 连续签到: 1 天 [LV.7]常住居民III
|
对于SystemInit之类的函数就不再说了,直接看到main函数。
int main(void){ //SystemInit(); LED_Init(); //LED指示灯初始化函数 USART1_Init(); //USART1串口初始化函数 USART2_Init(); //USART2串口初始化函数 while(1) { LED_Switch(LED_ON,LED_R|LED_G|LED_Y|LED_B); //点亮开发板四个指示灯,表示程序进入主流程 ESP8266_Init(); //ESP8266初始化 ESP8266_DevLink(DEVICEID,APIKEY,20); //和平台建立设备连接 LED_Switch(LED_OFF,LED_R|LED_G|LED_Y|LED_B); //熄灭开发板四个指示灯,表示程序完成设备连接,进入数据发送循环 while(1) { if(!(ESP8266_CheckStatus(30))) //检测ESP8266模块连接状态 { ESP8266_SendDat(); //向平台发送数据 } else { break; } } } }
对于以下3个函数,都是在初始化STM32的GPIO、USART外设的部分,这一部分程序是通用的,与OneNet关系不大,对于使用过STM32的人来说很简单,不必要说明。
LED_Init();
USART1_Init();
USART2_Init();
直接来看一下ESP8266_Init()函数,这个函数是对ESP8266的初始化。
首先对ESP8266进行复位,STM32的第PB5引脚与ESP8266的复位引脚连接,这里只是通过控制PB5来进行复位。
printf函数在串口中输出信息。
SendCmd函数,通过串口发送AT指令到ESP8266。
void ESP8266_Init(void){ ESP8266_Rst(); printf("%s\r\n","[ESP8266_Init]ENTER AT."); SendCmd(AT,"OK",1000); printf("%s\r\n","[ESP8266_Init]EXIT AT."); printf("%s\r\n","[ESP8266_Init]ENTER CWMODE."); SendCmd(CWMODE,"OK",1000); printf("%s\r\n","[ESP8266_Init]EXIT CWMODE."); printf("%s\r\n","[ESP8266_Init]ENTER RST."); SendCmd(RST,"OK",2000); printf("%s\r\n","[ESP8266_Init]EXIT RST."); printf("%s\r\n","[ESP8266_Init]ENTER CIFSR."); SendCmd(CIFSR,"OK",1000); printf("%s\r\n","[ESP8266_Init]EXIT CIFSR."); printf("%s\r\n","[ESP8266_Init]ENTER CWJAP."); SendCmd(CWJAP,"OK",2200); printf("%s\r\n","[ESP8266_Init]EXIT CWJAP."); printf("%s\r\n","[ESP8266_Init]ENTER CIPSTART."); SendCmd(CIPSTART,"OK",3000); printf("%s\r\n","[ESP8266_Init]EXIT CIPSART."); printf("%s\r\n","[ESP8266_Init]ENTER CIPMODE."); SendCmd(CIPMODE,"OK",1000); printf("%s\r\n","[ESP8266_Init]EXIT CIPMODE.");}
ESP8266_CheckStatus函数,检测ESP8266模块连接状态
通过串口2向ESP8266发送CIPSTATUS指令,通过返回数据判断当前的连接状态。
int ESP8266_CheckStatus(int timeOut){ int32 res=0; int32 count=0; memset(usart2_rcv_buf,0,sizeof(usart2_rcv_buf)); usart2_rcv_len=0; printf("%s\r\n","[ESP8266_CheckStatus]ENTER check status..."); usart2_write(USART2,CIPSTATUS,strlen(CIPSTATUS)); for(count=0;count<timeOut;count++) { mDelay(100); if((NULL != strstr((const char *)usart2_rcv_buf,"STATUS:4"))) //失去连接 { res=-4; break; } else if((NULL != strstr((const char *)usart2_rcv_buf,"STATUS:3"))) //建立连接 { res=0; break; } else if((NULL != strstr((const char *)usart2_rcv_buf,"STATUS:2"))) //获得IP { res=-2; break; } else if((NULL != strstr((const char *)usart2_rcv_buf,"STATUS:5"))) //物理掉线 { res=-5; break; } else if((NULL != strstr((const char *)usart2_rcv_buf,"ERROR"))) { res=-1; break; } else { ; } } printf("%s\r\n","[ESP8266_CheckStatus]EXIT check status..."); return res; }
当连接上OneNet时,就要发送LED的状态了。
ESP8266_SendDat函数,向OneNet平台上传LED当前状态数据
STM32通过串口2向ESP8266发送CIPSEND指令,开始透传,并等待ESP8266返回。
使用GetSendBuf函数获取当前LED的状态。
通过PacketSavedataSimpleString函数生成向OneNet平台上传的协议格式的数据点。
通过DeleteBuffer函数释放占用的内在空间。
向ESP8266发送+++结束透传,使ESP8266返回指令模式
void ESP8266_SendDat(void){ int32 count=0; memset(usart2_rcv_buf,0,sizeof(usart2_rcv_buf)); usart2_rcv_len=0; printf("%s\r\n","[ESP8266_SendDat]ENTER Senddata..."); usart2_write(USART2,CIPSEND,strlen(CIPSEND)); //向ESP8266发送数据透传指令 for(count=0;count<40;count++) { mDelay(100); if((NULL != strstr((const char *)usart2_rcv_buf,">"))) { break; } } GetSendBuf(); send_pkg = PacketSavedataSimpleString(DEVICEID,send_buf); usart2_write(USART2,send_pkg->_data,send_pkg->_write_pos); //向平台上传数据点 DeleteBuffer(&send_pkg); mDelay(500); usart2_write(USART2,"+++",3); //向ESP8266发送+++结束透传,使ESP8266返回指令模式 mDelay(200); printf("%s\r\n","[ESP8266_SendDat]EXIT Senddata...");}至此,我们的LED状态就上传到了OneNet平台上。通过平台上的界面可以看到开发板的LED状态了。 |
|