打印
[STM8]

STM8L串口通信问题

[复制链接]
1081|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
iangzy|  楼主 | 2017-4-6 12:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有这么四个函数,调用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;       
}

沙发
lachane1119| | 2017-4-6 14:03 | 只看该作者
USART_RX_STA还有在其它地方用到吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

9

帖子

0

粉丝