STM32cubemx学习记录——使用UART接收不定长的消息

本文详细介绍了如何在STM32F407开发板上配置和使用串行通信接口(COM接口),包括时钟配置、串口参数设置及中断启用。通过示例代码展示了如何以中断方式发送和接收数据,最后通过串口调试助手验证了程序的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

串口

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信

STM32cube

一、配置

1、新建工程,选择对应开发板
在这里插入图片描述
我使用的是STM32F407
2、时钟配置
在这里插入图片描述
在这里插入图片描述
这里要根据自己对应的开发板去配置
3、配置串口,波特率设置为115200
在这里插入图片描述
开启串口中断
在这里插入图片描述
4、生成代码
在这里插入图片描述

二、修改代码

1、打开生成的代码,编译一遍
在这里插入图片描述
2、函数介绍
在这里插入图片描述
HAL_UART_Transmit_IT:以中断的方式发送数据
HAL_UART_Receive_IT:开启中断,接收数据
3、修改代码
在主函数添加相关变量
在这里插入图片描述
在main函数中初始化变量和开启串口中断
在这里插入图片描述
重写接收完成之后中断的回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
	if(huart->Instance == USART1)
	{
		if(UART1_Length>254)
		{
			UART1_Length=0;
			HAL_UART_Transmit(&huart1,(uint8_t *)"Too Long!\r\n",11,1000);
			memset(UART1_DatBuff,0,255);
		}
		else 
		{
			UART1_DatBuff[UART1_Length++]=UART1_Dat;
			if(UART1_DatBuff[UART1_Length-1]==0x0A&&UART1_DatBuff[UART1_Length-2]==0x0D)
			{
				HAL_UART_Transmit(&huart1,UART1_DatBuff,UART1_Length,1000);
				UART1_Length=0;
				memset(UART1_DatBuff,0,255);
			}
		}
		HAL_UART_Receive_IT(&huart1,&UART1_Dat,1);
	}
}
三、下载测试

将程序烧入开发板,并打开串口调试助手测试
效果如图
在这里插入图片描述

### 配置STM32CubeMX中的UART用于串口通信接收STM32CubeMX环境中配置UART以实现有效的串口通信接收控制涉及多个方面。首先,在创建新的工程时,需基于已有的STM32CubeMX工程基础(如调试方式的选择及时钟树的设定),进一步针对UART外设进行具体参数调整[^1]。 对于USART或UART端口的具体配置而言,应将其工作模式设置为异步通信,并且可以选择关闭硬件流控选项以便简化设计[^2]。当涉及到特定应用场景下的数据传输需求时——比如与4G模块交互过程中可能遇到的数据包长度不确定的情况,则需要特别关注如何高效处理这些不定长消息帧[^3]。 为了优化资源利用效率并提高系统的响应速度,推荐采用中断驱动的方式来进行消息接收。这意味着除了基本的UART初始化之外,还需要额外配置NVIC (Nested Vectored Interrupt Controller),即嵌套向量中断控制器的相关属性来启用相应的中断服务程序(ISR)[^4]。一旦接收到新字符触发了RXNE标志位的变化,ISR内部就可以执行读取寄存器的操作并将获取到的内容保存下来供后续解析使用。 下面是一个简单的例子展示如何编写这部分逻辑: ```c void USART1_IRQHandler(void){ /* 检查是否发生了接收缓冲区非空中断 */ if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) { uint8_t ch; /* 从数据寄存器中取出最新到达的一个字节 */ ch = READ_REG(huart1.Instance->DR); // 这里可以加入更多自定义功能,例如存储接收到的数据至数组或其他容器 /* 如果有必要的话还可以清除任何待处理的状态标记 */ __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC | UART_FLAG_ORE); } } ``` 此段代码片段展示了在一个典型的UART中断处理器内应该如何检测是否有可用的新输入以及怎样安全地访问该信息而不影响其他正常运行的任务。值得注意的是,实际应用中往往还会结合环形缓冲区或者其他高级机制来增强性能表现和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值