OpenEdv-开源电子网

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

stm32f103 诡异串口!!调了5天! 求大神明示

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-10-1
在线时间
0 小时
发表于 2015-10-1 20:04:40 | 显示全部楼层 |阅读模式
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#楼]

你这个程序非常不严谨,容易漏数据导致出错,最后的方式是完全按照通信协议来接收和解析数据。如果不想按通信协议大改的话,建议按如下示例修改: j = 0; k = 0; while(1) {    while(USART_GetFlagStatus(USART1,USART_IT_RXNE) != SET);//  等待UART1接收到数据    j = USART_ReceiveData(USART1);     if(j ==&nbs ...
菜鸟求关注
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-6-6
在线时间
2 小时
发表于 2015-10-1 20:04:41 | 显示全部楼层
你这个程序非常不严谨,容易漏数据导致出错,最后的方式是完全按照通信协议来接收和解析数据。如果不想按通信协议大改的话,建议按如下示例修改:

j = 0;
k = 0;
while(1)
{
   while(USART_GetFlagStatus(USART1,USART_IT_RXNE) != SET);//  等待UART1接收到数据
   j = USART_ReceiveData(USART1); 
   if(j == 0xA5)
      break;
}

   printf("%x ",j);//   通过UART2发送接收到的首字节
   for(j=0;j<=5;j++)//   继续通过UART1接收6字节数据,并通过UART2发送出去
   {
      while(USART_GetFlagStatus(USART1,USART_IT_RXNE) != SET);//  等待UART1接收到数据
      j = USART_ReceiveData(USART1); 
      printf("%x ",j);
   }
}
三更有梦书当枕,千里怀人月在峰!
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-10-2 13:14:13 | 显示全部楼层
if(i[0]== 165)
j++;

代表條件如果不成立 J永遠不會++

問題出在於 你寫死的i[0]
如果不小心漏了 0xA5 就不會有下一步了

建議你全收下來 後面再用程式去把他過濾
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-10-1
在线时间
0 小时
 楼主| 发表于 2015-10-3 08:27:31 | 显示全部楼层
回复【2楼】Rocks:
---------------------------------
您说的对。原因就出在这里,但是也没法全收,因为我不知道最后一个字节是什么,也就是说,我不知道该收多少数据。所以这种代码是最好的
菜鸟求关注
回复

使用道具 举报

1

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-6-6
在线时间
2 小时
发表于 2015-10-3 10:42:14 | 显示全部楼层
抱歉最后那个循环里的j变量用得有冲突,这里修订后重发一遍:
j = 0;
while(1)
{
   while(USART_GetFlagStatus(USART1,USART_IT_RXNE) != SET);//  等待UART1接收到数据
   j = USART_ReceiveData(USART1);
   if(j == 0xA5)//   收到A5后跳出循环,否则继续接收等待
      break;
}

   printf("%x ",j);//   通过UART2发送接收到的首字节
   for(j=0;j<=5;j++)//   通过UART1接收6字节数据,并通过UART2发送出去
   {
      while(USART_GetFlagStatus(USART1,USART_IT_RXNE) != SET);//  等待UART1接收到数据
      printf("%x ",USART_ReceiveData(USART1));
   }
}
三更有梦书当枕,千里怀人月在峰!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 12:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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