找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 217|回复: 1
打印 上一主题 下一主题
收起左侧

有无大佬解答一下RC522操作复旦微FM1208CPU卡的疑问

[复制链接]
回帖奖励 50 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:777254 发表于 2024-9-7 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.寻卡,防碰撞,选卡,复位转入APDU命令,选择MF主目录成功后,我执行让卡休眠。然后把卡拿开,重新刷卡会在选择MF主目录这里失败。2.这样循环重复成功,失败,成功,失败。。。。。。
代码如下:
1.先寻卡,防碰撞,选卡
2.上述成功后,就执行如下代码:        FMstatus=pro_reset(out_data,tt);//转入APDU命令格式CPU卡复位操作,成功后才能往下操作//
        if(MI_OK==FMstatus)
        {
       
                        FMstatus=MI_ERR;


                        st=FM1208_SelectFile(File_3F00, g_cReceBuf,tt);
                        printf("FM1208_SelectFile,st=0x%x\r\n",st);
                        if(st==0x9000)
                        {
                                FMstatus=MI_OK;
                        }
                        else
                        {               
                                                                       
                                FMstatus=MI_ERR;
                                return FMstatus;
                        }

        }
3.成功后就执行PcdHalt();让卡休眠。


串口打印现象如下:
Card type=0x0800
PcdAnticoll ok
Card_ID>>>6EFCD20C
PcdSelect ok
This is CPU Card,SAK=20
FM1208_SelectFile,st=0x9000
------------------------------------------
Card type=0x0800
PcdAnticoll ok
Card_ID>>>6EFCD20C
PcdSelect ok
This is CPU Card,SAK=20
FM1208_SelectFile,st=0xffff



同一张卡,第一次成功返回0x9000.第二次就失败,然后就是成功,失败,成功,失败循环。。。。
有知道是怎么回事吗?





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404160 发表于 2024-9-10 14:36 | 只看该作者
优化代码逻辑:

增加延时: 在PcdHalt()后和下一次刷卡前增加适当的延时,确保卡有足够的时间进入休眠和唤醒。
重置状态变量: 在每次刷卡操作前,重置错误标志、超时计数等状态变量,确保每次操作都是从一个干净的状态开始。
完善错误处理: 对各种可能的错误进行处理,例如通信超时、APDU响应错误等,并记录错误信息以便分析。

修改后的代码:


#include <reg51.h>

// ... 其他代码

#define DELAY_TIME 100  // 延时时间,单位ms

void main() {
    // ... 其他代码

    while(1) {
        // 寻卡、防碰撞、选卡
        // ...

        if (PcdSelectOk) {
            FMstatus = pro_reset(out_data, tt);
            if (MI_OK == FMstatus) {
                // 重置错误标志
                errorFlag = 0;

                // 选择MF主目录
                st = FM1208_SelectFile(File_3F00, g_cReceBuf, tt);
                printf("FM1208_SelectFile,st=0x%x\r\n", st);

                if (st == 0x9000) {
                    FMstatus = MI_OK;
                    // 成功,执行其他操作
                    PcdHalt();
                    delay(DELAY_TIME);  // 延时
                } else {
                    FMstatus = MI_ERR;
                    errorFlag = 1;  // 设置错误标志
                    // 处理错误
                }
            }
        }
    }
}

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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