蓝桥杯嵌入式——串口通信相关

基础

CT117E开发板引出了两个串口,但是咱们只会用到串口2的电路,因为串口1连了一个九针的口,一般不用那个口。
在这里插入图片描述
串口配置步骤:

  1. 串口时钟使能,GPIO时钟使能
  2. 串口复位
  3. GPIO初始化
  4. 串口参数初始化
  5. 开启串口中断,并初始化中断
  6. 使能串口
  7. 编写串口中断服务函数,用于串口接收数据
  8. 串口数据发送函数

代码:

void  usart2_init()
{
    
    
 GPIO_InitTypeDef GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 NVIC_InitTypeDef  NVIC_InitStructure;
 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Init(GPIOA,&GPIO_InitStructure);//PA2为发送引脚
 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//PA3为接收引脚
 GPIO_Init(GPIOA,&GPIO_InitStructure);

 USART_InitStructure.USART_BaudRate=9600;//波特率
 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不适用硬件流控制
 USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//发送和接受模式
 USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位数据为
 USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位停止位
 USART_InitStructure.USART_Parity=USART_Parity_No;//不进行奇偶校验
 USART_Init(USART2,&USART_InitStructure);
 
 NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
 NVIC_Init(&NVIC_InitStructure);
 
 USART_Cmd(USART2,ENABLE);
 
 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//串口接收中断
}

串口发送函数是需要自己写的,需要注意的是,在每次串口发送数据之后都要等到发送完成再进行下一次发送,在代码中的体现就是等到发送缓冲区为空再进行发送。

void USART2_SendString(u8 *str)//中断标志状态和一般状态是不一样的。
{
    
      
 u8 index = 0; 
 do  
 {
    
        
  USART_SendData(USART2,str[index]); //发送数据    
  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0);  //发送缓冲区为空就是发送完成 //USART_FLAG_TC 表示传输完毕;USART_FLAG_TXE表示发送缓冲区空   
  index++;  
 }while(str[index] != 0);
}

串口的接收放在中断函数中:

u8 RXbuf[20];//初始化就是0
u8 RXover=0;
u8 RXcont=0;
void USART2_IRQHandler(void)
{
    
     
  u8 temp;
  if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET)//接收到中断
  {
    
    
      USART_ClearITPendingBit(USART2,USART_IT_RXNE);
    temp =  USART_ReceiveData(USART2);
    if(temp == '\n')
    {
    
    

      RXcont = 0;
      RXover = 1;//接收到的标志
      USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//先把串口给关掉,处理接收到的数据,等需要的时候再打开。。
    }else
     {
    
    
      RXbuf[RXcont] = temp;
      RXcont++;
     }
  }
}   

在主函数中的配置:

  if(RXover)
  {
    
    
   USART2_SendString(RXbuf);
   LCD_ClearLine(Line3);
   LCD_DisplayStringLine(Line3,RXbuf);
   for(i=0;i<20;i++)
   {
    
    
     RXbuf[i]=0;
   }
   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
   RXover=0;
  }

猜你喜欢

转载自blog.csdn.net/qq_43690936/article/details/105403665