ESP8266 SDK开发篇(三)——定时器

首先先来解决上一讲留下的问题,如何检测芯片是否获取了ip,这个问题其实很简单。
先定义一个结构体变量struct ip_info pTempIp;用来获取连接状况,然后调用两个函数,

wifi_get_ip_info(STATION_IF, &pTempIp);
if(wifi_station_get_connect_status() == STATION_GOT_IP)
{
    os_printf("ip:%d\r\nip:%X",pTempIp.ip.addr,pTempIp.ip.addr);
}

先读取芯片的ip信息,然后判断是否获得ip,是则将刚刚保存的ip串口输出显示。
这里顺便说一下上一节struct station_config和struct ip_info这两个结构体,在ide中也可以很方便地用F3跳转到定义处查看。

struct station_config {
    uint8 ssid[32];     //要连接的wifi的账号
    uint8 password[64]; //对应的密码
    uint8 bssid_set;    //这个位置1则只会连接ssid和bssid相匹配的路由器,比如两个名字一样的路由器,要区分只能通过mac不同
    uint8 bssid[6];
};
//这是一个结构体嵌套,没什么好讲解的,ip_info分别存了ip、子网掩码和网关信息。
struct ip_addr {
  u32_t addr;
};
struct ip_info {
    struct ip_addr ip;
    struct ip_addr netmask;
    struct ip_addr gw;
};

我们用的是NONOS_SDK开发,它不支持任务调度,也不支持基于优先级的抢占,程序从入口顺序执行,就跟51单片机类似,也因为它执行一条语句的速度很快,当我们按照上一节配置好wifi后直接判断时候获取到ip,这时芯片可能还没反应过来就已经判断完了,这样不是我们想要的结果,因此引入定时器的用法。玩过51的朋友可能会问,那为什么不用for循环延时的方法?这里作为一个小作业,大家可以去找一下资料顺便锻炼一下自己百度的能力,也可以试一下用for循环延时个10秒,再试试延时个几分钟看看会不会出问题。
首先要先定义一个定时器LOCAL os_timer_t ip_timer;用来检测ip,然后这次我们会用到3个函数,这里我先给出代码再解释。

//关闭定时器
//参数一:要关闭的定时器
os_timer_disarm(&ip_timer);

//设置定时器
//参数一:要设置的定时器;参数二:定时器到时间要执行的回调函数;参数三:回调函数的参数
os_timer_setfn(&ip_timer, (os_timer_func_t *)user_check_ip, NULL);

//使能(启动)定时器
//参数一:要使能的定时器;参数二:定时时间(单位:ms);参数三:是否重复执行,即执行完1次就停止还是一直执行下去
os_timer_arm(&ip_timer, 5000, 1);  //1:重复  0:只一次

另外要注意的是,定时时间并不是无限长,具体时间范围可以参考API文档,学会看文档也是程序猿必备的技能之一。
这样在配置好wifi设置后,就可以启动执行该定时器用于检测是否获取到ip,把本讲第一部分内容放到一个函数里,让定时器调用就好了,最后附上我的测试图。


ESP8266 SDK开发篇(三)——定时器_第1张图片
测试图

你可能感兴趣的:(ESP8266)