⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commtran.c

📁 此程序为13.56MHz的RFID底层读写卡程序
💻 C
📖 第 1 页 / 共 4 页
字号:

          case 0x51:     //DecrementPurse
          case 0x52:     //DecrementPurseFile
                 block_n=(sector_n<<2)+1;
                 *(uchar *)&money1=ComBuffer[6];
                 *((uchar *)&money1+1)=ComBuffer[7];
                 *((uchar *)&money1+2)=ComBuffer[8];
                 *((uchar *)&money1+3)=ComBuffer[9];
                 Status=MF1_read(keytest,block_n,buf);//
                 if(Status==MI_OK)
                 {
                      *(uchar *)&money2=buf[3];
                      *((uchar *)&money2+1)=buf[2];
                      *((uchar *)&money2+2)=buf[1];
                      *((uchar *)&money2+3)=buf[0];
                      if(money1>money2)
                      {
                          SendResponse(0xA0,1,buf); //not enough money
                          return;
                      }
                      money2=money2-money1;
                      temp[3]=*((uchar *)&money2);
                      temp[2]=*((uchar *)&money2+1);
                      temp[1]=*((uchar *)&money2+2);
                      temp[0]=*((uchar *)&money2+3);

                      *(uchar *)&money2=*((uchar *)&money1+3);
                      *((uchar *)&money2+1)=*((uchar *)&money1+2);
                      *((uchar *)&money2+2)=*((uchar *)&money1+1);
                      *((uchar *)&money2+3)=*((uchar *)&money1);

                      Status=Mf500PiccValue(PICC_DECREMENT,block_n,(uchar *)&money2,block_n); //PI

                          if(Status==MI_OK)
                          {
                               Status=MF1_read(keytest,block_n,buf);
                               if(Status==MI_OK)
                               {
                                  if(memcmp(temp,buf,4)==0)
                                  {
                                     SendResponse(0x01,5,buf);
                                     return;
                                  }
                               }
                          }

                 }
                 SendResponse(0xA1,1,buf);
                 break;

           /***********************************************************/
       case 0x59:     //IncrementPurse              2002.7.17
       case 0x60:     //IncrementPurseFile
                 block_n=(sector_n<<2)+1;
                 *(uchar *)&money1=ComBuffer[6];
                 *((uchar *)&money1+1)=ComBuffer[7];
                 *((uchar *)&money1+2)=ComBuffer[8];
                 *((uchar *)&money1+3)=ComBuffer[9];
                 Status=MF1_read(keytest,block_n,buf);
                 if(Status==MI_OK)
                 {
                      *(uchar *)&money2=buf[3];
                      *((uchar *)&money2+1)=buf[2];
                      *((uchar *)&money2+2)=buf[1];
                      *((uchar *)&money2+3)=buf[0];

                      money2=money2+money1;
                      temp[3]=*((uchar *)&money2);
                      temp[2]=*((uchar *)&money2+1);
                      temp[1]=*((uchar *)&money2+2);
                      temp[0]=*((uchar *)&money2+3);
               /****************************************************************/
                      *(uchar *)&money2=*((uchar *)&money1+3);
                      *((uchar *)&money2+1)=*((uchar *)&money1+2);
                      *((uchar *)&money2+2)=*((uchar *)&money1+1);
                      *((uchar *)&money2+3)=*((uchar *)&money1);


                      Status=Mf500PiccValue(PICC_INCREMENT,block_n,(uchar *)&money2,block_n);

                          if(Status==MI_OK)
                          {
                               Status=MF1_read(keytest,block_n,buf);
                               if(Status==MI_OK)
                               {
                                  if(memcmp(temp,buf,4)==0)
                                  {
                                     SendResponse(0x01,5,buf);
                                     return;
                                  }
                               }
                          }

                 }
                 SendResponse(0xA1,1,buf);
                 break;
     /************************************************************************/
         case 0x53:     //CheckPurseFormat
         case 0x54:     //CheckPurseFileFormat
                        //"ComBuffer[6]为钱包类型 主钱包0x00备份钱包0x01
                 block_n=(sector_n<<2)+1+ComBuffer[6];
                 Status=MF1_read(keytest,block_n,buf);
                 if(Status!=MI_OK)
                 {
                    SendResponse(0x80,1,buf);
                    return;
                 }
                 if((buf[0]==~buf[4])&&(buf[1]==~buf[5])&&(buf[2]==~buf[6])&&(buf[3]==~buf[7]))
                 {
                      SendResponse(0x01,5,buf);
                 }
                 else
                 {
                      SendResponse(0xA2,1,buf); //PurseFormatError
                 }
                 break;
         /*****************************************************************************/
         case 0x55:     //RestorePurse
         case 0x56:     //RestorePurseFile
                        //"ComBuffer[6]为钱包类型 主钱包0x00,备份钱包0x01
                 if(ComBuffer[6]==0x01)
                 {
                    block_n=(sector_n<<2)+1;
                    key_index=block_n+1;
                 }
                 else
                 {
                    block_n=(sector_n<<2)+2;
                    key_index=block_n-1;
                 }
                 for(i=0;i<10;i++)
                 {
                    Status=MF1_read(keytest,block_n,buf2);
                    if(Status==MI_OK)
                    {
                       Status=Mf500PiccValue(PICC_RESTORE,block_n,buf2,key_index);
                          if(Status==MI_OK)
                          {
                             Status=MF1_read(keytest,key_index,buf);
                             if(Status==MI_OK)
                             {
                               if(memcmp(buf2,buf,16)==0) break;
                             }
                          }

                    }
                 }
                 if(i>=10)
                 {
                    SendResponse(0x80,1,buf);
                 }
                 else
                 {
                    SendResponse(0x01,1,buf);
                 }
                 break;
