串口接收,不定长数据接收

###1.CUBE-MX配置串口

2.我采用串口中断接收,打开中断接口

3.时钟同样8倍频,1分频,使用内部时钟

c 复制代码
打开串口中断
main()
{
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // 启用空闲中断
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); // 启用接收数据就绪中断
	HAL_UART_Receive_IT(&huart1,RxData,1); // 启动接收
	while(1)
	{
		HAL_UART_Transmit(&huart1,(uint8_t *)&crc,2,HAL_MAX_DELAY);//发送函数,第一个参数串口的句柄huart1,第二个参数发送的内容crc,这个地方自己修改:HAL_MAX_DELAY这个参数表示无限等待下去,直到发送成功为止
		
		
	}
	}

主函数写完了,现在进行对中断函数处理,这里进行一个字符一个字符的接收

c 复制代码
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	// 检查接收数据就绪标志
	if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) 
	{
			//从USART接收一个字节,并存储到RxData数组
		RxData[temp++] = USART1->DR;
	}
	else if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)
	{
	// 检查空闲标志
			uint32_t temp1;
			temp1 = huart1.Instance->SR; // 读取 SR 寄存器
			temp1 = huart1.Instance->DR; // 读取 DR 寄存器
			Counter_RSUSART =temp;
			// 重置计数器,准备接收下一帧数据
			temp = 0;
	}
	
  HAL_UART_IRQHandler(&huart1);//重新打开中断
  /* USER CODE END USART1_IRQn 1 */
}

参考这个博主

https://blog.csdn.net/qq_25814297/article/details/123082048

https://www.eeworld.com.cn/mcu/eic669733.html

上述说的是收到一个字节的数据时RXNE变为1,一直到IDLE变为1的时候证明这一包数据接收完毕了,要读掉这两个变量,下次才能继续。

原理就是一个字节一个自己的接收,直到IDLE变为1,我进行清除。再进行接收

相关推荐
一只小灿灿16 分钟前
基于 Keil 的 STM32 全模块开发
stm32·单片机·嵌入式硬件
樂禮21 分钟前
嵌入式51单片机:C51
单片机·嵌入式硬件·51单片机
青牛科技-Allen1 小时前
TS01S:单通道差分灵敏度校准电容触摸传感器芯片
单片机·嵌入式硬件·物联网·pd快充·家电变频控制·工业电机驱动系统
平凡灵感码头2 小时前
AT 指令详解:基于 MCU 的通信控制实战指南AT 指令详解
单片机·嵌入式硬件
猪猪童鞋2 小时前
基于正点原子阿波罗F429开发板的LWIP应用(1)——网络ping通
单片机·嵌入式硬件
0xCC说逆向3 小时前
Windows逆向工程提升之二进制分析工具:HEX查看与对比技术
汇编·windows·单片机·嵌入式硬件·安全·pe结构·pe文件
长流小哥3 小时前
STM32实战指南:DHT11温湿度传感器驱动开发与避坑指南
stm32·单片机·嵌入式硬件·keil5
Dev_XH3 小时前
【成品设计】基于Arduino的自动化农业灌溉系统
单片机·智能家居
Wythzhfrey4 小时前
单片机Day11
c语言·单片机·嵌入式硬件·学习·51单片机
HHONGQI1235 小时前
STM32 片上资源之串口
stm32·单片机·嵌入式硬件