发信人: gmcccode 发表时间: 2002-12-30 18:22:02
--------------------------------------------------------------------------------
我见过philips用89c51rd2单片机编写的typeB程序。代码如下:
#include <string.h>
#include <stdio.h>
#include <main.h>
#include <m500a.h>
#include <p89c51rx.h>
#include <Mfreg531.h>
#include <EvalOs.h>
#define LED    P3_5

unsigned char ReadBuf[64];
unsigned char nkey[6]={0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5};
//unsigned char nkey[6]={0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
unsigned char FWI=5;
unsigned char BLK=0;
void init( void);
void Blink_LED( void);
char TCL_Protocol( unsigned char CID);
char TCL_Protocol2( unsigned char CID);
void delay_50us( unsigned int _50us);
char CL_Deselect( unsigned char CID);
char CL_GetChallenge( unsigned char CID, unsigned char *Buf);
char CL_SelectFile( unsigned char CID,
            unsigned char P1,
            unsigned char P2,
            unsigned char *file,
            unsigned char *Buf);
void PrepareValue ( unsigned long value, unsigned char *buf);
void main( void)
{
     char idata status,temp;
     unsigned char i,atq[2],snr[10],sak,snr_len,TA;
     unsigned char buffer[16],mfout=4,reg=0x3a,regvalue=0x04;
     unsigned char reg2=0x3d,regvalue2=0x0,reg3,regvalue3,regvalue4=0X89;
        
    init();                   // Initialise system
    status = M500PcdConfig();       // Initialise the RC500
                                     // must be call in the initialisation
        M500PcdMfOutSelect(mfout);       // Route serial output to pin, for test
    LED=0;
    delay_50us(10000);
    LED=1;
     // LOADING KEYS
     for(i=0; i<16; i )
    {
      M500PcdLoadMk(PICC_AUTHENT1A,i,nkey);       // load RAM
       //M500PcdLoadKeyE2(PICC_AUTHENT1A,i,nkey);      // load EEPROM
    }
        
     while(1)
    {
       //M500PcdRfReset(10);
       //delay_50us(1000);
      
       // IS014443B
      M500PcdConfigISOType(TYPEB);
      status = M531PiccRequestB(PICC_REQBWUP,0,0,ReadBuf); // ReqB with 1 slot
      if(status==MI_OK || status==MI_COLLERR)
      {
        if(status == MI_COLLERR) // more then 1 card
        {
           // Anti-collision by probabilistic    
           /*for(i=0; i<4; i )  
          {
            status = M531PiccRequestB(PICC_REQBSTD,0,2,ReadBuf); // ReqB with 4 slots
        if(status==MI_OK) break;
          }
          if(status!=MI_OK) continue; //error occur
          FWI = ReadBuf[11]>>4; // Set the FWT according to the protocol info         
          status = M531PiccAttrib(&ReadBuf[1],0,0,0);     // Select PICC
              */
    
           // Anti-collision using slot-marker
          if((status=M531PiccRequestB(PICC_REQBSTD,0,2,ReadBuf)) != MI_OK) // ReqB with 4 slot
          {
         for (i=1; i<4; i )
              if((status=M531PiccSlotMarker(i,ReadBuf)) == MI_OK) break;    
          }
           if (status != MI_OK) continue;
            }
        Blink_LED();        
        
        FWI = ReadBuf[11]>>4; // Set the FWT according to the protocol info         
            if((status=M531PiccAttrib(&ReadBuf[1],0,0,0,ReadBuf[10]&0x0f))!=MI_OK) continue; // Select PICC
        status = TCL_Protocol(0);
      }    
       // IS014443A
      M500PcdConfigISOType(TYPEA);
       while(1)
      {
        if((status=M500PiccActivateAll(0,atq,&sak,snr,&snr_len))==MI_OK)
        {
          if((sak&0x24) == 0x20)      /* ISO1443A commands, T=CL */
          {
            ReadBuf[0]=0xE0;      // RATS commands
            ReadBuf[1]=0x50;     // FSD=64, CID=0
            if(M500PiccExchangeBlock(ReadBuf,4,ReadBuf,&temp,1,4)==MI_OK) // length incl CRC
            {
               /* ATS received in ReadBuf        
                 START EXCHANGING TRANSPARENT data */
          i = 2;
          if(ReadBuf[1]&0x40) TA=ReadBuf[i ];
           else TA=0;
          if(ReadBuf[1]&0x20) FWI=ReadBuf[i ]>>4;
          
          if(!TA)
          {
            ReadBuf[0]=0xd0;      // PPSS commands
                ReadBuf[1]=0x11;     // PPS0
                ReadBuf[2]=0x33;     // PPS1, DRI=8, DSI=8
                if(M500PiccExchangeBlock(ReadBuf,5,ReadBuf,&temp,1,FWI)==MI_OK) // length incl CRC
                {
              M500PcdWrite register(0x14,0x01); // ISO14443A, 848KBaud    
                M500PcdWrite register(0x19,0x13); // Rcv 848KBaud             
            }    
              }        
              Blink_LED();        
        
              TCL_Protocol(0);
                CL_Deselect(0);
            }
          }
           else                /* Mifare Classic commands */
          {
            if((status=M500PiccAuth(PICC_AUTHENT1A,snr,0,0))!=MI_OK) continue;    
            PrepareValue(100,ReadBuf);
            if(M500PiccWrite(62,ReadBuf)!=MI_OK) continue;
                
            if(M500PiccRead(0,ReadBuf)!=MI_OK) continue;
            PrepareValue(1,ReadBuf);
            if(M500PiccValue(PICC_DECREMENT,62,ReadBuf,62)!=MI_OK) continue;
            if(M500PiccValue(PICC_RESTORE,62,ReadBuf,61)!=MI_OK) continue;
            if(M500PiccRead(61,ReadBuf)!=MI_OK) continue;
            status = M500PiccHalt();
            Blink_LED();        
          }
        }
         break;
      }
    }  
}
void init( void)
{
    LED = 0;
    P2_7 = 0;     // Enable the CS for RC500
    PMR = 0x41;      // for emulation
    IT0 = 1;         // Config ext0 as edge trigger for RC500
    EX0 = 1;      // Enable ext0 interrupt for RC500
    EA = 1;         // Enable global interrupt    
}
char TCL_Protocol( unsigned char CID)
{
     char idata status,temp;
     unsigned char buffer[16];
     unsigned long duration;
    LED = 1;
    buffer[0] = 0x11;
    buffer[1] = 0x22;
    buffer[2] = 0x33;
    buffer[4] = 0x44;
    buffer[5] = 0x55;
    buffer[6] = 0x66;
    WriteInfineonCard (buffer, 0, 6);
     ReadInfineonCard (ReadBuf, 0, 7);
         
    buffer[0]=0x3f;
    buffer[1]=0x00;
    M500PcdStopWatch(1); // start RC500 Timer Stop-watch    
    if(CL_SelectFile(CID,0,0,buffer,ReadBuf)==MI_OK)
    {
      //    LED = 1;    
     //    LED = 0;
    }
        duration = M500PcdStopWatch(0); // stop RC500 Timer Stop-watch                
    M500PcdStopWatch(1); // start RC500 Timer Stop-watch    
    if(CL_GetChallenge(CID,ReadBuf)==MI_OK)
    {
      //    LED = 1;    
     //    LED = 0;
    }
    duration = M500PcdStopWatch(0); // stop RC500 Timer Stop-watch    
    delay_50us(1000);
    LED = 0;
    
     return(status);
}
char CL_Deselect( unsigned char CID)
{
     unsigned char len,Buf[6];
    Buf[0]=0xCA;      // S-block PCB with CID
    Buf[1]=CID;       // CID
    if(M500PiccExchangeBlock(Buf,4,Buf,&len,1,FWI)!=MI_OK) return(!MI_OK);
    if(Buf[0]==0x90 && Buf[1]==0x00) return(MI_OK);
     else return(!MI_OK);      
}
char CL_GetChallenge( unsigned char CID, unsigned char *Buf)
{
     unsigned char len;
    Buf[0]=0x0A;      // I-block PCB with CID
    Buf[1]=CID;       // CID
    Buf[2]=0xb8;     // INF:CLA
    Buf[3]=0x84;     // INF:INS
    Buf[4]=0x00;     // INF:P1
    Buf[5]=0x00;     // INF:P2
    Buf[6]=0x04;     // INF:Le
    if(M500PiccExchangeBlock(Buf,9,Buf,&len,1,FWI)!=MI_OK) return(!MI_OK);
    if(Buf[len-4]==0x90) return(MI_OK);
     else return(!MI_OK);      
}
char CL_SelectFile( unsigned char CID,
            unsigned char P1,
            unsigned char P2,
            unsigned char *file,
            unsigned char *Buf)
{
     unsigned char len;
        
    Buf[0]=0x0A;      // I-block PCB with CID
    Buf[1]=CID;       // CID
    Buf[2]=0x00;     // INF:CLA
    Buf[3]=0xA4;     // INF:INS
    Buf[4]=P1;     // INF:P1
    Buf[5]=P2;     // INF:P2
    if(P1&0x04) // Selection by DF name
    {
      len=0;
       while(file[len]!=0)
        Buf[7 len] = file[len ];
      Buf[6]=len;
      len = 9;
    }
     else // Selection by FID
     {
      Buf[6]=2;         // INF:Lc
      Buf[7]=file[0];     // INF:data
      Buf[8]=file[1];     // INF:data
      len = 11;
    }
    if(M500PiccExchangeBlock(Buf,len,Buf,&len,1,FWI)!=MI_OK) return(!MI_OK);
    if(Buf[len-4]==0x90) return(MI_OK);
     else return(!MI_OK);      
}
void PrepareValue ( unsigned long value, unsigned char *buf)
{
     unsigned char i;
     for (i=0; i<4; i )
    {
        buf = buf[8 i] = ( unsigned char)(value>>(8*i));
        buf[4 i] = ~buf;
    }
    buf[12] = 0;
    buf[13] = 255;
    buf[14] = 0;
    buf[15] = 255;
}
void Blink_LED( void)
{
    LED=0;
    delay_50us(2500);    
    LED=1;
}

