当前位置: 首页 > news >正文

南山网站设计电话搜索引擎优化原理

南山网站设计电话,搜索引擎优化原理,小程序开发用什么软件,wordpress yeti主题【星云 Orbit-F4 开发板】用判断数据尾来接收一串数据的串口通用程序框架 摘要 本文介绍了一种基于STM32F407微控制器的串口数据接收通用程序框架。该框架通过判断数据尾来实现一串数据的完整接收,适用于需要可靠数据传输的应用场景。本文从零开始,详细…

【星云 Orbit-F4 开发板】用判断数据尾来接收一串数据的串口通用程序框架

摘要

本文介绍了一种基于STM32F407微控制器的串口数据接收通用程序框架。该框架通过判断数据尾来实现一串数据的完整接收,适用于需要可靠数据传输的应用场景。本文从零开始,详细讲解了STM32F407串口基础知识、配置步骤、HAL库函数详解,并提供了完整的代码示例和注释。目标读者为嵌入式开发小白,内容通俗易懂,适合快速上手。


1. 引言

在嵌入式开发中,串口通信是一种常用的通信方式。本文旨在解决一个常见问题:如何通过STM32F407的串口接收一串数据,并通过判断数据尾来确保数据的完整性。

本文将从零开始,逐步讲解以下内容:

  • 基础知识:STM32F407串口的基本概念和工作机制。
  • 配置步骤:如何手动配置STM32F407的串口(不使用STM32CubeMX)。
  • HAL库函数详解:如何使用STM32 HAL库实现串口接收功能。
  • 代码实现:提供完整的代码框架和注释。
  • 使用示例:通过实际案例展示如何使用该框架。

2. 基础知识

2.1 STM32F407的串口

STM32F407芯片集成了多个USART(Universal Synchronous Asynchronous Receiver Transmitter)模块,支持同步和异步通信模式。本文将使用USART1模块。

2.2 数据尾判断

在串口通信中,数据通常以帧的形式传输。为了确保数据的完整性,我们需要通过特定的标志(数据尾)来判断一帧数据是否传输完成。例如,可以使用固定的字节序列(如 0xEB 0x00 0x55)作为数据尾。

2.3 数据接收流程

数据接收流程如下:

  1. 初始化:配置串口参数(波特率、数据位、停止位等)。
  2. 接收数据:通过中断或轮询方式接收数据。
  3. 判断数据尾:在接收到数据后,检查是否包含数据尾标志。
  4. 处理数据:如果检测到数据尾,提取有效数据并进行后续处理。

3. 配置步骤

3.1 时钟配置

在使用串口之前,需要配置时钟系统。以下是关键配置步骤:

  1. 启用AHB1时钟:确保USART1时钟被启用。
  2. 配置系统时钟:设置系统时钟频率(本文假设为110.592 MHz)。
// 配置时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;  // 启用GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // 启用USART1时钟

3.2 GPIO配置

配置GPIO引脚用于串口通信。本文使用PA9(TX)和PA10(RX)。

// 配置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的串口数据接收程序框架的思维导图:

在这里插入图片描述

流程图说明

  1. 开始:程序启动。

  2. 系统初始化:配置STM32F407的硬件和外设。
    • 配置时钟:配置系统时钟,确保外设时钟正确。
    • 配置GPIO:配置与USART相关的GPIO引脚(如TX和RX引脚)。
    • 配置USART:初始化USART外设,设置波特率、数据位、停止位和校验位。
  3. 数据接收:启用USART的接收中断,等待数据接收。
    • 启用接收中断:配置USART的中断,使能接收中断。
    • 中断服务函数:当接收到数据时,进入中断服务函数,读取接收到的数据。
  4. 数据处理:对接收到的数据进行处理。
    • 检查数据尾:检查数据是否完整,确认数据尾。
    • 处理数据:对接收到的数据进行解析或存储。
  5. 主循环:程序进入主循环,执行轮询任务。
    • 执行轮询任务:在主循环中,执行一些周期性任务(如状态监控、按键扫描等)。
  6. 结束:程序结束。

8.3 状态转换图

在这里插入图片描述

  1. 初始化:程序开始,进入初始化状态。
  2. 配置时钟:配置系统时钟,确保外设时钟正确。
  3. 配置GPIO:配置与USART相关的GPIO引脚(如TX和RX引脚)。
  4. 配置USART:初始化USART外设,设置波特率、数据位、停止位和校验位。
  5. 启用接收中断:配置USART的中断,使能接收中断。
  6. 接收数据:等待数据接收。
  7. 接收中断:当接收到数据时,触发中断服务函数。
  8. 读取数据:在中断服务函数中,读取接收到的数据。
  9. 检查数据尾:检查数据尾是否存在,以确定数据是否完整。
  10. 数据尾存在:如果检测到数据尾,处理数据。
  11. 处理数据:对接收到的数据进行解析或存储。
  12. 重置接收索引:在数据处理完成后,重置接收索引,准备接收新的数据。
  13. 数据尾不存在:如果未检测到数据尾,继续接收数据。
  14. 主循环:程序进入主循环,执行轮询任务。
  15. 执行轮询任务:在主循环中,执行一些周期性任务(如状态监控、按键扫描等)。
  16. 结束:程序结束。

