OpenEdv-开源电子网

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

求助串口接收程序时值有误。真的受不了了,调了两天

[复制链接]

5

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-4-16
在线时间
12 小时
发表于 2016-9-3 19:37:30 | 显示全部楼层 |阅读模式
串口处理程序如下,初始化就不贴了。。问题:当接好串口精灵时时,手动发送0xEE 0X4D时,串口接收到两次“正确”指令。。。实际应该一次“正确”啊?
         为什么我发一次指令会返回两次“正确”。。请各位大神指教!!!

请各位帮帮忙,最近公司要求学习stm32.
     u8 i=0;  u8 dat[2];   
       Void USART1_IRQHandler(void)        
        {

         if(i>1)  i=0;
         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
                {
                  
                     dat=USART_ReceiveData(USART1);            //将接收到的两位数据存入数组
                     i++;                       
                 }

                if((dat[0]==0xEE)&&(dat[1]==0x4D))            //判读接收是否为0xEE,0X4D       
                {
                      printf("正确\r\n");               
                }
           }
               


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-7-23
在线时间
23 小时
发表于 2016-9-3 19:59:38 | 显示全部楼层
这么说吧,你的数组没有初始化,然而Keil编译器对没有初始化的数组默认设置的值是随机的。所以说你能看到两次正确。你看随便写的程序,gcc对数组的默认初始化
EWQQK64M@E7{Q43V_([(LVH.png
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-4-16
在线时间
12 小时
 楼主| 发表于 2016-9-3 20:18:41 | 显示全部楼层
woaiwm 发表于 2016-9-3 19:59
这么说吧,你的数组没有初始化,然而Keil编译器对没有初始化的数组默认设置的值是随机的。所以说你能看到两 ...

你好,我刚刚试了将u8  dat[2]={0x00,0x00};现在只能收到两组数据了,再发串口就没有响应,这是什么原因。麻烦能解释一下吗?不甚感激!!!
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-4-16
在线时间
12 小时
 楼主| 发表于 2016-9-3 20:19:25 | 显示全部楼层
woaiwm 发表于 2016-9-3 19:59
这么说吧,你的数组没有初始化,然而Keil编译器对没有初始化的数组默认设置的值是随机的。所以说你能看到两 ...

C:\Users\Administrator\Desktop
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-7-23
在线时间
23 小时
发表于 2016-9-3 20:30:40 | 显示全部楼层

你的串口中断里面没把中断标志位清除啊,那样标志位一直就存在,肯定只能一次啊。你加上清除标志位的代码,就是ClearITPending那句代码。试试看呗
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-4-16
在线时间
12 小时
 楼主| 发表于 2016-9-3 20:58:01 | 显示全部楼层
woaiwm 发表于 2016-9-3 20:30
你的串口中断里面没把中断标志位清除啊,那样标志位一直就存在,肯定只能一次啊。你加上清除标志位的代码 ...

我在进入中断后加入USART_ClearITPendingBit(USART1,USART_IT_RXNE);        后还是只能发两次数据,之后就接收不到了。这是什么原因
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-4-16
在线时间
12 小时
 楼主| 发表于 2016-9-3 21:02:02 | 显示全部楼层
woaiwm 发表于 2016-9-3 20:30
你的串口中断里面没把中断标志位清除啊,那样标志位一直就存在,肯定只能一次啊。你加上清除标志位的代码 ...

现在程序这样,还是不行啊        
u8 i=0;  u8 dat[2];   
       Void USART1_IRQHandler(void)        
        {

         if(i>1)  i=0;
         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
                {
                  
                     dat=USART_ReceiveData(USART1);            //将接收到的两位数据存入数组
                     i++;                        
                 }

                if((dat[0]==0xEE)&&(dat[1]==0x4D))            //判读接收是否为0xEE,0X4D        
                {
                      printf("正确\r\n");               
                }
           }
               
回复 支持 反对

使用道具 举报

3

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
434
金钱
434
注册时间
2013-3-18
在线时间
82 小时
发表于 2016-9-3 21:29:36 | 显示全部楼层
读操作就可以清中断标志位,另外,你的存入数组的方式存在严重问题
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-4-16
在线时间
12 小时
 楼主| 发表于 2016-9-3 21:29:52 | 显示全部楼层
已经解决了,应该给数组清一下0
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 00:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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