在 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:
發佈留言