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 */