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

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

暂无评论

发表评论

相关推荐

STM32F2————配置时钟延迟不准的问题

STM32F2配置时钟问题 笔者在本科毕业设计使用STM32F207芯片,但是在配置时钟时出现了问题。 问题 我按照F1写代码的延时函数放在F2竟然不准了 换个办法 使用Systick时钟也是不准,原因是笔者代

为什么重写printf函数没有用?

以前在网上找了无数方法去重写printf函数,但发现都没效果,今天偶然发现重写printf函数可以了,原因是以前没有勾选微库(Use MicroLlB)! 这里