usart 串口的发送-接收数据(正点改编)

功能:上位机发送给mcu,mcu原原本本发送给上位机

**main关键代码**
    while(1)
    {
        if(flag==1)
                {
                    len=usart_sta&0xffff;//接收数据长度,&0xffff 可以省略
                 for(t=0;t"\r\n");
                 flag=0;
                 usart_sta=0;
                } 
                else
                    times++;
            if(times%30==0)   LED0=!LED0;
            delay_ms(10); 
       }

 **usart.h关键代码**

 #define usart_len       10     //定义最大接收字节数
 extern u8  usart_array[usart_len]; //接收缓冲
 extern u8 usart_sta;               //接收n位的判断
 extern u8 flag;                //标志位

**usart.c关键代码**

u8 usart_array[usart_len];
u8 flag=0;
u8 usart_sta=0;

void Uart1_PutChar(u8 ch)
{

  USART_SendData(USART1,ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

}
//USART_GetITStatus(USART1, USART_IT_RXNE) == SET

void USART1_IRQHandler(void)      //串口1中断服务程序,固定的函数名,在startup_stm32f10x_hd.s
    {
    u8 Res;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)  //接收中断
        {
         Res=USART_ReceiveData(USART1); //读取接收到的数据
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//这个可有可无
         if(flag==0)//标志位
         {
           usart_array[usart_sta&0xffff]=Res;//按位存储,可以去掉&0xffff,加上方便理解
             usart_sta++;
             if(usart_sta>usart_len)//设置数据存放数据的上限
             {
                 usart_sta=0;
               printf("\r\n输入错误\r\n");
             }
             if(Res==0x0d)//判段是否收到回车键,回车键表示发送
             {
               flag=1;
             }
         }

      }
   }
USART设置步骤:
1.开启串口、GPIO时钟
2.串口引脚初始化(TX/RX)
3.NVIC配置(优先级/通道..)
4.USART初始化设置(波特率/字长/奇偶校验..)
5.开启串口的中断方式(TC/RXNE..)
6.使能串口
【7.中断处理函数】(函数名在startup_stm32f1010x_hd.s)

皇图霸业谈笑中,不胜今宵一场醉...

你可能感兴趣的:(串口,usart,串口通信,发送接收数据)