文章目录[隐藏]
菜鸟写的经验,大佬勿喷!!
最近在搞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
暂无评论