初级会员

- 积分
- 63
- 金钱
- 63
- 注册时间
- 2014-6-8
- 在线时间
- 0 小时
|
5金钱
SIM900A的例程中有如下程序段:
//GSM信息显示(信号质量,电池电量,日期时间)
//返回值:0,正常
// 其他,错误代码
u8 sim900a_gsminfo_show(u16 x,u16 y)
{
u8 *p,*p1,*p2;
u8 res=0;
p=mymalloc(SRAMIN,50);//申请50个字节的内存
POINT_COLOR=BLUE;
USART2_RX_STA=0;
if(sim900a_send_cmd("AT+CPIN?","OK",200))res|=1<<0; //查询SIM卡是否在位
USART2_RX_STA=0;
if(sim900a_send_cmd("AT+COPS?","OK",200)==0) //查询运营商名字
{
p1=(u8*)strstr((const char*)(USART2_RX_BUF),"\"");
if(p1)//有有效数据
{
p2=(u8*)strstr((const char*)(p1+1),"\"");
p2[0]=0;//加入结束符
sprintf((char*)p,"运营商:%s",p1+1);
Show_Str(x,y,200,16,p,16,0);
}
USART2_RX_STA=0; /////得到正确应答,的确不会清零接受状态,但是下一次发送的第一步就是清零接受状态标志啊,不明白这里为什么要清零
}else res|=1<<1;//////////////////出错标志位10
if(sim900a_send_cmd("AT+CSQ","+CSQ:",200)==0) //查询信号质量
{
p1=(u8*)strstr((const char*)(USART2_RX_BUF),":");
p2=(u8*)strstr((const char*)(p1),",");
p2[0]=0;//加入结束符
sprintf((char*)p,"信号质量:%s",p1+2);//////别忘了把空格也算进去
Show_Str(x,y+20,200,16,p,16,0);
USART2_RX_STA=0;
}else res|=1<<2;
if(sim900a_send_cmd("AT+CBC","+CBC:",200)==0) //查询电池电量
{
p1=(u8*)strstr((const char*)(USART2_RX_BUF),",");
p2=(u8*)strstr((const char*)(p1+1),",");
p2[0]=0;p2[5]=0;//加入结束符
sprintf((char*)p,"电池电量:%s%% %smV",p1+1,p2+1);
Show_Str(x,y+40,200,16,p,16,0);
USART2_RX_STA=0;
}else res|=1<<3;
if(sim900a_send_cmd("AT+CCLK?","+CCLK:",200)==0) //查询电池电量
{
p1=(u8*)strstr((const char*)(USART2_RX_BUF),"\"");
p2=(u8*)strstr((const char*)(p1+1),":");
p2[3]=0;//加入结束符
sprintf((char*)p,"日期时间:%s",p1+1);
Show_Str(x,y+60,200,16,p,16,0);
USART2_RX_STA=0;
}else res|=1<<4;
myfree(SRAMIN,p);
return res;
}
在此程序段里,为什么在每发送一条AT指令,并得到期待的返回值之后,都要在if语句里执行USART2_RX_STA=0?在发送AT指令的函数sim900a_send_cmd()里面第一条语句不就是清零USART2_RX_STA吗?那又为什么在以上程序段sim900a_gsminfo_show(u16 x,u16 y)中的if语句里额外再对USART2_RX_STA清零?
例程中的sim900a_send_cmd()函数如下:
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART2_RX_STA=0;///////接受状态清零!!!!!!!!!!!!!!!!!!!!!执行发送命令的第一条就是发送标志清零
if((u32)cmd<=0XFF) ////////变量的地址不可能小于0xff,小于0xff的肯定是数字,比较时都转换为long
{
while(DMA1_Channel7->CNDTR!=0); //等待通道7传输完成
USART2->DR=(u32)cmd; //传输cmd数据
}else u2_printf("%s\r\n",cmd);//发送命令,发送字符串,%s表示发送字符串
if(ack&&waittime) //需要等待应答,如果是空指针
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART2_RX_STA&0X8000)//接收到期待的应答结果
{
if(sim900a_check_cmd(ack))break;//得到有效数据,不清零接受标志
USART2_RX_STA=0;///接受到的应答不是期待的应答,清零标志,继续等待
}
}
if(waittime==0)res=1;
}
return res;
}
麻烦原子哥了
|
最佳答案
查看完整内容[请看2#楼]
回复【11楼】yushengjiexy:
---------------------------------
有数据就返回,没数据待命.
|