OpenEdv-开源电子网

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

(简单串口程序)debug无法进入while循环

[复制链接]

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
发表于 2019-3-18 14:27:17 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 1208 于 2019-3-18 15:22 编辑

单片机用stm32F103C8T6,代码很简单,传感器是主动上传的,1s一个数据,通过usart1读取,中断是这样写的。1.44寸屏幕可以直接读取到传感器浓度值(或者USB转TLL串口助手也行),但是debug的话怎么也进不了wihle循环(或者说USART_RX_STA这个值一直就是4000不是8000 ),新手一枚,想知道是哪里错了,求大神指教。
QQ图片20190318141906.png QQ图片20190318141946.png


气体传感器.rar (349.91 KB, 下载次数: 51)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-18 14:27:18 | 显示全部楼层
nabla 发表于 2019-3-19 23:58
大神,我试了下这个代码,if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)这个语句一直进不去,U ...

气体传感器.rar (359.08 KB, 下载次数: 55)
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13104
金钱
13104
注册时间
2012-11-26
在线时间
3811 小时
发表于 2019-3-18 14:35:25 | 显示全部楼层
用状态机写吧,你这样子的接收逻辑,不适合
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-3-18 14:38:05 来自手机 | 显示全部楼层
jermy_z 发表于 2019-3-18 14:35
用状态机写吧,你这样子的接收逻辑,不适合

可以说下这样为啥进不了循环吗,大神我是新手,状态机啥的不懂啊。。
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-3-18 15:27:06 | 显示全部楼层
要么USART+DMA+IDLE空闲中断,或者USART+TIMER超时,接收一帧数据后按协议解析判断处理好了
一分耕耘一分收获。
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-3-18 15:27:18 | 显示全部楼层
中断可以单步运行完不
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-3-18 19:02:56 来自手机 | 显示全部楼层
1208 发表于 2019-3-18 15:27
中断可以单步运行完不

我在while之前加了个delay500ms  sta变为D007然后可以进入中断   貌似比500小的话 sta是4000   然后while循环内部最后一行我也一样加了个delay500  这样虽然达到了目的  但是不是delay的太多了点  大神有何高见
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2018-1-15
在线时间
41 小时
发表于 2019-3-19 11:30:17 | 显示全部楼层
你这个太乱了,就算你接收到数据了,你也基本找不到你数据的位置,而且你还可能数据越界
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2018-1-15
在线时间
41 小时
发表于 2019-3-19 11:38:14 | 显示全部楼层
你重新整理下逻辑,就可以了
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-3-19 13:19:58 来自手机 | 显示全部楼层
坠灬辰 发表于 2019-3-19 11:30
你这个太乱了,就算你接收到数据了,你也基本找不到你数据的位置,而且你还可能数据越界

麻烦大神帮我改下可以吗,我不明白我这个思路乱在哪里,而且我这个代码加delay后确实能找到数据的位置
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2018-1-15
在线时间
41 小时
发表于 2019-3-19 14:51:05 | 显示全部楼层
unsigned int flag = 0;

void USART1_IRQHandler(void)                        //′®¿ú1ÖD¶Ï·tÎñ3ìDò
        {
        u8 Res;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
                {
                Res =USART_ReceiveData(USART1);        //¶á衽óêÕμ½μÄêy¾Y
               
                if((USART_RX_STA&0x8000)==0)//½óêÕÎ′íê3é
                        {
       
                                if(Res == 0xFF)
                                        {
                                                flag |= 0x4000;
                                               
                                        }
                                if(Res == 0x86) //¿aê¼½óêÕêy¾Y
                                        {
                                                        flag |= 0x1000;                                                            
                                        }

                                if( (flag&0x4000) && (flag&0x1000) )
                                        {//±£′æêy¾Y                                                               
                                                USART_RX_BUF[USART_RX_STA&0x0fff]=Res;
                                                USART_RX_STA ++;                                                               
                                                if( (USART_RX_STA&0x0fff) > 6){
                                                        USART_RX_STA |= 0x8000;
                                                        flag = 0;
                                                }
                                                       
                                        }
                                       
                                                                       
                         }                    
     }
}
回复

