測試軟件及硬件平臺
- CubeMX;
- Keil5;
- 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); //再開啓接收中斷
}
不定長接收核心部分結束,代碼測試可用。僅作記錄,歡迎交流。