2019年9月27日星期五

[STM32]如何使用 UART 接收不定長度的資料

有很多情況接收UART 時會遇到未知長度的資料,例如 Modbus , AT Command...。而HAL function 卻沒有直接提供相對應的方法。這裡介紹簡單的範例,此時要利用 UART IDLE 中斷才能實現。
在 main.c 定義相關變數

uint8_t RxBuffer[1024];
uint8_t UartReady;
uint8_t RxCount;

在 while(1) 前定義 ,啟動 IDEL 中斷功能  並使用 UART 接收中斷

__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuffer, 1024);

因為是使用 UART 中斷 所以 改寫 IRQHandler function


extern uint8_t UartReady;
extern uint8_t RxCount;

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

 if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) != RESET)
 {
  RxCount = 1024 - huart2.RxXferCount;
  __HAL_UART_CLEAR_IDLEFLAG(&huart2);
  HAL_UART_AbortReceive_IT(&huart2);

  UartReady = SET;
 }
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}

因為是靠 UartReady 做接收資料檢知, 所以必需要另外做一個獨立 loop 來處理接收進來的 Data。


while(1)
{
 if(UartReady == SET)
 {
  //RxBuffer do something.....
  
  UartReady = RESET;
  HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuffer, 1024);  
 }
 HAL_Delay(100);
}

此時的 RxBuffer 就可以丟給後端程式解析處理了,RxCount 也順便計算出此次接收的資料長度。





0 comments:

發佈留言