OpenEdv-开源电子网

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

stm32串口接收的问题

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-7-8
在线时间
1 小时
发表于 2016-7-8 20:16:47 | 显示全部楼层 |阅读模式
1金钱
我的串口接收程序刚开始能够成功接收串口助手发送的一个数据包,然后再发送数据就进不去串口中断了,各位朋友帮忙看看是哪里的问题
void USART1_IRQHandler()
{
        uint8_t ReceiveDate;                                                                //定义一个变量存放接收的数据
       
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)         //读取接收中断标志位USART_IT_RXNE
                                                                                                        //USART_FLAG_RXNE:接收数据寄存器非空标志位
                                                                                                //1:忙状态  0:空闲(没收到数据,等待。。。)
        {


                USART_ClearITPendingBit(USART1,USART_IT_RXNE);        //清楚中断标志位
                    receive[count]=USART_ReceiveData(USART1);
           if(count==0)
                   {
                  if(receive[count]==0x01||receive[count]==0x02)
                   {
                   check^=receive[count];
                    count=1;

                        }
                  else
                  { count=0;
                 //         printf("7");
                  }
                }
                else if(count==1)
                {
                  if(receive[count]==0x3F)
                   {
                    count=2;
                    check^=receive[count];
                //        printf("3");
                        }
                   else
                    {
                                count=0;
                //                 printf("8");
                         }
                }
                else if(count==2)
                {
                 check^=receive[count];
                  count=3;
                //  printf("4");
                }
                else if(count>2&&count<6)
                {
                  check^=receive[count];
                  count++;
        //          printf("5");
                }
                else if(count==6)
                {
                  
                  count=7;
        //          printf("5");
                }
                else if(count==7)
                {
                  count=0;
                  if(receive[6]<<8||receive[7]==check)
                  {
        //                        printf("6");
                         addr=receive[0];
                                 V_H= receive[4];
                                 V_L= receive[5];
                                 LED1=~LED1;

                  }
                  else
                  count=0;
                }
         //   printf("9");
               
        }  
}
       

最佳答案

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

把这句去掉,试一下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-7-11
在线时间
3 小时
发表于 2016-7-8 20:16:48 | 显示全部楼层
回复

使用道具 举报

0

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-6-28
在线时间
7 小时
发表于 2016-7-8 23:01:02 | 显示全部楼层
没看懂你这个程序想表达的意思,但是稍微说几句吧:
1、检查你的中断出发方式是那种,USART_ClearITPendingBit(USART1,USART_IT_RXNE);    这句清理中断标志位是否正确。
2、你这个中断处理函数最好能再简单一点
3、我看到你很多printf函数都注释掉了,因为printf函数要开启USART中断,所以这个函数最好还是不要在中断处理函数中使用
4、没看出来你的printf函数和你这个串口处理中断时不是有冲突,最好能打个包发过来看看。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-7-8
在线时间
1 小时
 楼主| 发表于 2016-7-11 10:07:18 | 显示全部楼层
我的程序主要是实现另一个模块通过串口给stm32发送一串数据,如0X01,0X3F,0X00,0X00,0X00,0X00,0X01,0X3F,然后程序获取这串数据中第6和第7个数据

uart.rar

1.46 MB, 下载次数: 217

工程文件

回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-7-8
在线时间
1 小时
 楼主| 发表于 2016-7-11 15:19:49 | 显示全部楼层
doming 发表于 2016-7-8 20:16
把这句去掉,试一下

非常感谢!去掉之后就好了,为什么呢?
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-7-8
在线时间
1 小时
 楼主| 发表于 2016-7-11 15:46:35 | 显示全部楼层
doming 发表于 2016-7-8 20:16
把这句去掉,试一下

刚才用j-link调试可以连续几次都收到数据,但是不在硬件仿真的情况下却又不行了
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-7-11
在线时间
3 小时
发表于 2016-7-11 16:02:59 | 显示全部楼层
于声 发表于 2016-7-11 15:19
非常感谢!去掉之后就好了,为什么呢?

原因我也不太清楚, 进入  USART_ClearITPendingBit().这个函数,能看到相关的说明
QQ截图20160711155602.jpg

我一直用的官方的库文件,串口接收里面没有调用USART_ClearITPendingBit  这个。
调用  USART_ReceiveData(USART1)  这个函数,会自动清除接收标志。我理解的,调用这个函数,手动清除接收标志。
也没问题,可是在这个函数里面对多个寄存器做了修改。你可以在这里打断点,
看一下执行完后,哪些寄存器做了变动,造成了你说的现象。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 06:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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