使用道具 举报

3

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2018-1-15
在线时间
41 小时
发表于 2019-3-19 14:51:47 | 显示全部楼层
这样子应该能满足你的需求,但是最好做状态机
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-19 16:28:57 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-3-19 16:31 编辑

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);        //开启串口空闲IDEL中断


void USART1_IRQHandler(void)                        //串口1中断服务程序
        {
        u8 Res;
    if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//空闲中断
    {
        USART_RX_STA |= 0x8000;
                        
        USART_ReceiveData(USART1); // Clear IDLE interrupt flag bit
    }

                if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                {
                                Res =USART_ReceiveData(USART1);        //读取接收到的数据
                          if((USART_RX_STA&0x8000)==0)
                                  USART_RX_BUF[USART_RX_STA++]=Res;
                                if(USART_RX_STA>100)USART_RX_STA |= 0x8000;
                                USART_ClearITPendingBit(USART1, USART_IT_RXNE);                        
                }
}


                while(1)
                {               
                                if( USART_RX_STA&0x8000)
                                {                                       
                                        if(USART_RX_BUF[0]==0xff)
                                        {
                                                 if(USART_RX_BUF[USART_RX_STA&0x3fff-1]==FucCheckSum(USART_RX_BUF,USART_RX_STA&0x3fff))//校验
                                                 {
                                                                        if(USART_RX_BUF[1]==0x86)//处理命令
                                                                        {

                                                                    printf("nongdu=%d\r\n",USART_RX_BUF[2]*256+USART_RX_BUF[3]);
                                                                  }
                                                                  //...
                                                 }
                                                
                                        }                                                
                                        USART_RX_STA=0;
                                }
                }                          
u8 FucCheckSum(unsigned char *i,u32 ln)
{
  unsigned char j,tempq=0;
        i+=1;
        for(j=0;j<ln-2;j++)
        {
           tempq+=*i;
                 i++;
        }
        tempq=(~tempq)+1;
        return tempq;
}              
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-3-19 23:58:11 | 显示全部楼层
nashui_sx 发表于 2019-3-19 16:28
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);        //开启串口空闲IDEL中断

大神,我试了下这个代码,if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)这个语句一直进不去,USART_RX_BUF一直没数,麻烦您在看下哪的问题
回复

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2019-3-20 08:39:34 | 显示全部楼层
谢谢分享
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-3-20 09:15:20 | 显示全部楼层

多谢大神,问题已解决,虽然debug时候USART_RX_BUF还是为空,但是串口确实能打印出来。
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-20 10:47:07 | 显示全部楼层
nabla 发表于 2019-3-20 09:15
多谢大神,问题已解决,虽然debug时候USART_RX_BUF还是为空,但是串口确实能打印出来。

打印的传感器值不对?
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-3-20 12:52:06 | 显示全部楼层
nashui_sx 发表于 2019-3-20 10:47
打印的传感器值不对?

打印的值是对的  我屏幕上也可以正常显示 只是我不太明白就是不调试时候它就能正常出数,调试时候USART_RX_BUF就没数据  怎么解释这种现象呢    新手表示不太理解  可能对你来说只是个小知识点
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-20 14:07:30 | 显示全部楼层
nabla 发表于 2019-3-20 12:52
打印的值是对的  我屏幕上也可以正常显示 只是我不太明白就是不调试时候它就能正常出数,调试时候USART_R ...

空闲中断内或者主函数if( USART_RX_STA&0x8000) 内打断点  发送数据停在断点再看 就有数据了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2021-4-3
在线时间
5 小时
发表于 2021-4-5 14:56:17 | 显示全部楼层
坠灬辰 发表于 2019-3-19 14:51
这样子应该能满足你的需求,但是最好做状态机

请问有推荐的状态机的学习路子吗 或者看哪些书?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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