stm32串口通信串口发出指令

串口通信串口发送指令,控制单片机实现如下响应:(1)串口发送R#(#为数字),红色LED闪烁#次,间隔1秒;
(2)串口发送Red为数字),红色LED每ms闪烁1次。
说明 :(1)波特率为57600;
(2)闪烁次数#为10以内数字;
(3)闪烁间隔
**可为100~9999之间数值;
(4)单片机将上述接收的串口指令,返回给PC并显示。

u8 Uart_Flag =0;
u8 Uart_Num =0;
u8 Uart_RxSTA =0;
u8 USART_RX_BUF[64];
u8 USART_TX_BUF[64];
u8  Uart_TxCnt =0;
u8 Uart_TXFlag =0;

void  uart_init(void)
{
    //配置接收中断
    //接收中断优先级一定要高。
}

void UART_IRQHandler(void)
{
    u8 res;
    
    //接收到数据中断
    if(USART1->SR&(1<<5))
    {     
        res=USART1->DR; 
        if((Uart_RxSTA&0x80)==0)//接收未完成
        {
            if(Uart_RxSTA&0x40)//接收到了0x0d
            {
                if(res!=0x0a)//接收错误,重新开始
                {
                    Uart_RxSTA=0;
                }
                else//接收完成了 
                {
                    Uart_Num = Uart_RxSTA;//记下接收的字节数
                    Uart_Flag =1;//接收完成标志
            
                    Uart_RxSTA|=0x80;    //清接收字节
                    USART1->CR1|=1<<8;    //PE中断使能
                    USART1->CR1|=1<<7;    //发射空中断  
                }
            }
            else //还没收到0X0D
            {    
                if(res==0x0d)Uart_RxSTA|=0x40;
                else
                {
                    USART_RX_BUF[Uart_RxSTA&0X3F]=res;
                    Uart_RxSTA++;
                    if(Uart_RxSTA>63)Uart_RxSTA=0;//接收数据错误,重新开始接收      
                }         
            }
        }

        //发射空中断
        if(USART1->SR&(1<<7))
        {     
            //4)单片机将上述接收的串口指令,返回给PC并显示。
            if(Uart_Flag ==1)
            {    
                Uart_Flag =0;
                if(Uart_TXFlag ==0)
                {                    
                    USART_TX_BUF = USART_RX_BUF[Uart_TxCnt] //保存一下数据
                }
                USART1->DR = (u8)USART_RX_BUF[Uart_TxCnt++];       
                 
                if(Uart_TxCnt>=Uart_Num)
                {
                    USART1->CR1 &= ~ (1<<8);//PE中断使能(关闭)
                    USART1->CR1 &= ~ (1<<7);//发射空中断(关闭)  

                    Uart_TxCnt=0;
                    Uart_RxSTA =0x00;
                    Uart_TXFlag =1;//这里清Uart_TXFlag,这样数据就不会被覆盖。
      
                }    
            }
        }
}

u8  BlinkNum=0;
u8  BlinkCnt=0;
u8  BlinkFlag=0;
u16  BlinkTIM =0;

//处理串口数据,放在定时器中断中,定时10MS
void  Data_RxUart(void)
{
    u8 i;
    //接收到数据
    if(Uart_TXFlag==1)
    {
        Uart_TXFlag =0;
        BlinkCnt =0;
        
        //1)串口发送R#(#为数字),红色LED闪烁#次,间隔1秒;
        if(USART_RX_BUF[0]=='R')
        {
            BlinkNum = USART_RX_BUF[1];//记下闪烁次数
            BlinkFlag =1;
        }
    }
  //计算好闪烁次数
    if(BlinkFlag==1)
    {
        BlinkTIM++;if(BlinkTIM>=100)//间隔1秒;
        {
            LED_RED =!LED_RED;//红色LED闪烁#次
            BlinkCnt++;
            if(BlinkCnt>=BlinkNum)
            {
                BlinkCnt =0;
                BlinkFlag =0;//清除闪烁
            }
        }
        
    }
    
}