请大家看看,为什么串口中断只能收到第一个字节?

2019-07-20 17:51发布

串口只能接收第一个字节,求教!


void USART1_IRQHandler(void)                    //串口1中断服务程序
{
    u8 Res;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是checksum[0] checksum[1]结尾)
    {
        USART_ClearFlag(USART1,USART_FLAG_RXNE);  //清除中断标志     
        Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据

        if((USART_RX_STA&0x8000)==0)//接收未完成
        {
            if(USART_RX_STA&0x4000)//接收到了checksum[1]
            {
                if(Res != USART_RX_BUF[USART_REC_LEN-1])USART_RX_STA=0;//接收错误,重新开始
                else USART_RX_STA|=0x8000;    //接收完成
            }
            else //还没收到chucksum[1]
            {     
                if(Res == USART_RX_BUF[USART_REC_LEN-2])USART_RX_STA|=0x4000;
                else
                {
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                    USART_RX_STA++;         
                     
                    if (USART_RX_STA >=2)
                    {
                        USART_RX_BUF[USART_REC_LEN-2] += Res;
                        USART_RX_BUF[USART_REC_LEN-1] += USART_RX_BUF[USART_REC_LEN-2];
                    }
                     
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收      
                }         
            }
        }

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
shmm91
1楼-- · 2019-07-21 10:25
1201yuge 发表于 2016-1-14 10:15
你的那个清中断的函数是不是有点问题?接收中断可以不清,你把那个屏蔽掉试试看

效果一样,停在中断里出不来
1201yuge
2楼-- · 2019-07-21 14:59
 精彩回答 2  元偷偷看……
shmm91
3楼-- · 2019-07-21 20:27
1201yuge 发表于 2016-1-14 10:22
你仿真看看是什么中断标志位没有被清掉;还有你打开了串口的什么中断

原因我明白,就是while(1),始终处在循环里,所以跳不出来.但是删了以后,就只能接收一个字节.
小温
4楼-- · 2019-07-21 23:58
楼主的程序逻辑很乱
shmm91
5楼-- · 2019-07-22 05:04
 精彩回答 2  元偷偷看……
小温
6楼-- · 2019-07-22 05:09
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)     //接收非空中断标志置位
        {
                USART_ClearFlag(USART1,USART_FLAG_RXNE);   //清除中断标志        
                Res =USART_ReceiveData(USART1);            //读取接收到的数据
               
                USART_RX_BUF[USART_RX_STA] = Res;        //假如USART_RX_STA初值为0,则从 USART_RX_BUF[0] 开始保存接收到的数据
                USART_RX_STA++;     // USART_RX_STA 加1
               
                if ((USART_RX_BUF[0] = 0xB5) && (USART_RX_STA > 35))   // 第一个字节是0xB5,而且USART_RX_STA 超过35的时候
                {
                        USART_RX_STA = 0;    //把USART_RX_STA 清零
                }
               
        }


问:你在哪里设置接收完成标志位?
问:接收完成的条件是什么?
原子的代码是以 回车 换行 符来判断接收完成的
还可以用超时的方式来判断接收完成

一周热门 更多>