STM32 - cubeIDE+DMA+USART は任意の長さのデータを受信します

usart シリアル ポートの送受信情報については、インターネット上で多くの関連情報を見つけることができますが、ほとんどの情報では限られた文字しか送信できません。無制限の文字を送信できるものもありますが、ほとんどの情報は直接使用できず、あまり親切ではありません。初心者へ。次のことを実行するだけです。実際に達成するのは非常に簡単です

1. USART1 を設定し、非同期を選択すると、ソフトウェアが PA9 ピンと PA10 ピンを自動的に設定します。

2. クロック ツリーを構成します。デフォルトのものを使用し、コードを生成します。

3. UASRTシリアルポートプログラムを変更する

まず最初に宣言させてください。

volatile uint8_t rx_len = 0;             //接收一帧数据的长度
volatile uint8_t recv_end_flag = 0;    //一帧数据接收完成标志
uint8_t rx_buffer[200]={0};   //接收数据缓存

静的 void MX_USART1_UART_Init(void) 関数を変更する

直接コピーするだけです。コードは次のとおりです。  

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //IDLE を中断する
  HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);

3. シリアルポート割り込み関数(stm32f4xx_it.c)を修正します。

void USART1_IRQHandler(void) //シリアルポート割り込み
{     uint32_t tmp_flag = 0;     uint32_t temp;

    HAL_UART_IRQHandler(&huart1);
    if(USART1 == huart1.Instance)
    {         tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //IDLE設定の準備

        if((tmp_flag != RESET))//アイドルフラグが設定されている
        {             recv_end_flag = 1; //完了フラグ位置 1 を受け入れる             __HAL_UART_CLEAR_IDLEFLAG(&huart1);//フラグビットをクリア

            HAL_UART_DMAStop(&huart1); //
            temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); // DMA 内の未送信データ数を取得
            rx_len = BUFFER_SIZE - temp; // 未送信データ数から合計カウントを減算して、DMA 内の未送信データ数を取得します受信番号

            HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//DMA 受信を再度オープンします
        }
    }
 }

4. main 関数内のシリアル ポート割り込み処理関数の場合、main() 関数に次のコードを追加します。

 while (1)
  {     /* ユーザーコード終了 WHILE */

    /* USER CODE BEGIN 3 */
      if(recv_end_flag ==1)
              {                   printf("rx_len=%d\r\n",rx_len);// 受信した長さを出力する                   HAL_UART_Transmit(&huart1,rx_buffer, rx_len,200);/ / 受信データを出力                   for(uint8_t i=0;i<rx_len;i++)                       {                           rx_buffer[i]=0;//受信バッファをクリア                       }                   rx_len=0;//カウントをクリア                   recv_end_flag=0;//クリア受信終了フラグビット               }               HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//DMA受信を再開します









  }
  /* ユーザーコード終了 3 */

5. 急いでコンパイルしてテストしてください。必要な数の文字を返すことができます。

おすすめ

転載: blog.csdn.net/llq_the7/article/details/108649569