Lanqiao CupEmbedded-シリアル通信関連

基礎

CT117E開発ボードは2つのシリアルポートにつながっていますが、シリアルポート1は通常使用されない9ピンポートに接続されているため、シリアルポート2の回路のみを使用します。
ここに画像の説明を挿入
シリアルポートの構成手順:

  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++;
     }
  }
}   

main関数での構成:

  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