怎么用c#实现读取RFID的卡号,求代码和详细注释,谢谢了

怎么用c#实现读取RFID的卡号,求代码和详细注释,谢谢了,第1张

你要的是高频还是超高频的??

超高频:

3.2.1)

Inventory_G2

():G2询查命令

功能描述:

询查命令的作用是检查有效范围内是否有符合协议的电子标签存在。

应用:

Functionint

StaticClassReaderB.Inventory_G2(unsigned

char

*ComAdr,

unsigned

charAdrTID,unsigned

char

LenTID,unsigned

char

TIDFlag,unsigned

char

*EPClenandEPC,

int*Totallen,int

*CardNum,int

FrmHandle)

参数:

ComAdr:输入变量,读写器地址。

AdrTID:输入变量,询查TID的起始地址。

LenTID:输入变量,询查TID的字数。

TIDFlag:输入变量,询查TID的标志。

TIDFlag=1:询查TID。

TIDFlag=0:询查EPC。

EPClenandEPC:指向输出数组变量(输出的是每字节都转化为字符的数据)。是读到的电子标签的EPC数据,是一张标签的EPC长度+一张标签的EPC号,依此累加。每个电子标签EPC号高字在前,每一个字的最高位在前。

Totallen:输出变量,EPClenandEPC的字节数。

CardNum:输出变量,电子标签的张数。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以 *** 作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回值:

0x01

询查时间结束前返回

0x02

询查时间结束使得询查退出

0x03

如果读到的标签数量行告者无法在一条消息内传送完,将分多次发送。

0x04

还有电子标签未读取,电子标签数量太多,MCU存储不了

返回其他值,请查看其他返回值定义,返回的错误代码请查看错误代码定义。

高频15693协议:

3.2.13)

GetSystemInformation():获得电子标签的详细信息

功能描述:

执行该命令后,将获得指定的电子标签的详细信息,这其中包括Information

Flag,UID,DSFID,AFI,Memory,IC

reference的信息,具体信息内容以及数量与各生产厂家电子标签定义相关。

应用:

Function

int

StaticClassReaderA.GetSystemInformation(unsignedchar

*ComAdr,

unsigned

char

*State,

unsigned

char

*UIDI,

unsigned

char*InformationFlag,

unsigned

char

*UIDO,

unsigned

char

*DSFID,

unsigned

char*AFI,

unsigned

char

*MemorySize,

unsigned

char

*ICReference,unsigned

char

*ErrorCode,

int

FrmHandle)

参数:

ComAdr

:

输入变量,读写器地址

State:

输入变量,具体情况如下:

Addressed模式:0x00

Selected模式:0x01

UIDI:指档薯向输入数组变量,8个字节的电子标签的唯一识别号,低字节在前,当State为Addressed模式时,须给出此参数,当State为Selected模式时,此参数值忽略

InformationFlag:输出变量,电子标签信息指示数据

UIDO:指向输出数组变量,8个字节的电子标签UID数据

DSFID:输出变量,电子标签的数据保存格式识别码

AFI:输出变量,电子标签的应用类型识别码

MemorySize:指向输出数组变量,电友悔子标签的存储容量信息,长度2个字节,第1个字节表示电子标签内存储数据块的总数,第2个字节表示每个数据块的字节长度。

ICReference:输出变量

ErrorCode:输出变量,函数执行后的返回值为错误代码0x0f时,为进一步的错误说明代码,其它情况下保留,为不定值

FrmHandle:输入变量,与读写器相连串口的句柄

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值,返回的错误代码请查看代码页。

/****************************************************************************

* File : main.c*

* COPYRIGHT BY HUOYAN LTD.COMPANY *

* Version: V1.3 *

* *

* Created: 18.10.2005 *

* Last Change: 21.10.2005 *

* *

* Author: NIL *

* *

* Compiler: KEIL C51 V7.10 *

* *

* Description: AT89S52-Firmware for FM1702 Demo Serial Reader *

* *

****************************************************************************/

#include <reg52.h>亮念

#define __SRC

#include "main.h"

#undef __SRC

#include <intrins.h>

//#include <string.h>

//#include <stdio.h>

//#include <宴键高absacc.h>

#include "FM1702.h"

#define uchar unsigned char

#define uint unsigned int

//pin define mcu控制管脚定义

sbit RF_MISO = P2^3

sbit RF_MOSI = P2^1

sbit RF_SCK = P2^0

sbit RF_NSS = P2^2

sbit RF_RST = P2^4//由高变低时启动内部复位程序

sbit CARD_LED = P1^1

sbit SPEAKER= P1^0

sbit LED = P2^5

//晌尺sbit RF_MISO = P1^0

//sbit RF_MOSI = P1^1

//sbit RF_SCK = P1^2