/************************************************************************************/



          case 0x20:                          /*open card*/
                 Requestmode=ComBuffer[3];    //0X52 ALL OR 0X26 IDLE
	         for(i=0;i<10;i++)
	         {
	           Status=Mf500PiccRequest(Requestmode,buf);
	           if(Status==MI_OK) break;
	         }
	         if(Status!=MI_OK)
	         {
	            SendResponse(0x00,1,buf);
	            return;
	         }
	         Status=Mf500PiccAnticoll (0,snr);
                 if(Status==MI_OK)
                 {
                    Status=Mf500PiccSelect(snr,buf);
                    if(Status==MI_OK)
                    {
                      snr[4]=buf[0];                            //Card type
                      SendResponse(0x01,6,snr);
                      return;
                    }
                 }
                 SendResponse(0x80,1,buf);
                 break;

        case 0x24:		                               //authi  mode1
                 if(ComBuffer[3]==0x01)                        //0x01 for the keyB
                 {
                  keytest=PICC_AUTHENT1B;
                 }
                 keytest=PICC_AUTHENT1A;
                 sector_n=ComBuffer[4];
                 block_n=ComBuffer[5];
                 Status=Mf500PiccAuth(keytest,sector_n,block_n); //  modify1
                 if(Status==MI_OK)
	         {
	          SendResponse(0x01,1,buf);
	         }
	         else
	         {
	          SendResponse(0x80,1,buf);
	         }
                 break;

        case 0x25:		                                  //readblock
                 block_n=ComBuffer[3];
                 memset(buf,0xff,20);
                 Status=Mf500PiccRead(block_n,buf);
                 if(Status==MI_OK)
	         {
	          SendResponse(0x01,17,buf);
	         }
	         else
	         {
	          SendResponse(0x80,1,buf);
	         }
                 break;

        case 0x26:		                                 //writeblock

                 block_n=ComBuffer[3];
                 memcpy(buf,ComBuffer+4,16);
                 Status=Mf500PiccWrite(block_n,buf);
                 if(Status==MI_OK)
	         {
	          SendResponse(0x01,1,buf);
	         }
	         else
	         {
	          SendResponse(0x80,1,buf);
	         }
                 break;

        case 0x27:		     /*PICC_value */
                 piccvaluecmd=ComBuffer[3];
                 block_n=ComBuffer[4];
                 block_ob=ComBuffer[5];
                 *(uchar *)&money1=ComBuffer[9];
                 *((uchar *)&money1+1)=ComBuffer[8];
                 *((uchar *)&money1+2)=ComBuffer[7];
                 *((uchar *)&money1+3)=ComBuffer[6];
                 Status=Mf500PiccValue(piccvaluecmd,block_n,(uchar *)&money1,block_ob);//modify1
                 if(Status==MI_OK)
	         {
	          SendResponse(0x01,1,buf);
	         }
	         else
	         {
	          SendResponse(0x80,1,buf);
	         }
                 break;

        case 0x28:		                                //MF1_authkey
                 if(ComBuffer[3]==0x01)
                   {
                    key_type=PICC_AUTHENT1B;
                   }
                 key_type=PICC_AUTHENT1A;
                 block_n=ComBuffer[4];
                 memcpy(key,ComBuffer+5,6);
                 Status=MF1_authkey(key_type,key,block_n);
                 SendResponse(Status,0x01,buf);
                 break;


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


          case 0xb0:                           //"蜂鸣器参数控制
                 //"格式:60 04 b0    (循环次数)响声次数()
                 //        0  1  2        3          4

                 key_index=ComBuffer[3];
                 *((uchar *)&freq)=ComBuffer[4];
                 *((uchar *)&freq+1)=ComBuffer[5];
                 Beep(key_index,freq);
                 SendResponse(0x01,1,buf);
                 break;

          case 0x3e:                           /* get reader info */
	         SendResponse(0x01,12,version_number);
                 break;
