OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2887|回复: 6

串口接受诡异问题

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-10-1
在线时间
0 小时
发表于 2015-10-1 20:30:05 | 显示全部楼层 |阅读模式
5金钱
这两天调串口快要哭了。。。
大神帮我解决一下。
话说5天前,我要写一个扫描雷达的串口发送程序
于是我开了两个串口,USART1接雷达,USART2接电脑串口住手
雷达文档说,得到雷达是否正常运行的请求报文 A5,52,也就是说我发A5,52给雷达,我就可以收到所要的数据
于是我就写代码了 
核心代码如下
for(j=0;j<=5;)
{
 if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)   
 { 

   i[j++]  = USART_ReceiveData(USART1); 
 }

  for(j=0;j<=6;j++)
{
printf("%x ",i[j]);
}




然后也成功了,我在串口住手上得到了要的数据,可是正常数据前面有有好多用不到的数据。
雷达回给我的报文是以0xA5打头的,回7个数据,前面的乱七八糟的数据要去除,于是我改代码如下:
for(j=0;j<=5;)
{
 if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)   
 { 

   i[j]  = USART_ReceiveData(USART1); 
if(i[0]== 165)
j++;
 }

}


  for(j=0;j<=6;j++)
{
printf("%x ",i[j]);
}


我就让程序不停的接数据,直到接到0xA5开始正式接受其余数据,在我暗自庆幸自己的代码很精简的时候,串口不能发了!!
我怎么都调试不出来!都快哭了! 貌似是卡在第一个循环里,j一直是0,只是貌似是这样,我没有在线调试的东西,不知道问题出在那里,求助大神,我新人一枚,求大神关照!

最佳答案

查看完整内容[请看2#楼]

这个问题成功解决,跟大家成功分享一下。 代码如下: while(time--) {  if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)     {     i[j]  = USART_ReceiveData(USART1);   if( i[0] == 0xA5)  j++;  } 理论上,我写的代码都是对的,可实际上就不一样了 开始的代码是死循环,如果串口出现乱发就蒙了。。。 果真乱发!&nb ...
菜鸟求关注
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-10-1
在线时间
0 小时
 楼主| 发表于 2015-10-1 20:30:06 | 显示全部楼层
这个问题成功解决,跟大家成功分享一下。
代码如下:
while(time--)
{
 if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)   
 { 
   i[j]  = USART_ReceiveData(USART1); 
 if( i[0] == 0xA5)
 j++;
 }

理论上,我写的代码都是对的,可实际上就不一样了
开始的代码是死循环,如果串口出现乱发就蒙了。。。
果真乱发! 刚插上的一颗,串口极其不稳定,就是乱发数据,永远得不到165!
所以死循环了!
教员讲要改变程序的容错性!
谢谢大家
菜鸟求关注
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-10-1
在线时间
0 小时
 楼主| 发表于 2015-10-1 20:31:03 | 显示全部楼层
大神们,你们怎么看?在线等
菜鸟求关注
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-10-1
在线时间
0 小时
 楼主| 发表于 2015-10-1 20:34:58 | 显示全部楼层
没人理吗?原子哥能帮我解决一下吗?
菜鸟求关注
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-10-1
在线时间
0 小时
 楼主| 发表于 2015-10-1 20:38:59 | 显示全部楼层
大神们都没在啊 好无助。。。
菜鸟求关注
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-1 22:54:14 | 显示全部楼层
十一大神都回家了,别太着急

看了程序没发现什么问题,你要确认收发数据,可以通过串口调试一下

你的for循环在此用的感觉有点别扭,可能自己写的还少
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

7

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-10-2
在线时间
7 小时
发表于 2015-10-2 15:15:30 | 显示全部楼层
while(time--) 

 if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)    
 {  
   i[j]  = USART_ReceiveData(USART1);  
   while(USART_GetFlagStatus(USART1,USART_IT_RXNE)==RESET){};
 if( i[0] == 0xA5) 
 j++; 
 }
我觉得你每次接收时应该等待一下。这样可以适应更多的串口波特率。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 11:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表