查看: 1105|回复: 0

【中移出品麒麟座Mini开发板】STM32程序分析EDP

[复制链接]
  • TA的每日心情
    奋斗
    2023-7-6 08:48
  • 签到天数: 169 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-10-21 08:49:45 | 显示全部楼层 |阅读模式
    分享到:
    对于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状态了。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-5-4 20:41 , Processed in 0.111926 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.