测试软件及硬件平台
- 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)) //判断结束位是否为rn
{
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); //再开启接收中断
}
不定长接收核心部分结束,代码测试可用。仅作记录,欢迎交流。
测试软件及硬件平台
- 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)) //判断结束位是否为rn
{
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); //再开启接收中断
}
不定长接收核心部分结束,代码测试可用。仅作记录,欢迎交流。
举报