stm32串口接收不到数据的一些问题

菜鸟写的经验,大佬勿喷!!

最近在搞stm32的接收通信,用的正点原子的例程,打算用串口2进行通信,然后发现各种各样的的问题.比如只能收到一个字符,只能收到首个和末尾两个字符,收到字符时死机…等等一堆问题。
调了一下午,发现。。。原来是我在USART2_IRQHandler中断函数里面用了正点原子的printf();正点原子这个printf函数已经重映射到串口1了,这样的话就相当于在USART2_IRQHandler中断函数里面嵌套了另外一个串口发送中断。问题就是自己定义的usart2中断优先级比printf的优先级还要高,然后就死在USART2_IRQHandler函数里了。。。出现什么只接收一个或两个字符也是这个问题的不同版本(你的printf函数放在不同位置。)

综上所述,在用正点原子提供的例程调试其他串口时,要注意中断优先级,最好不要在串口中断函数里面用printf函数来调试!!
最后放一下我的串口接收字符串函数,记得千万别用printf去调试!!!谨记

char USART_ReceiveString[50];													//缓存字符数组
int Receive_sum = 0;	
void USART2_IRQHandler(void) // 串口2中断服务函数
{
	u8 res;
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
			res =USART_ReceiveData(USART2);	//读取接收到的数据
			USART_ClearITPendingBit(USART2, USART_IT_RXNE);
			if(res!=0x0d&&res!=0x0a)
				{
				if(Receive_sum==0)
					{
					memset(USART_ReceiveString,0,sizeof(USART_ReceiveString));//当重新接受时重置字符串
					}
				USART_ReceiveString[Receive_sum]=res;
				Receive_sum++;
			}
			else//接收到结束符
				{
				Receive_sum=0;
			}	 
    } 
}

串口发送字符串函数

void USART_SendString(USART_TypeDef* USARTx, char *DataString)
{
	int i = 0;
	USART_ClearFlag(USARTx,USART_FLAG_TC);										//发送字符前清空标志位(否则缺失字符串的第一个字符)
	while(DataString[i] != '\0')												//字符串结束符
	{
		USART_SendData(USARTx,DataString[i]);									//每次发送字符串的一个字符
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == 0);					//等待数据发送成功
		USART_ClearFlag(USARTx,USART_FLAG_TC);									//发送字符后清空标志位
		i++;
	}
}

版权声明:本文为CSDN博主「Fandes_F」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Fandes_F/article/details/122278697

生成海报
点赞 0

Fandes_F

我还没有学会写个人说明!

暂无评论

相关推荐

基于STM32的高精度频率计设计

前言 本文记录了博主完成的一个课设作品(学分为3.5分),题目需要利用ARM做出一个高精度频率计。具体要求如下: 1)实现对10M以内数字信号频率的高精度测量&#xff0c

HAL库控制PS2手柄

吐槽一下 最近买了个ps2手柄,结果买家发的例程全都是好几年前的库函数版本,尝试移植基本没啥可能。虽然PS2手柄已经被开发很久了,不过我看网上用hal库来写控制的很少,例程也都是用库函数

STM32G4之RTC实时时钟

前言 一、RTC介绍 STM32 的 RTC 外设(Real Time Clock) ,实质是一个掉电后还继续运行的定时器。STM32G4 的 RTC,是一个独立的 BCD 定时器/计数器

stm32进不去串口中断的问题

今天遇到了特别棘手的问题,程序进入串口中断 原本应该进入这段程序: void USART1_IRQHandler(void) {if(USART_GetITStatus(USART1,USART_IT_RXNE)