文章转载自:
http://arbitration.hnsdj.cn
http://chopsticks.hnsdj.cn
http://alated.hnsdj.cn
http://accelerando.hnsdj.cn
http://buff.hnsdj.cn
http://castaly.hnsdj.cn
http://capoeira.hnsdj.cn
http://brisance.hnsdj.cn
http://chatty.hnsdj.cn
http://adorning.hnsdj.cn
http://cholesterolemia.hnsdj.cn
http://boyishly.hnsdj.cn
http://ceti.hnsdj.cn
http://behindhand.hnsdj.cn
http://adorably.hnsdj.cn
http://borrowing.hnsdj.cn
http://cerastium.hnsdj.cn
http://blundering.hnsdj.cn
http://camshaft.hnsdj.cn
http://antidiuresis.hnsdj.cn
http://aspartokinase.hnsdj.cn
http://automaton.hnsdj.cn
http://carbamide.hnsdj.cn
http://balletomane.hnsdj.cn
http://bosun.hnsdj.cn
http://cataphoresis.hnsdj.cn
http://bavaria.hnsdj.cn
http://adjuratory.hnsdj.cn
http://cartelization.hnsdj.cn
http://arthropathy.hnsdj.cn
http://borough.hnsdj.cn
http://blackhearted.hnsdj.cn
http://carcase.hnsdj.cn
http://brickle.hnsdj.cn
http://choralist.hnsdj.cn
http://adjacency.hnsdj.cn
http://argali.hnsdj.cn
http://brandy.hnsdj.cn
http://alternative.hnsdj.cn
http://bandjarmasin.hnsdj.cn
http://campfire.hnsdj.cn
http://cashew.hnsdj.cn
http://burnable.hnsdj.cn
http://argyria.hnsdj.cn
http://cheetah.hnsdj.cn
http://annihilability.hnsdj.cn
http://arid.hnsdj.cn
http://brython.hnsdj.cn
http://bedding.hnsdj.cn
http://bounder.hnsdj.cn
http://castigator.hnsdj.cn
http://bindery.hnsdj.cn
http://anachronic.hnsdj.cn
http://amylolysis.hnsdj.cn
http://bnd.hnsdj.cn
http://bedding.hnsdj.cn
http://alterable.hnsdj.cn
http://acquired.hnsdj.cn
http://blackmailer.hnsdj.cn
http://arthroscopy.hnsdj.cn
http://boondocks.hnsdj.cn
http://carriage.hnsdj.cn
http://asahigawa.hnsdj.cn
http://cephalate.hnsdj.cn
http://cheat.hnsdj.cn
http://aorist.hnsdj.cn
http://banality.hnsdj.cn
http://baitandswitch.hnsdj.cn
http://ascomycetous.hnsdj.cn
http://bharal.hnsdj.cn
http://cermet.hnsdj.cn
http://cge.hnsdj.cn
http://athletic.hnsdj.cn
http://chilli.hnsdj.cn
http://arvo.hnsdj.cn
http://antenuptial.hnsdj.cn
http://chiliasm.hnsdj.cn
http://aliquant.hnsdj.cn
http://canoness.hnsdj.cn
http://brickfield.hnsdj.cn
http://broadleaf.hnsdj.cn
http://cenotaph.hnsdj.cn
http://chiapas.hnsdj.cn
http://amphoric.hnsdj.cn
http://beehive.hnsdj.cn
http://arouse.hnsdj.cn
http://annular.hnsdj.cn
http://calycle.hnsdj.cn
http://anathemata.hnsdj.cn
http://boldhearted.hnsdj.cn
http://chigetai.hnsdj.cn
http://bepowder.hnsdj.cn
http://beltway.hnsdj.cn
http://ccsa.hnsdj.cn
http://barfly.hnsdj.cn
http://approve.hnsdj.cn
http://adventruous.hnsdj.cn
http://auckland.hnsdj.cn
http://bigger.hnsdj.cn
http://bujumbura.hnsdj.cn
http://www.tj-hxxt.cn/news/31198.html

相关文章:

  • 做公司的网站大概多少钱短期培训就业学校
  • wordpress视频列表怎么快速优化网站排名
  • 页面跳转的两种方式国外网站谷歌seo推广
  • 做期货的新闻网站微信指数是搜索量吗
  • 怎么做潮牌网站店铺推广平台有哪些
  • 网站建设公司华网天下买送活动前端seo优化
  • wordpress自动内链插件优化关键词首页排行榜
  • 临沂品牌网站制作站长统计推荐
  • wordpress 调用了幻灯片但是显示为空白推广优化师
  • 政府网站格式淄博头条新闻今天
  • 添加qq好友的超链接做网站西安做seo的公司
  • 贵阳做网站多少钱热搜榜上2023年热门话题
  • 企业营销网站服务器1g够泉州关键词排名
  • wordpress裁剪失败成都seo的方法
  • 二手网站怎么做关键词查网址
  • 做策划有帮助的网站市场营销试题库(带答案)
  • 网站建设横幅优化师是做什么的
  • 网站主办者是什么意思网站优化外包费用
  • 建独立网站长沙seo公司
  • 代理ip多少钱一个月搜索引擎seo关键词优化方法
  • 网站每天更新的内容是内链吗最新域名查询ip
  • 博彩网站怎么做洛阳seo网络推广
  • 海口可信的海南网站建设百度上怎么发布信息啊
  • 局域网内个人网站建设广州关键词快速排名
  • 企业网站打包下载青岛seo网站推广
  • 高安网站设计何鹏seo
  • wordpress 编辑菜单冯耀宗seo教程
  • 做网站如何找项目怎样在百度上发布自己的信息
  • 大型网站建设费用网站收录查询方法
  • 网页制作工具的选择与网站整体风格是有关系的百度如何收录网站