//sbit RF_NSS = P1^3

//sbit RF_RST = P1^4 //由高变低时启动内部复位程序

//sbit LED = P2^4

//sbit SPEAKER= P2^0

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

//名称: spi_byte_transceive//

//功能: 该函数实现SPI通讯的数据收发//

// //

//输入://

// 发送数据 //

// //

//输出://

// 接收数据 //

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

char spi_byte_transceive(char sendbyte)

{

char i,temp

for(i=0i<8i++)

{

RF_SCK=0

if(sendbyte &0x80) //位运算,判断最高位是否为1

{

RF_MOSI=1

}

else

{

RF_MOSI=0

}

sendbyte <<= 1

RF_SCK=1

temp <<= 1

if(RF_MISO)

temp |= 0x01

}

RF_SCK=0

_nop_()

_nop_()

RF_MOSI=0

return (temp)

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

//名称: rc531_register_write //

//功能: 该函数实现通过SPI接口对RC531中一个寄存器写入值 //

// //

//输入://

// RC531目标寄存器地址和写入值 //

// //

//输出://

// N/A //

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

void SPIWrite(char reg_ad,char reg_data)

{

RF_SCK=0

reg_ad <<= 1

RF_NSS=0

reg_ad &= 0x7F

spi_byte_transceive(reg_ad)

spi_byte_transceive(reg_data)

RF_NSS=1

return

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

//名称: rc531_register_read//

//功能: 该函数实现通过SPI接口读取RC531中一个寄存器的值 //

// //

//输入://

// RC531目标寄存器地址 //

// //

//输出://

// 目标寄存器的值 //

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

unsigned char SPIRead(char reg_ad)

{ char temp

RF_SCK=0

_nop_()

_nop_()

RF_NSS=0

reg_ad <<= 1

reg_ad |= 0x80

spi_byte_transceive(reg_ad)

temp=spi_byte_transceive(0x00)

RF_NSS=1

return (temp)

}

///////////////////////////////////////////////////////////////////////

// 主函数

///////////////////////////////////////////////////////////////////////

void main(void)

{ //设置变量

uchar baud

SPEAKER=0

InitSystem()//初始化系统

SPEAKER=1

LED=0

while (1)

{

//检查命令标志

if (CmdValid) //if LEVEL 1

{

CmdValid = FALSE

if(RevBuffer[0]==11) //if LEVEL 2

{

RevBuffer[2]=RevBuffer[1]

RevBuffer[0]=1

RevBuffer[1]=0

CALL_isr_UART() //equal to 'SETB TI', defined in main.h

SPEAKER=0 //开蜂鸣器和指示灯

delay_10ms(RevBuffer[2])

SPEAKER=1

}

else if(RevBuffer[0]==13) //设置通讯波特率 //if LEVEL 2

{

switch(RevBuffer[1])

{

case 0:

baud=BAUD_9600

break

case 1:

baud=BAUD_14400

break

case 2:

baud=BAUD_19200

break

case 3:

baud=BAUD_28800

break

case 4:

baud=BAUD_38400

break

case 5:

baud=BAUD_57600

break

case 6:

baud=BAUD_115200

break

default:

baud=BAUD_19200

break

} //switch body

RevBuffer[0]=1 //contact

RevBuffer[1]=0

CALL_isr_UART()

delay_10ms(5)

TR1 = 0

TH1 = baud

TL1 = TH1

delay_10ms(2)

TR1 = TRUE

}//if LEVEL 2

else

{

cmd_process() // 进入IC卡处理程序

CALL_isr_UART()

}

}

}//while循环体

}//main函数

///////////////////////////////////////////////////////////////////////

// 系统初始化

///////////////////////////////////////////////////////////////////////

void InitSystem(void)

{

RF_NSS=1

RF_RST=0

ET2 = 0 //Timer 2 disabled

T2CON = 0x04 //start Timer 2(internal timer, auto reload)

PCON = 0x80 //baud rate double

SCON = 0x70 //UART mode 1, enable receive, if No valid stop bit, RI not activated.

//TMOD = 0x22

TMOD = 0x21 //Timer 1 8bit auto reload TR1 control

//Timer 0 16bit TR0 control

TH1 = BAUD_9600 //默认波特率

TL1 = TH1

TR1 = TRUE // 波特率发生器

TH0 = 0x60

TL0 = 0x60

TR0 = 0 //Timer 0 doesn't run

ET0=0

ET1=0

EA=1

EX0=1

IT0 = 1

TR2=0

ES = TRUE //enable UART interrupt

CmdValid=0 //flag initiation

//喇叭和指示灯测试

delay_10ms(10)

delay_10ms(10)

Init_FM1702(0)

}

///////////////////////////////////////////////////////////////////////

// 串口接收和发送中断

///////////////////////////////////////////////////////////////////////

void isr_UART(void) interrupt 4 using 1

{

uchar len, i

unsigned int j=0

if(RI)

{

len=SBUF

RI=0

for(i=0i<leni++)

{

while(!RI)

{

j++

if(j>1000)

{

break

}

}

if(j<1000)

{

RevBuffer[i]=SBUF

RI=0

j=0

}

else

{

break

}

}

if(i==len)

{

REN=0

CmdValid=1

}

}

else if(!RI &&TI)

{

TI=0

len=RevBuffer[0]

for(i=0i<len+1i++)

{

SBUF=RevBuffer[i]

while(!TI)

TI=0

}

REN=1

}

}

/****************************************************************/

/*名称: Load_keyE */

/*功能: 该函数实现把E2中密码存入FM1702的keyRevBuffer中*/

/*输入: Secnr: EE起始地址*/

/*输出: True: 密钥装载成功*/

/* False: 密钥装载失败*/

/****************************************************************/

uchar Load_key_CPY(uchar *buff)

{

char idata status

uchar coded_keys[12]

uchar temp

M500HostCodeKey(buff,coded_keys)////////////////

temp=Command_Send(0x0c,coded_keys,LoadKey)

if(temp == FALSE)

{

return FM1702_LOADKEYERR

}

status=(SPIRead(ErrorFlag)) &0x40

if (status==0x40)

return FM1702_AUTHERR

return FM1702_OK

}

///////////////////////////////////////////////////////////////////////

// IC卡处理函数

///////////////////////////////////////////////////////////////////////

void cmd_process(void)

{

uchar cmd

uchar status

cmd = RevBuffer[0]

switch(cmd)

{

case 1: // Halt the card //终止卡的 *** 作

status=MIF_Halt()

RevBuffer[0]=1

RevBuffer[1]=status

break

case 2:

status = Request(RF_CMD_REQUEST_ALL) //RF_CMD_REQUEST_STD=0x26, request Idle

if(status != FM1702_OK)

{

status = Request(RF_CMD_REQUEST_ALL)

if(status != FM1702_OK)

{

RevBuffer[0] = 1

RevBuffer[1] = FM1702_REQERR

break

}

}

if(tagtype[0]==2)

cardtype=mifarepro// Mifare Pro 卡

else if(tagtype[0]==4)

cardtype=mifare1 // Mifare One 卡

else if(tagtype[0]==16)

cardtype=mifarelight // Mifare Light 卡

else

cardtype=unknowncard

RevBuffer[0]=3

RevBuffer[1]=status

RevBuffer[2]=tagtype[0]

RevBuffer[3]=tagtype[1]

break

case 3: // 防冲突 读卡的系列号 MLastSelectedSnr

status = AntiColl()

if(status!=FM1702_OK)

{

RevBuffer[0]=1

RevBuffer[1]=FM1702_ANTICOLLERR

break

}

//memcpy(MLastSelectedSnr,&RevBuffer[2],4)

RevBuffer[0]=5

RevBuffer[1]=status

RevBuffer[2]=UID[0]

RevBuffer[3]=UID[1]

RevBuffer[4]=UID[2]

RevBuffer[5]=UID[3]

break

case 4: // 选择卡 Select Card

status=Select_Card()

if(status!=FM1702_OK)

{

RevBuffer[0]=1

RevBuffer[1]=FM1702_SELERR

break

}

RevBuffer[0]=1

RevBuffer[1]=status

break

case 5:

//下载密钥

// status = Load_keyE2(RevBuffer[2],RevBuffer[1]) //%40

status = Authentication(UID, RevBuffer[2], RevBuffer[1])

if(status != FM1702_OK)

{

RevBuffer[0]=1

RevBuffer[1]=status

break

}

RevBuffer[0]=1

RevBuffer[1]=status

break

case 6: // Key loading into the MF RC500's EEPROM

// 校验卡密码(E2) Load_keyE2_CPY(uchar Secnr, uchar Mode)

// RevBuffer[5] = 0xff

// RevBuffer[6] = 0xff

// RevBuffer[7] = 0xff

// RevBuffer[8] = 0xff

// RevBuffer[9] = 0xff

// RevBuffer[10] = 0xff

status = Load_key_CPY(&RevBuffer[3])

// status = Load_keyE2_CPY(RevBuffer[2],RevBuffer[1]) //%40

// if(status != FM1702_OK)

// {

// RevBuffer[0]=1

// RevBuffer[1]=status

// break

// }

RevBuffer[0]=1

RevBuffer[1]=status

break

这里不能全部发完,你加我的QQ吧,574301093 我发给你接收完后麻烦采纳下我的答案。谢谢了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12510575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存