/****************************************************************************************/

         case 0x73:                               //speakout

                 //"格式:60 04 b0 (响的次数1字节)(频率2字节)
                 //        0  1  2        3            4 5
                 
                 key_index=ComBuffer[3];
                 *((uchar *)&freq)=ComBuffer[4];
                 *((uchar *)&freq+1)=ComBuffer[5];
                 Beep(key_index,freq);
                 SendResponse(0x01,1,buf);
                 break;

         case 0x74:                           //writeE2ROM of watchdog
                 *(uchar *)&RAM_address=ComBuffer[3];
                 *((uchar *)&RAM_address+1)=ComBuffer[4];
                 if(RAM_address>512)
                 {
                  SendResponse(0x00,1,buf);
                  return;
                 }
                 if(RAM_address>=0x0000&RAM_address<=0x001f)     //0x0000~~0x001f E2ROM FOR THE KEY OF 105
                 {
                  SendResponse(0x00,1,buf);
                  return;
                 }
                 LEN1=ComBuffer[5];
                 i=0;
                 j=16-(RAM_address%16);
                 if(j!=16)
                 {
                  Status=Write_Ram_byte(RAM_address,ComBuffer+6,j);
                  RAM_address+=j;
                  i=j;
                  LEN1-=j;
                 }
                 while(LEN1>16)
                 {
                  Status=Write_Ram_byte(RAM_address,ComBuffer+6+i,16);
                  RAM_address+=16;
                  LEN1-=16;
                  i+=16;
                 }
                 Status=Write_Ram_byte(RAM_address,ComBuffer+6+i,LEN1);
                 SendResponse(0x01,1,buf);
	         break;

          case 0x75:                           //ReadE2ROM of watchdog
                 *(uchar *)&RAM_address=ComBuffer[3];
                 *((uchar *)&RAM_address+1)=ComBuffer[4];
                 if(RAM_address>512)
                 {
                  SendResponse(0x00,1,buf);
                  return;
                 }
                 if(RAM_address>=0x0000&RAM_address<=0x001f)     //0x0000~~0x001f E2ROM FOR THE KEY OF 105
                 {
                  SendResponse(0x00,1,buf);
                  return;
                 }
                 LEN1=ComBuffer[5];
                 i=0;
                 while(LEN1>16)
                 {
                  Read_Ram(RAM_address,ComBuffer+9+i,LEN1);
                  RAM_address+=16;
                  LEN1-=16;
                  i+=16;
                 }
                 Read_Ram(RAM_address,ComBuffer+9+i,LEN1);
                 SendResponse(0x01,1+17+LEN1+i,buf);
	         break;
/*************************************************************************************/

/*************************************************************************************/
case  0x7C:
            ModifyBaudrate12();
            break;

/*************************************************************************************/
case  0x7E:                //RESET the reader, for test
            SFCF&=0XFD;
            SFCF|=0X02;
            break;

/*********************************************************************/
         case 0xe0:                           /* send message again */
	         SendMessage();
                 break;

          default:
	         SendMsError();
       }
       memset(ComBuffer,0xff,30);
       return;

 }


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -