基於STM32F103C8T6 HAL庫不定長接收數據(非DMA)

基於STM32F103C8T6 HAL庫不定長接收數據(非DMA)

測試軟件及硬件平臺

  1. CubeMX;
  2. Keil5;
  3. STM32F103C8T6;

代碼記錄

在程序一開始定義幾個變量:

unsigned char  uRx_Data[255] = {0};    //存儲數組
unsigned char  uLength =  0;    //接收數據長度
unsigned char aRxBuffer;	//接收臨時數據

初始化代碼

 /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  
  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */	
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);//打開接收中斷
  /* USER CODE END 2 */

初始化過程中因爲CubeMX只進行了開啓中斷的操作,並未打開接收中斷,所以需要在MX_USART2_UART_Init();之後打開接收中斷,打開的辦法就是使用HAL_UART_Receive_IT();這個HAL庫函數進行操作。

不定長接收代碼

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接收完成回調函數
{
	if(uLength >= 255)  //溢出判斷
	{
		uLength = 0;
		memset(uRx_Data,0x00,sizeof(uRx_Data));
		//HAL_UART_Transmit(&huart2, (uint8_t *)uRx_Data, sizeof(uRx_Data),0xFFFF);	
	}
	else
	{
		uRx_Data[uLength++] = aRxBuffer;   //接收數據轉存
	
		if((uRx_Data[uLength-1] == 0x0A)&&(uRx_Data[uLength-2] == 0x0D)) //判斷結束位是否爲\r\n
		{
			HAL_UART_Transmit(&huart2, (uint8_t *)uRx_Data, uLength,0xFFFF); //將收到的信息發送出去
			uLength = 0;
			memset(uRx_Data,0x00,sizeof(uRx_Data)); //清空數組,需要在頭文件添加#include "string.h"
		}
	}
	
	HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);   //再開啓接收中斷 
}

不定長接收核心部分結束,代碼測試可用。僅作記錄,歡迎交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章