stm32 串口通信

github_38905894 2017-10-11 02:13:29
void USART1_IRQHandler(void)                
{
u8 Res;
val = hc5951[0];
val2 = hc5951[1];

// if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
// {
// USART_RX_BUF[byte_count]=USART_ReceiveData(USART1);//(USART1->DR);
// byte_count++;
// }


#if SYSTEM_SUPPORT_OS
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART1);

printf("%d",Res);

USART_RX_BUF[rCnt] = Res;
if(rCnt == 0) //??0xFF
{
if(0xFF != Res)
{
rCnt = 0;
}else
{
rCnt = 1;
printf("帧头1开始\r\n");
}
}
else if(rCnt == 1)
{
if(0x5A != Res)
{
rCnt = 0;
}else
{
rCnt = 2;
printf("帧头2开始\r\n");
}
}
else if(rCnt>1)
{
// printf("22222222");
if(Res == 0x5B)
{
printf("22222222");
rCnt++;
printf("%d\r\n",rCnt);
}
else
{
// rCnt = 0;
printf("%d\r\n",rCnt);
}
}
else if(rCnt == 3)
{
printf("帧尾结束1\r\n");

if(0x5C != Res)
{
rCnt = 0;
}
else
{
rCnt = 0;
printf("帧尾结束2\r\n");
}
}


}
#if SYSTEM_SUPPORT_OS
OSIntExit();
#endif
}
#endif



不知道为什么,就是不执行else if(rCnt == 3)这一段,可能我哪写错了,但就是看不出来,以下是串口助手的数据
...全文
823 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
XIAO007YAO 2017-10-27
  • 打赏
  • 举报
回复
把print放外面,中断里给个标志就可以了!
jobszheng5 2017-10-19
  • 打赏
  • 举报
回复
的确如楼上所说 中断里面尽量不要执行如此耗时的程序。
tianxj001 2017-10-17
  • 打赏
  • 举报
回复
你在中断函数 调用了printf,我清楚的是,printf这玩意儿非常耗时间的,99%可能是因为中断处理函数时间太长,而你连续发送的间隔,短于中断处理函数相应总时间,加上没有进行容错处理,所以,就产生这样的情况。 你可以把除了最后一个printf以外的全部暂时中止,看看,是不是能正常处理到最后。反正最后一个printf无所谓,时间长点也没有影响。 解决的办法也是有的,首先是提高串口发送波特率,有时候就可能解决问题,再就是不用printf函数,修改串口发送程序,用{“帧头2开始”+0X0D}这样的 数组发送,应该可以解决。
Jerry小白 2017-10-17
  • 打赏
  • 举报
回复
引用 6 楼 qq_28592323 的回复:
这个是在串口助手中每一个字节单次发送的 这张图是一次发送的,为什么结果不一样,单片机好像在接收完第二个字节后就没有再触发串口的中断了
第二张图片里发送里面的19是16,不好意思打错了
Jerry小白 2017-10-17
  • 打赏
  • 举报
回复
这个是在串口助手中每一个字节单次发送的


这张图是一次发送的,为什么结果不一样,单片机好像在接收完第二个字节后就没有再触发串口的中断了
Jerry小白 2017-10-17
  • 打赏
  • 举报
回复
引用 2 楼 tianxj001 的回复:
至于修改,必须根据程序需要,要么把后面一个else if(rCnt == 3) 改成 if(rCnt == 3) 或者修改前面一个else if(rCnt>1) 把交集去掉, 反正,你不能在else if用法里面,使用交集条件,后果不可预知。
不好意思,因为这个号密码忘记了,所以用另外一个号回复你,迟几天我找回密码再来结贴,谢谢。你说这个问题,后来我发现了,已经改过来好用了,但最近又有一个新的问题想问问
weixin_40652388 2017-10-16
  • 打赏
  • 举报
回复
牛逼啊
of123 2017-10-16
  • 打赏
  • 举报
回复
把 else if(rCnt == 3) 与 else if(rCnt>1) 代码段交换一下位。
tianxj001 2017-10-11
  • 打赏
  • 举报
回复
至于修改,必须根据程序需要,要么把后面一个else if(rCnt == 3) 改成 if(rCnt == 3) 或者修改前面一个else if(rCnt>1) 把交集去掉, 反正,你不能在else if用法里面,使用交集条件,后果不可预知。
tianxj001 2017-10-11
  • 打赏
  • 举报
回复
前一个 else if(rCnt>1) 后一个 else if(rCnt == 3) else if 转移是互斥的,当前一个else if 已经包含后面的条件,后面一个就不可以进入,你的>1 和==3有交集,不符合互斥条件,当然不可能进后面一个。

27,372

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