开源免费企业网站系统,泰安网站建设哪家强,无水印logo免费一键生成,域名解析网站建设【星云 Orbit-F4 开发板】用判断数据尾来接收一串数据的串口通用程序框架
摘要
本文介绍了一种基于STM32F407微控制器的串口数据接收通用程序框架。该框架通过判断数据尾来实现一串数据的完整接收#xff0c;适用于需要可靠数据传输的应用场景。本文从零开始#xff0c;详细…【星云 Orbit-F4 开发板】用判断数据尾来接收一串数据的串口通用程序框架
摘要
本文介绍了一种基于STM32F407微控制器的串口数据接收通用程序框架。该框架通过判断数据尾来实现一串数据的完整接收适用于需要可靠数据传输的应用场景。本文从零开始详细讲解了STM32F407串口基础知识、配置步骤、HAL库函数详解并提供了完整的代码示例和注释。目标读者为嵌入式开发小白内容通俗易懂适合快速上手。 1. 引言
在嵌入式开发中串口通信是一种常用的通信方式。本文旨在解决一个常见问题如何通过STM32F407的串口接收一串数据并通过判断数据尾来确保数据的完整性。
本文将从零开始逐步讲解以下内容
基础知识STM32F407串口的基本概念和工作机制。配置步骤如何手动配置STM32F407的串口不使用STM32CubeMX。HAL库函数详解如何使用STM32 HAL库实现串口接收功能。代码实现提供完整的代码框架和注释。使用示例通过实际案例展示如何使用该框架。 2. 基础知识
2.1 STM32F407的串口
STM32F407芯片集成了多个USARTUniversal Synchronous Asynchronous Receiver Transmitter模块支持同步和异步通信模式。本文将使用USART1模块。
2.2 数据尾判断
在串口通信中数据通常以帧的形式传输。为了确保数据的完整性我们需要通过特定的标志数据尾来判断一帧数据是否传输完成。例如可以使用固定的字节序列如 0xEB 0x00 0x55作为数据尾。
2.3 数据接收流程
数据接收流程如下
初始化配置串口参数波特率、数据位、停止位等。接收数据通过中断或轮询方式接收数据。判断数据尾在接收到数据后检查是否包含数据尾标志。处理数据如果检测到数据尾提取有效数据并进行后续处理。 3. 配置步骤
3.1 时钟配置
在使用串口之前需要配置时钟系统。以下是关键配置步骤
启用AHB1时钟确保USART1时钟被启用。配置系统时钟设置系统时钟频率本文假设为110.592 MHz。
// 配置时钟
RCC-AHB1ENR | RCC_AHB1ENR_GPIOAEN; // 启用GPIOA时钟
RCC-APB2ENR | RCC_APB2ENR_USART1EN; // 启用USART1时钟3.2 GPIO配置
配置GPIO引脚用于串口通信。本文使用PA9TX和PA10RX。
// 配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStructure.Mode GPIO_MODE_AF_PP;
GPIO_InitStructure.Pull GPIO_PULLUP;
GPIO_InitStructure.Speed GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Alternate GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA, GPIO_InitStructure);3.3 USART配置
配置USART参数包括波特率、数据位、停止位和校验位。
// 配置USART
UART_HandleTypeDef huart1;huart1.Instance USART1;
huart1.Init.BaudRate 9600;
huart1.Init.WordLength UART_WORDLENGTH_8B;
huart1.Init.StopBits UART_STOPBITS_1;
huart1.Init.Parity UART_PARITY_NONE;
huart1.Init.Mode UART_MODE_RX | UART_MODE_TX;
huart1.Init.HwFlowCtl UART_HWCONTROL_NONE;HAL_UART_Init(huart1);3.4 中断配置
启用USART接收中断。
// 配置中断NVIC_EnableIRQ(USART1_IRQn);4. HAL库函数详解
4.1 HAL_UART_Init
初始化USART模块。
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart, UART_InitTypeDef *pInitStruct)4.2 HAL_UART_Transmit
发送数据。
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)4.3 HAL_UART_Receive_IT
启用接收中断。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)4.4 USART1_IRQHandler
USART中断服务函数。
void USART1_IRQHandler(void)
{if (__HAL_UART_GET_FLAG(huart1, UART_FLAG_RXNE) ! RESET){// 处理接收数据}
}5. 代码实现
5.1 初始化函数
void SystemClock_Config(void)
{// 配置系统时钟
}void MX_USART1_UART_Init(void)
{// 配置USART1
}void MX_GPIO_Init(void)
{// 配置GPIO
}5.2 数据接收函数
void USART1_IRQHandler(void)
{static uint8_t rxBuffer[RC_BUFFER_SIZE] {0};static uint16_t rxIndex 0;if (__HAL_UART_GET_FLAG(huart1, UART_FLAG_RXNE) ! RESET){rxBuffer[rxIndex] HAL_UART_Read_RX(huart1);if (rxIndex RC_BUFFER_SIZE){// 数据尾判断if (CheckDataTail(rxBuffer, rxIndex)){// 处理数据ProcessData(rxBuffer, rxIndex);rxIndex 0;}}}
}5.3 数据处理函数
bool CheckDataTail(uint8_t *data, uint16_t length)
{// 检查数据尾
}void ProcessData(uint8_t *data, uint16_t length)
{// 处理数据
}6. 使用示例
6.1 初始化
int main(void)
{// 初始化HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();// 启用接收中断HAL_UART_Receive_IT(huart1, rxBuffer, RC_BUFFER_SIZE);while (1){// 主循环}
}6.2 数据接收
void USART1_IRQHandler(void)
{// 中断处理
}7. 总结
本文提供了一种基于STM32F407的串口数据接收通用程序框架。通过判断数据尾确保了数据的完整性。本文从零开始详细讲解了配置步骤和代码实现适合嵌入式开发小白快速上手。 8. 附录
8.1 完整代码
#include stm32f4xx_hal.h#define RC_BUFFER_SIZE 100 // 接收缓冲区大小
#define DATA_TAIL_SIZE 3 // 数据尾长度uint8_t rxBuffer[RC_BUFFER_SIZE] {0};
uint16_t rxIndex 0;UART_HandleTypeDef huart1;void SystemClock_Config(void)
{// 配置系统时钟RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM 25;RCC_OscInitStruct.PLL.PLLN 336;RCC_OscInitStruct.PLL.PLLP RCC_PLLP_DIV4;RCC_OscInitStruct.PLL.PLLQ 7;if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK){// 配置错误while (1);}RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2) ! HAL_OK){// 配置错误while (1);}
}void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStructure.Pin GPIO_PIN_9 | GPIO_PIN_10;GPIO_InitStructure.Mode GPIO_MODE_AF_PP;GPIO_InitStructure.Pull GPIO_PULLUP;GPIO_InitStructure.Speed GPIO_SPEED_FREQ_HIGH;GPIO_InitStructure.Alternate GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA, GPIO_InitStructure);
}void MX_USART1_UART_Init(void)
{huart1.Instance USART1;huart1.Init.BaudRate 9600;huart1.Init.WordLength UART_WORDLENGTH_8B;huart1.Init.StopBits UART_STOPBITS_1;huart1.Init.Parity UART_PARITY_NONE;huart1.Init.Mode UART_MODE_RX | UART_MODE_TX;huart1.Init.HwFlowCtl UART_HWCONTROL_NONE;huart1.Init.OverSampling UART_OVERSAMPLING_16;if (HAL_UART_Init(huart1) ! HAL_OK){// 配置错误while (1);}// 启用接收中断HAL_UART_Receive_IT(huart1, rxBuffer, RC_BUFFER_SIZE);
}void USART1_IRQHandler(void)
{if (__HAL_UART_GET_FLAG(huart1, UART_FLAG_RXNE) ! RESET){rxBuffer[rxIndex] HAL_UART_Read_RX(huart1);if (rxIndex RC_BUFFER_SIZE){if (CheckDataTail(rxBuffer, rxIndex)){ProcessData(rxBuffer, rxIndex);rxIndex 0;}}}
}bool CheckDataTail(uint8_t *data, uint16_t length)
{if (length DATA_TAIL_SIZE){return false;}// 检查数据尾if (data[length - 3] 0xEB data[length - 2] 0x00 data[length - 1] 0x55){return true;}return false;
}void ProcessData(uint8_t *data, uint16_t length)
{// 处理数据
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();while (1){// 主循环}
}8.2 思维导图
以下是基于STM32F407的串口数据接收程序框架的思维导图 流程图说明 开始程序启动。 系统初始化配置STM32F407的硬件和外设。 配置时钟配置系统时钟确保外设时钟正确。配置GPIO配置与USART相关的GPIO引脚如TX和RX引脚。配置USART初始化USART外设设置波特率、数据位、停止位和校验位。 数据接收启用USART的接收中断等待数据接收。 启用接收中断配置USART的中断使能接收中断。中断服务函数当接收到数据时进入中断服务函数读取接收到的数据。 数据处理对接收到的数据进行处理。 检查数据尾检查数据是否完整确认数据尾。处理数据对接收到的数据进行解析或存储。 主循环程序进入主循环执行轮询任务。 执行轮询任务在主循环中执行一些周期性任务如状态监控、按键扫描等。 结束程序结束。
8.3 状态转换图 初始化程序开始进入初始化状态。配置时钟配置系统时钟确保外设时钟正确。配置GPIO配置与USART相关的GPIO引脚如TX和RX引脚。配置USART初始化USART外设设置波特率、数据位、停止位和校验位。启用接收中断配置USART的中断使能接收中断。接收数据等待数据接收。接收中断当接收到数据时触发中断服务函数。读取数据在中断服务函数中读取接收到的数据。检查数据尾检查数据尾是否存在以确定数据是否完整。数据尾存在如果检测到数据尾处理数据。处理数据对接收到的数据进行解析或存储。重置接收索引在数据处理完成后重置接收索引准备接收新的数据。数据尾不存在如果未检测到数据尾继续接收数据。主循环程序进入主循环执行轮询任务。执行轮询任务在主循环中执行一些周期性任务如状态监控、按键扫描等。结束程序结束。