有这么四个函数,调用GSM_send_cmd(u8 *cmd,u8 *ack,u16 waittime) ;传入AT指令,和一个确认字符,还有一个等待时间。
按理来说,会从串口读取返回的确认字符,但我看整个程序就只有while(!USART_GetFlagStatus (USART1,USART_FLAG_TXE));
读取的标志不是USART_FLAG_RXNE吗?它是如何做到读取串口的?
用的是库函数。
void USART1_SendStr(unsigned char *Str)
{
while(*Str!=0)//不为结束
{
USART_SendData8(USART1,*Str); //发送数据
while(!USART_GetFlagStatus (USART1,USART_FLAG_TXE));//等待发送完毕
Str++;//下一个数据
}
USART_SendData8(USART1,13); //发送数据 \r
while(!USART_GetFlagStatus (USART1,USART_FLAG_TXE));//等待发送完毕
USART_SendData8(USART1,10); //发送数据 \n
while(!USART_GetFlagStatus (USART1,USART_FLAG_TXE));//等待发送完毕
}
//=============================================================================
void USART1_SendStr2(unsigned char *Str)
{
while(*Str!=0)//不为结束
{
USART_SendData8(USART1,*Str); //发送数据
while(!USART_GetFlagStatus (USART1,USART_FLAG_TXE));//等待发送完毕
Str++;//下一个数据
}
}
u8* GSM_check_cmd(u8 *str)
{
char *strx=0;
if(USART_RX_STA&0X8000)
{
USART_RX_BUF[USART_RX_STA&0X3FF]=0;
strx=strstr((const char*)USART_RX_BUF,(const char*)str); //从缓冲中判断确认符
}
return (u8*)strx;
}
u8 GSM_send_cmd(u8 *cmd,u8 *ack,u16 waittime) //参数 *cmd=AT *ack=OK waittime=100
{
u8 res=0;
u16 i;
GSM_Sleep_Mode(0);
if(INT_AT_enable==1)
{
if(key_value==1)
{
return 0xfe;
}
if(GSM_check_cmd("RING")) //判断返回串口返回值?
{
return 0xfe;
}
if(GSM_check_cmd("+CMTI:")) //判断返回串口返回值?
{
return 0xfe;
}
}
USART_RX_STA=0;
for(i=0;i<500;i++)
{
USART_RX_BUF[i]=0;
}
if((u32)cmd<=0XFF)
{
USART1_SendStr2(cmd);
}
else
USART1_SendStr(cmd);
if(ack&&waittime)
{
while(--waittime)
{
delay_ms(10);
if(INT_AT_enable==1)
{
if(key_value==1)
{
return 0xfe;
}
if(GSM_check_cmd("RING")) //判断返回串口返回值?
{
return 0xfe;
}
if(GSM_check_cmd("+CMTI:")) //判断返回串口返回值?
{
return 0xfe;
}
}
if(USART_RX_STA&0X8000)
{
if(GSM_check_cmd(ack)) //判断返回串口返回值?
{
return 0;
}
if(GSM_check_cmd("+CME ERROR:")) //判断返回串口返回值?
{
return 4;
}
USART_RX_STA=0;
}
}
if(waittime==0)
res=1;
}
return res;
}
|