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

2019-07-21 04:05发布

本帖最后由 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, 下载次数: 12) 2019-3-18 14:25 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
坠灬辰
1楼-- · 2019-07-22 03:29
你这个太乱了,就算你接收到数据了,你也基本找不到你数据的位置,而且你还可能数据越界
坠灬辰
2楼-- · 2019-07-22 09:18
你重新整理下逻辑,就可以了
nabla
3楼-- · 2019-07-22 10:38
 精彩回答 2  元偷偷看……
坠灬辰
4楼-- · 2019-07-22 13:47
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;
                                                }
                                                       
                                        }
                                       
                                                                       
                         }                    
     }
}
坠灬辰
5楼-- · 2019-07-22 16:06
这样子应该能满足你的需求,但是最好做状态机
nashui_sx
6楼-- · 2019-07-22 20:41
本帖最后由 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 ",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;
}              

一周热门 更多>