char * sim900a_waitask(uint8_t waitask_hook(void))中的waitask_hook有什么用,真心求教
时间:10-02
整理:3721RD
点击:
char * sim900a_waitask(uint8_t waitask_hook(void)) //等待有数据应答
{
uint8_t len=0;
char *redata;
do{
redata = SIM900A_RX(len); //接收数据
if(waitask_hook!=0)
{
if(waitask_hook()==SIM900A_TRUE) //返回 SIM900A_TRUE 表示检测到事件,需要退出
{
redata = 0;
return redata;
}
}
}while(len==0); //接收数据为0时一直等待
SIM900A_DELAY(20); //延时,确保能接收到全部数据(115200波特率下,每ms能接收11.52个字节)
return redata;
}
{
uint8_t len=0;
char *redata;
do{
redata = SIM900A_RX(len); //接收数据
if(waitask_hook!=0)
{
if(waitask_hook()==SIM900A_TRUE) //返回 SIM900A_TRUE 表示检测到事件,需要退出
{
redata = 0;
return redata;
}
}
}while(len==0); //接收数据为0时一直等待
SIM900A_DELAY(20); //延时,确保能接收到全部数据(115200波特率下,每ms能接收11.52个字节)
return redata;
}
这是一个回调函数指针,不知道硬件如何
从代码看,调用sim900a_waitask函数的人还需要自己提供等待应答的回调函数
意思可能有应答,也可能没有应答
需要在waitask_hook函数内读取硬件或某些数据,判断给出结果,如果是SIM900A_TRUE,说明正在等应答或其他符合硬件的事件,直接退出了
也可能在waitask_hook函数内实现了超时的判断等等
如果没有事件,就一直接收,收到一个长度不为零的就退出循环,如果没有这个回调函数,外部没数据会死循环
这样做的代码的自由度比较大,可以把硬件驱动代码和软件应用层隔离,移植到不同的硬件时,实现不同waitask_hook就可以了
真心感谢,共同进步
他是这么调用的:redata=sim900a_waitask(0);不是很理解这么做有什么用,我是一个新手,很多地方不懂
意思就是直接读取数据,不管其他状态