发信人: gmcccode 发表时间: 2002-12-30 18:26:02
--------------------------------------------------------------------------------
发信人: tpu 发表时间: 2002-12-30 21:38:40
--------------------------------------------------------------------------------
但typeB的寄存器初始化跟typeA不一样。

发信人: cwcyxy 发表时间: 2002-12-31 10:19:00
--------------------------------------------------------------------------------
typeB的寄存器初始化跟typeA不一样。
你做过吗?

发信人: wellson 发表时间: 2002-12-31 11:09:53
--------------------------------------------------------------------------------
请问有谁开发过用计算机串口直接读取智能IC卡,而不用单片机,请帮帮我。谢谢!

发信人: cwcyxy 发表时间: 2002-12-31 11:23:21
--------------------------------------------------------------------------------
你要做什么卡?

发信人: wuyuehua 发表时间: 2002-12-31 17:44:06
--------------------------------------------------------------------------------
请问:
   当发出AntiCollision指令(2Byte)后为何不能接收到序列号

发信人: cwcyxy 发表时间: 2003-01-02 08:22:51
--------------------------------------------------------------------------------
首先,你能收到atqA吗?如果能,请参见我的源代码:
#define BYTE unsigned char
BYTE mifs_anticoll(BYTE _Bcnt, BYTE *_SNR) //__Bcnt not used
{
    BYTE idata status = MI_OK;
    BYTE idata nbytes = 0;
    BYTE idata n bits = 0;
    BYTE idata complete = 0;
    BYTE idata i        = 0;
    BYTE idata byteOffset = 0;
    BYTE idata snr_crc;
    BYTE idata snr_check;
    BYTE dummyShift1;      
    BYTE dummyShift2;        
    
    M500PcdSetTmo(1);
    
    WriteIO(RegDe coderControl,0x28);   
    Clear bitMask(RegControl,0x08);    
         
    complete = 0;
    _Bcnt = 0;   
     while (!complete && (status == MI_OK) )
    {
        
        ResetInfo();           
        WriteIO(RegChannelRedundancy,0x03);
        n bits = _Bcnt % 8;   
         if (n bits)
        {
            WriteIO(Reg bitFraming,n bits << 4 | n bits);
            nbytes = _Bcnt / 8 1;   
             if (n bits == 7)
            {
                cmd = PICC_ANTICOLL1;          
                WriteIO(Reg bitFraming,n bits);
            }
        }
         else
        {
            nbytes = _Bcnt / 8;
        }
        SndBuffer[0] = 0x93;
        SndBuffer[1] = 0x20 ((_Bcnt/8) << 4) n bits;
               
         for (i = 0; i < nbytes; i )  
        {
            SndBuffer[i 2] = _SNR;
        }
        nBytesToSend   = 2 nbytes;

status = M500PcdCmd(PCD_TRANSCEIVE);
         if (n bits == 7)
        {
            dummyShift1 = 0x00;
             for (i = 0; i <nBytesReceived; i )
            {
                dummyShift2 = RcvBuffer;
                RcvBuffer = (dummyShift1 >> (i 1)) | (RcvBuffer << (7-i));
                dummyShift1 = dummyShift2;
            }
            n bitsReceived -= nBytesReceived;
             if ( collPos )
                collPos = 7 - (collPos 6) / 9;
        }
         
         if ( status == MI_OK || status == MI_COLLERR)     // no other occured
        {
        
            byteOffset = 0;
            if( n bits != 0 )
            {
                _SNR[nbytes - 1]|= RcvBuffer[0];
                byteOffset = 1;
            }
             for ( i =0; i < (4 - nbytes); i )     
            {
                _SNR[nbytes i] = RcvBuffer[i byteOffset];
            }
             if (status != MI_COLLERR )
            {
                snr_crc = _SNR[0] ^_SNR[1] ^ _SNR[2] ^ _SNR[3];
                snr_check = RcvBuffer[nBytesReceived - 1];
                 if (snr_crc != snr_check)
                {
                    status = MI_SERNRERR;
                }
                 else   
                {
                    complete = 1;
                }
            }
             else                   
            {
                _Bcnt = _Bcnt collPos - n bits;
                status = MI_OK;
            }
        }
    }
    Clear bitMask(RegDe coderControl,0x20);
     return status;  
}

