STM32 在串口终端增加数据处理后,无法正确接受数据

yyang0514 yyang0514 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
现象:
1.通过电脑向STM32 串口发送数据0xaa,0x6f,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,当满足一定条件时,串口数据在主函数打印接收到的数据。如第一段代码所示。
2.当在串口1中断增加数据处理时,串口数据只有前两位是正确的,结果为0xaa,0x6f,0x6f,0x6f,0x6f,0x6f,0x0,0x0,0x0,0x0 。如第二段代码所示。
3.当串口1中断只做接收数据时,串口能完整接收数据。如第三段代码所示。

在main.c中用如下代码进行打印:

while(1)
{
if(1==usart_flag)
{

printf("STM32 receive data\r\n");
for(i=0;i<10;i++)
{
printf("0x%x,",usart_buff[i]);
}
printf("\r\n");
usart_flag=0;
}
}

SMT32用以下代码只有前2个字节数据正确。STM32 打印 结果为0xaa,0x6f,0x6f,0x6f,0x6f,0x6f,0x0,0x0,0x0,0x0,

void USART1_IRQHandler(void)
{

u8 key=0;
u16 i=0,j=0;
u8 input=0;

if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{

while(input!=0xaa)
{
input=USART_ReceiveData(USART1);
}//寻找帧头
usart_buff[count++]=0xaa;
printf("get the head\r\n");
key=USART_ReceiveData(USART1);

usart_buff[count++]=key;
printf("key =0x%x\r\n",key);

#if 1

switch(key)
{
case 'o'://接收到PC->STM32板的消息接收成功消息
{

//获取长度
for(i=0;i<4;i++)
{
usart_buff[count++]=USART_ReceiveData(USART1);
}
//获取data,命令O 没有数据
//获取CRC32
for(i=0;i<4;i++)
{
usart_buff[count++]=USART_ReceiveData(USART1);
}
usart_flag=1;
break;
}
default: break;
}
#endif
}
}


STM32用以下代码,能够完全接受数据:

void USART1_IRQHandler(void)
{

u8 key=0;
u16 i=0,j=0;
u8 input=0;

if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
usart_buff[count++]=USART_ReceiveData(USART1);
if(count>8)
{
usart_flag=1;
}

}

}
...全文

相关推荐

评论 13
收藏 已收藏
分享
返回顶部
yyang0514
单片机/工控 27,522 成员 28,796 内容