查看: 2018|回复: 0
打印 上一主题 下一主题

STM32 SPI控制 RC522,用了别人的例程改了下,程序比较乱

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-18 10:49:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基本的RFID卡检测与读写都可以实现,还添加了2.2寸液晶屏的驱动,但是遇到一个问题,我想让卡在离开时也退出操作页面,没有退出时一直能检测到卡并保留在某个页面,就如下面程序:
void rfid_tst(void)
{
        uint8_t status=0;
        int i ;
        char array[15];
        //寻找天线范围内的所有卡片
        Area_Clear(0,160,240,320,WHITE);
        while(1)
        {
                status = PcdRequest(PICC_REQALL, g_ucTempbuf);  
                if (status != MI_OK)
                {
                        printf("\r\n寻找不到天线范围内的卡\r\n") ;
                        return;
                }
            printf("\r\n寻找到天线范围内的卡\r\n") ;
            //防冲撞,返回卡片序列号存在sn里面
                status = PcdAnticoll(g_ucTempbuf);               
                if (status != MI_OK)
                {
                        printf("\r\n防冲撞处理不成功\r\n") ;
                        return;   
                }
                memcpy(card_id,g_ucTempbuf,4);
                //选定卡片,根据返回的序列号选定一张卡片
                status = PcdSelect(g_ucTempbuf);               
                if (status != MI_OK)
                {   
                        printf("\r\n卡片选定不成功\r\n") ;
                        return;   
                }
                //验证密码,根据自定义的密码验证
        //        status = PcdAuthState(PICC_AUTHENT1A, 1, "Liang ", g_ucTempbuf); //此处密码是对的
        //        if (status != MI_OK)
        //        {   
        //                printf("\r\n密码验证不成功\r\n") ;
        //                return;   
        //        }

                printf("\r\n天线范围内的卡验证成功\r\n") ;
                LED_On();
                for(i=0;i<4;i++)
                {
                    itoa((int)card_id[i],array+4*i,10);
                        if(i<3)
                        array[3+i*4]='.';
                }
                status=PcdAuthState(PICC_AUTHENT1A,4,DefaultKey,card_id);//
            if(status!=MI_OK)
                {
                         printf("\r\n密码验证错误!!\r\n");           
                }
                else
                {        
                        status= PcdRead(4, g_ucTempbuf);
                        if (status != MI_OK)
                        {   
                                printf("\r\n块数据读回错误!!\r\n");   
                        }
                        else
                        {
                                printf("\r\n 用户名为: %s\r\n", g_ucTempbuf );
                                Gui_DrawFont_GBK24(20,160,BLUE,GRAY0,"用户名:");
                                Gui_DrawFont_GBK24(100,165,BLUE,GRAY0,g_ucTempbuf);               
                        }

                        status= PcdRead(5, g_ucTempbuf);
                        if (status != MI_OK)
                        {   
                                printf("\r\n块数据读回错误!!\r\n");   
                        }
                        else
                        {
                                printf("\r\n 学号为: %s\r\n", g_ucTempbuf );
                                Gui_DrawFont_GBK24(20,190,BLUE,GRAY0,"学号:");
                                Gui_DrawFont_GBK24(100,195,BLUE,GRAY0,g_ucTempbuf);        
                        }
                        status= PcdRead(6, g_ucTempbuf);
                        if (status != MI_OK)
                        {   
                                printf("\r\n块数据读回错误!!\r\n");   
                        }
                        else
                        {
                                printf("\r\n 卡内余额为: %s\r\n", g_ucTempbuf );
                                Gui_DrawLine(180,0,204,240,WHITE);
                                Gui_DrawFont_GBK24(20,220,BLUE,GRAY0,"卡内余额:");
                                Gui_DrawFont_GBK24(140,225,BLUE,GRAY0,g_ucTempbuf);        
                        }        
                                Key1_Handler();
                                Key2_Handler();
                        Area_Clear(0,160,240,320,WHITE);
                }
        }        
}


按理说这句进入while(1)后,status = PcdRequest(PICC_REQALL, g_ucTempbuf);就能检测到所有天线范围内的卡,整个函数不会return,但是为什么我的卡一直贴着天线,还是出现不能重复检测的情况,程序执行的结果是执行一次后并没有一直停留在rfid_tst()函数里面,而是退出来,才能再一次进入(在main()里面一直执行rfid_tst()),所以不能实现卡不离开页面不离开,卡离开页面离开的效果。请各位帮忙解决这个问题,谢谢啊转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

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