发信人: jiangbo123 发表时间: 2003-01-02 09:35:14
--------------------------------------------------------------------------------
也有可能是硬件的问题,有时候很奇怪的。呵呵。

发信人: 爬到最顶峰 发表时间: 2003-01-02 15:52:30
--------------------------------------------------------------------------------
char M500PcdConfig( void)
{
    char idata status;
    char idata i;
    char idata j;
    if ((status = M500PcdReset()) == MI_OK)
这个函数里500 reset总是不成功,也就是程序不会进入if语句里,
请问是有什么原因?

发信人: wuyuehua 发表时间: 2003-01-02 17:31:09
--------------------------------------------------------------------------------
   自编的c51程序,读取Mifare 1序列号经常错误,并且在读到序列号(四字节)时,又经常没有第五字节(CRC值),请各位指导!

发信人: StevenCh 发表时间: 2003-01-02 17:48:00
--------------------------------------------------------------------------------
Dear All Friends,
I am Steven Chang, responsible for Philips RFID products support in Big China.
Thanks all for your interest and application of PHILIPS IDE products.
Any question, please feel free to contact me.
发信人: StevenCh 发表时间: 2003-01-02 17:54:41
--------------------------------------------------------------------------------
Of course, you can get the serial number just one anticollision cycle if just one card is in antenna field.
发信人: wuyuehua 发表时间: 2003-01-03 14:17:04
--------------------------------------------------------------------------------
  自己编写了一个c51程序读取TagType及Serial-number, 但读取时经常出错,现在不知如何防止错误,提高正确率

发信人: cwcyxy 发表时间: 2003-01-03 14:22:24
--------------------------------------------------------------------------------
你的读写时序是总线型的还是i/o型的?
如果是i/o型的,时序不对。

发信人: wuyuehua 发表时间: 2003-01-03 14:48:54
--------------------------------------------------------------------------------
    总线型,线性寻址方式。读取Serial Number不能完全正确,不知读
到时以何标志认为其是正确的。

发信人: wuyuehua 发表时间: 2003-01-03 15:24:18
--------------------------------------------------------------------------------
Philips

发信人: cwcyxy 发表时间: 2003-01-03 16:54:16
--------------------------------------------------------------------------------
4字节序列号和一字节校验,
snr_crc = _SNR[0] ^_SNR[1] ^ _SNR[2] ^ _SNR[3];
校验字节等于序列号的异或和,则认为是正确的。

发信人: yaoji104 发表时间: 2003-01-03 17:02:49
--------------------------------------------------------------------------------
我在做读E2ROM 的程序,开始始终读不对。可后来突然就对了,当我调试寻卡的程序时才发现,片子烧了,TX1、TX2没输出了。后面又试了一片,还是同样的下场。救救我吧!!

发信人: cwcyxy 发表时间: 2003-01-03 17:27:43
--------------------------------------------------------------------------------
主要是EMC做的不行。

发信人: yiwujin 发表时间: 2003-01-04 10:13:39
--------------------------------------------------------------------------------
我记得SELECT后应收到0X88(对M1),但我现在收到的好像不是,而是0XAD或0XAB(无出错信息),不知是对是错?

发信人: wuyuehua 发表时间: 2003-01-04 11:03:02
--------------------------------------------------------------------------------
  AntiCollision过程、SelectTag过程、Authentication过程等一系列操作命令发出去后,是否有必要关闭Tx1 Tx2管脚的输出,如果是,那么在什么时候最合适。
  按照“philips”的原代码中,上电初始化时就将Tx1,Tx2打开有必要吗?

发信人: wuyuehua 发表时间: 2003-01-04 11:14:39
--------------------------------------------------------------------------------
   在SelectTag M1后收到的的确应是0x88,我想问阁下,你在Select操作之前直到Select开始的详细步骤

发信人: yiwujin 发表时间: 2003-01-04 15:15:59
--------------------------------------------------------------------------------
SELECT后读到0XAB,之后AUTH通过,甚至READ出了正确的16字节数值(且状态稳定)!这个0XAB总叫人不爽,真是怪了!另外修改M1卡片密码应如何操作?
TO:wuyuehua
   你应该有源码吧,我是读完源码后,依据它的流程,自己重新写了一下,基本上都能用,延时什么的修改一下。

发信人: jiangbo123 发表时间: 2003-01-04 15:34:47
--------------------------------------------------------------------------------
修改卡密码其实就是一个写操作。扇区密码验证通过之后就可以修改。将新的密码A和密码B和存取控制按照规定的格式拼成16字节的数据写到扇区的第三块就行了。格式是“密码A(6字节)+存储控制(4字节)+密码B(6字节)”,存储控制一定要小心,最好设置成可逆的,拼装存储控制的位很麻烦,最好在写入前设置断点,检查有没有出错,出错的话经常是不可回复的,我有一张卡差不多没有可以用的扇区了,都是密码修改搞的。

发信人: jiangbo123 发表时间: 2003-01-04 15:59:45
--------------------------------------------------------------------------------
块值可以加减之前必须先将该块的数据初始化为块值,其实也是一个写操作,块值只能保存4个字节长度的数据,初始化就是将这4个字节的数据,比如是ABCD四个字节,按照规定的格式拼装成16字节数据,然后写到该块中,比如该块的地址是Add。格式是“ABCD(4字节)+ABCD的反码(4字节)+ABCD(4字节)+add(1字节) add的反码(1字节)+add(1字节)+add的反码(1字节)”。只有保存的数据是按照这种格式,就可以进行加值减值操作。但是要注意的是加值减值操作都是低31个 bit的操作,最高字节的最高 bit无效,也就是四个字节的数据保存的最大数据其实只能到2的31次方。比如如果当前块值数据为0x8000001,这时如果减值0x00000002,就会出现溢出,函数返回错误值。但是如果进行加值操作溢出时,函数会正确返回,但是进位将被抛弃。比如当前值是0xffffffff,这时如果加值0x00000002,函数正确返回,读取块值此时为0x00000001。所以我们一般要求用户保存的数据不超过2的31次方。我记得的好像是这样子的,欢迎交流。

发信人: jiangbo123 发表时间: 2003-01-04 16:11:14
--------------------------------------------------------------------------------
密码块的中间4个字节是存取控制,控制着本扇区4块(包括密码块)的存取权限。可以设置密码A和密码B的对数据区和密码区访问权限,比如是否可读(写),密码块是否允许读取或者修改等,并且密码块的密码A、密码B和存取控制3部分可以不同。如果设置不对,可能会导致不可以恢复的后果。刚买的白卡密码A和B是六字节的0xff,并且此时只有密码A有效,密码和存取控制都可以被读出,前面的帖子也提到,当密码B可以被读出的时候,密码B是无效的,哪怕你验证密码B通过了,也不能取得扇区操作权限,只有修改了存取控制,使得密码B是不能被读出的,此时验证密码B才有效。

发信人: jiangbo123 发表时间: 2003-01-04 16:29:08
--------------------------------------------------------------------------------
这个帖子最初是我一个半月以前发的,没有想到这么多人感兴趣,到现在还能停留在首页,很感谢大家的支持!很高兴能与大家交流!

发信人: jiangbo123 发表时间: 2003-01-04 16:51:17
--------------------------------------------------------------------------------
我的天线寻卡距离我感觉应该是不错的,50*70的天线板寻卡距离有6cm左右,我是参照philips的天线设计文档做的,用的双面板,板子上有6个电容,一个电阻,分别对应文档中天线原理图上的C1、C2a1,C2a2,C2b1,C2b2,C1,R1,我没有算什么电感,参数都是试出来的,我的参数分别是47pf,80pf,80pf,80pf,80pf,47pf,56欧姆,我的感觉是C1的47pf是比较稳定的,天线板不同,只是对应的C2参数需要重新调整,我另外一块天线的参数就是将所以的80pf该成60pf左右,距离更远,其它的参数没有变。以上都是没有任何理论依据得出的数据,提出来只是给大家一个参考。我看到过一些其它人设计的天线,发现上面的电容电阻很多,排了一长排,我不知道他是按照什么设计的,对于这种情况,我的数据估计对他没有用。呵呵。

发信人: jiangbo123 发表时间: 2003-01-04 17:14:08
--------------------------------------------------------------------------------
天线的最大寻卡距离和天线板的直径有关,并且最大距离约等于天线板的直径,但是最大只能达到10cm左右,如果超过了10cm,即使天线板再做大,将不会继续增大寻卡距离。但是我不知道像我的天线是方形的,直径应该怎么算,呵呵。

(3)mifare卡读写器开发心得『转』--整理重发贴相关推荐

  1. (7)mifare卡读写器开发心得『转』--整理重发贴

    发信人: srz 发表时间: 2003-04-15 14:03:04 ----------------------------------------------------------------- ...

  2. (2)mifare卡读写器开发心得『转』--整理重发贴

    发信人: yaoji104 发表时间: 2002-12-16 16:24:49 ------------------------------------------------------------ ...

  3. java做的web系统 m1 读卡器 结合_IE浏览器接入IC卡读写器实现M1卡的读写功能

    基于ActiveX技术的ocx控件是实现网页上读写 IC卡的一个比较不错的方法,因为ocx是com组件,通过其发布的接口,IE可以实现所有的功能.ActiveX不仅能适应大部分编程语言,做到与编程语言 ...

  4. MetroMusic音乐播放器开发心得

    MetroMusic音乐播放器开发心得 在这个假期,我独立开发了自己的音乐播放器MetroMusic,之所以叫做MetroMusic,是因为这个播放器的界面采用目前最为流行的win8Metro风格.这 ...

  5. 公交IC卡读写器设计指南

    采用PHILIPS公司的Mifaue卡作IC卡,设计以射频技术为核心,以单片机为控制器的IC卡读写器在公交自动收费系统中的应用.制作的IC卡读写器可以实现制卡.售卡.自动收费等功能,具有安全.实用.方 ...

  6. 关于IC卡读写器的应用

    IC卡读写器的应用领域 IC卡具有存储容量大,保密性好,体积小,便于携带的性能特点,可以广泛应用于门禁管理.会议签到.车辆管理.一卡通.身份验证识别等相关行业.本文介绍了一种基于射频识别技术的RFID ...

  7. 射频卡读卡器发卡器,价格最低的射频卡读写器

    SDT系列射频卡读写器是目前市面上性价比最高的读写器之一,它采用进口原装芯片,USB无驱接口,黑色磨砂外壳,价格便宜而又有档次,性能优异. 1.SDT系列射频卡读写器全国最低价,最便宜的射频卡读写器. ...

  8. requestPermissions读写手机存储权限_单片机实例分享,RFID卡读写器的设计

    RFID(Radio Frequency Identification,射频识别)技术是一种非接触自动识别技术,利用射频信号通过空间耦合(电感或电磁耦合)实现无接触信息传递,并通过所传递的信息达到识别 ...

  9. IC卡读写器VB源代码

    IC卡读写器VB使用界面 详细代码 '广州荣士电子有限公司,联系电话020-82318861,82322852,定制13826029618 网址http://www.icmcu.com '读卡函数声明 ...

最新文章

  1. GCC中的分支预测(likely和unlikey)
  2. 让XP远程桌面支持多用户
  3. Vue-Cli 学习整理【转载】
  4. f5 ppt图标_PPT制作学习 (PPT技巧干货,拿走不谢)
  5. Web服務器的配置方法
  6. 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
  7. mysql创建和修改索引_MySQL索引创建 删除 增加 修改命令
  8. 堆、栈、堆栈详谈--复习
  9. php简单的日历代码,php日历代码(附演示效果)
  10. 《 剑指offer》 目录索引
  11. 适合数码家电行业用的进销存,一个软件顶一百个人工不是梦
  12. 嫌我们理科生不够浪漫?你有一份音乐数学入门指南待查收
  13. 偷看了隔壁老王的文章,发现String拼接另有天地
  14. Linux共享内存使用常见陷阱与分析
  15. linux打印机验证密码,HP LaserJet Pro打印机远程管理员密码泄露漏洞
  16. FFmpeg 命令详解
  17. GP232RL直接替代FT232RL串口芯片uart接口
  18. 物联网智慧农业的方案介绍(一)【方案篇01】
  19. 天文观测常用英文单词
  20. AITM 2-0003 水平燃烧试验

热门文章

  1. Linux内核编译很简单,6步编译一个自己的内核
  2. 关联规则--Apriori算法
  3. 《惢客创业日记》2018.12.28(周五)创业从0到1的10个阶段(七)
  4. 安装包免费下载(持续更新ing…)
  5. Arduino使用ROS通过键盘控制单个直流电机
  6. cloudSim学习
  7. Java项目:SSM在线工艺品销售商城平台网站
  8. (C语言)switch()
  9. 电子通信计算机专业的英语论文,电子信息工程英文参考文献
  10. 计算机常用工具软件第5版,计算机常用工具软件(第3版)