RFID非接触式IC卡读写器用户手册V1.021、通信协议描述1.1协议概述该协议是上位机与读写器之间的通讯协议。通讯的格式是:1位起始位,1位长度标志位,若干数据位,1位异或校验位,1位结束位。通讯的最大长度为64字节。1.2字符定义字符数值定义STX0x02通讯开始LEN-数据长度DATA-数据BCC-异或校验ETX0x03通讯结束1.3通讯过程示意图上位机(发送)读写器(接收)STXLENBCCINFO(0)INFO(N)ETX发送结束STXLENBCCINFO(0)INFO(N)ETX上位机(接收)读写器(发送)接收结束1.4数据格式Command(2bytes)Data[0]……Data[m]2、指令集2.1指令一览表指令码功能0xC001寻卡(ISO/IEC15693)0xC005读取某一块的信息(ISO/IEC15693)0xC006将信息写入某一块(ISO/IEC15693)0xC007将某一块锁定(ISO/IEC15693)0xC008写入AFI(ISO/IEC15693)0xC009锁定AFI(ISO/IEC15693)0xC00A写入DSFID(ISO/IEC15693)0xC00B锁定DSFID(ISO/IEC15693)0xC00C获取系统信息(ISO/IEC15693)0x3224寻卡(ISO/IEC14443A存储卡)0x3225休眠卡片(ISO/IEC14443A存储卡)0x3241激活卡片(ISO/IEC14443A存储卡)0x3243读取某一块的信息(ISO/IEC14443A存储卡)0x3244将信息写入某一块(ISO/IEC14443A存储卡)0x3245读余额(ISO/IEC14443A存储卡)0x3246写入余额(ISO/IEC14443A存储卡)0x3247余额加值(ISO/IEC14443A存储卡)0x3248余额减值(ISO/IEC14443A存储卡)0x324B卡片复位(ISO/IEC14443A智能卡)0x324C发送应用命令(ISO/IEC14443A智能卡)2.2状态返回值返回值意义0x0000操作成功0xFFFF操作失败3、二次开发接口函数说明3.1适用于符合ISO/IEC14443A标准的存储卡的接口函数3.1.1MifareS50/S70卡片特性S50具有1K字节的EEPROM,S70具有4K字节的EEPROMS50分为16个扇区,每个扇区包括4块,每块16个字节,以块为存取单位S70分为40个扇区,共256个块,每块16个字节,以块为存取单位用户可自定义每个存储块的访问条件每张卡有唯一序列号,为32位具有防冲突机制,支持多卡操作非接触传送数据和无源至少10年数据保存期至少10万次擦写读写距离在100mm内工作频率为13.56MHz3.1.2函数使用注意事项该二次开发接口函数库提供用于下发命令至读写器的函数,这些函数能够控制读写器对卡片进行寻卡及读写操作。在对卡片进行操作前必须先寻卡,寻卡成功后才能对卡片进行后续操作。卡片的读写操作是以块为单位,每块为16个字节。不同扇区可以用不同的密钥进行认证,每个扇区又可以使用A密钥或B密钥进行认证。3.1.3函数说明(1)寻卡intfind_14443(BYTE*type,BYTE*card_uid);//////////////////////////////////////////////////////////////////////////////////////////////////////////功能:寻卡////入口参数:////出口参数:type,指示寻卡成功的卡片为A类卡或是B类卡//card_uid,指示用于存放UID的起始地址////返回值:返回0,通信失败//返回1,操作成功//返回0xff,操作失败////说明:获取卡片UID//////////////////////////////////////////////////////////////////////////////////////////////////////(2)HALT卡intset_halt();//////////////////////////////////////////////////////////////////////////////////////////////////////////功能:使卡片休眠////入口参数:////出口参数:////返回值:返回-2,尚未寻卡//返回0,通信失败//返回1,操作成功//返回0xff,操作失败////说明:在HALT卡前必须已经寻卡成功//////////////////////////////////////////////////////////////////////////////////////////////////////(3)激活卡片intset_active();//////////////////////////////////////////////////////////////////////////////////////////////////////////功能:激活卡片////入口参数:////出口参数:////返回值:返回-2,尚未寻卡//返回0,通信失败//返回1,操作成功//返回0xff,操作失败////说明:可以令处于休眠状态的卡片处于激活状态//////////////////////////////////////////////////////////////////////////////////////////////////////(4)读块intread_block(intpage,intblock,unsignedcharpswtype,unsignedchar*psw,unsignedchar*des_data,int*des_len);//////////////////////////////////////////////////////////////////////////////////////////////////////////功能:读取一个块的值////入口参数:page,指定要读取的块所在的扇区//block,指定要读取的块的块号//pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b//psw,指示用于认证的密钥的值的起始地址////出口参数:des_data,指示用于存放读取的数据的起始地址//des_len,指示用于存放返回读取数据长度的起始地址////返回值:返回-2,尚未寻卡//返回-1,传入参数错误//返回0,通信失败//返回1,操作成功//返回0xff,操作失败////说明:pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必//须为0x0a,对应B密钥pswtype必须为0x0b。//////////////////////////////////////////////////////////////////////////////////////////////////////(5)写块intwrite_block(intblock,intpage,unsignedcharpswtype,unsignedchar*psw,unsignedchar*src_data,intsrc_len)////////////////////////////////////////////////////////////////////////////////////////////////////////功能:往一个块写入指定的值////入口参数:page,指定要写入的块所在的扇区//block,指定要写入的块的块号//pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b//psw,指示用于认证的密钥的值的起始地址//src_data,指示用于存放要写入的数据的起始地址//src_len,指示用于存放返回写入数据的长度////出口参数:////返回值:返回-2,尚未寻卡//返回-1,传入参数错误//返回0,通信失败//返回1,操作成功//返回0xff,操作失败////说明:pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必//须为0x0a,对应B密钥pswtype必须为0x0b。//////////////////////////////////////////////////////////////////////////////////////////////////////(6)读余额intread_account(intpage,intblock,unsignedcharpswtype,unsignedchar*psw,LONG*account)////////////////////////////////////////////////////////////////////////////////////////////////////////功能:从指定的块里读取钱包的余额(在调用该函数前必须确保钱包已初始化)////入口参数:page,指定钱包所在的扇区//block,指定钱包所在的块的块号//pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b//psw,指示用于认证的密钥的值的起始地址////出口参数:account,指示用于存放要读取的余额的起始地址////返回值:返回-2,尚未寻卡//返回-1,传入参数错误//返回0,通信失败//返回1,操作成功//返回0xff,操作失败////说明:pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必//须为0x0a,对应B密钥pswtype必须为0x0b。//读余额前必须确保参数指定的扇区和块已初始化为钱包,否则可以通过调//用write_account()函数来初始化为钱包//////////////////////////////////////////////////////////////////////////////////////////////////////(7)写余额(初始化)intwrite_account(intpage,intblock,unsignedcharpswtype,unsignedchar*psw,LONGaccount)////////////////////////////////////////////////////////////////////////////////////////////////////////功能:往钱包写入指定的值////入口参数:page,指定钱包所在的扇区//block,指定钱包所在的块的块号//pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b//psw,指示用于认证的密钥的值的起始地址//account,指示用于要写入的值////出口参数:////返回值:返回-2,尚未寻卡//返回-1,传入参数错误//返回0,通信失败//返回1,操作成功//返回0xff,操作失败////说明:pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必//须为0x0a,对应B密钥pswtype必须为0x0b。//////////////////////////////////////////////////////////////////////////////////////////////////////(8)加余额intadd_account(intpage,intblock,unsignedcharpswtype,unsignedchar*psw,longaddAccount)/////////////////////////////////