原子哥按照你串口1收数据的代码,出了点问题,帮我看看那里出问题了?

2019-07-21 02:18发布

//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误    
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记


void USART1_IRQHandler(void)                 //串口1中断服务程序
{
 u8 Res;
#ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
 OSIntEnter();   
#endif
 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
 {
  Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
  
  if((USART_RX_STA&0x8000)==0)//1000 0000 0000 0000接收未完成
  {
   if(USART_RX_STA&0x4000)//100 0000 0000 0000接收到了0x0d
   {
    if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x8000; //接收完成了
   }
   else //还没收到0X0D
   { 
    if(Res==0x0d)USART_RX_STA|=0x4000;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
     USART_RX_STA++;
     if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收  
    }  
   }
  }     
  }

int main(void)
{
 u32 i,j;
// u8 size=3;  //默认是QVGA 320*240尺寸
// u32 jpeglen=0;
 //u32 bag=0;//包数
 uart_init(115200);//115200);  //初始化串口波特率为115200
 delay_init(168);  //初始化延时函数
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
 LCD_Init();    //液晶屏初始
 LED_Init();
  LED1=1;
   LED2=1;

   main_test();   //测试主界面
   
   printf("AT+RST ");//串口1发送命令
   USART_RX_STA=0; //清除串口1标志位
   while(USART_RX_STA&=0x8000);//等待串口1接收完数据
   LCD_ShowString(10,16,16,"AT+RST",1);//示显字符串AT+RST
   LCD_ShowString(10+48,16,16,USART_RX_BUF,1);//示显串中1接收的数据
 
    LED1=0;//点亮
   LED2=0;
 
    }
上面代码很奇怪,串口没收到任何数据,屏上就示显字符串AT+RST,LED也点亮了
按道理,串口收到0x0d,0x0a,才会在屏上示显字符串AT+RST,然后才点亮LED啊!
大家帮帮我看那里出了问题?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。