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

📄 commtran.c

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

	         len_index=ComBuffer[1]-1;
                 memset(buf,0x00,16);
                 memset(buf2,0x00,16);
                 i=0;
	         while(len_index>13)
	         {

	            buf[0]=0x12|Block_Index;
	            memcpy(buf+1,ComBuffer+3+i,13);
                    Status=Mf500PiccExchangeBlock(buf,16,buf2, &rec_bytelen, 1,5);
                    if(Status!=MI_OK)
                    {
                       SendResponse(0x80,1,buf);
                       return;
                    }
                    memset(buf2,0x00,16);
		    memset(buf,0x00,16);
                    len_index-=13;
                    i+=13;
                 }
                 buf[0]=0x02|Block_Index;
                 memcpy(buf+1,ComBuffer+3+i,len_index);
                 Status=Mf500PiccExchangeBlock(buf,len_index+3,buf2, &rec_bytelen,1, 5);

                 if(Status!=MI_OK)
                 {
                     SendResponse(0x80,1,buf);
                     return;
                 }

                 len_index=0;
                 while((buf2[0]==0x12)||(buf2[0]==0x13))
                 {
                    memcpy(ComBuffer+9+2+len_index,buf2+1,13);
                    len_index+=13;
                    memset(buf2,0xff,16);  //2004.4.2
                    buf[0]=0xa2|Block_Index;
                    memset(buf2,0xff,16);
                    Status=Mf500PiccExchangeBlock(buf,3,buf2, &rec_bytelen,1, 5);
                    if(Status!=MI_OK)
                    {
                     SendResponse(0x80,1,buf);
                     return;
                    }
                }
                memset(buf,0xff,25);
                //memcpy(buf,buf2,rec_bytelen);
                if(rec_bytelen<5)
                {
                  if((buf2[1]==0x00)&&(ComBuffer[9+2+len_index-1]==0x90))
                  {
                    sw1=0x90;
                    sw2=0x00;
                    ComBuffer[7+2]=sw1;
                    ComBuffer[8+2]=sw2;
                    SendResponse(0x01,len_index-1+3+17,buf);
                    return;
                  }
                }
                 k=0;
                 j=0;
                 for(i=1;i<13;i++)
                 {
                    if((buf2[i]==0x90)&&(buf2[i+1]==0x00))
                    {
                      k=i;
                      j=1;
                    }
                 }
                 if(j==1)
                 {
                   i=k;
                   j=0;
                 }

                 if(i<13)
                 {
                    sw1=0x90;
                    sw2=0x00;
                    i--;
                    ComBuffer[7+2]=sw1;
                    ComBuffer[8+2]=sw2;
                    memcpy(ComBuffer+9+2+len_index,buf2+1,i);
                    len_index+=i;
                 }
                 else
                 {
                    sw1=buf2[1];
                    sw2=buf2[2];
                    ComBuffer[7+2]=sw1;
                    ComBuffer[8+2]=sw2;
                    len_index=0;
                 }
                 SendResponse(0x01,len_index+3+17,buf);
                 break;

            case 0x58:                   //close card for pro
	         Status=deselect();
	         if(Status==MI_OK)
	         {
	            SendResponse(0x01,1,buf);
	         }
	         else
	         {
	            Status=deselect();
	            if(Status==MI_OK)
	            {
	            	SendResponse(0x01,1,buf);
	            }
	            else SendResponse(0x80,1,buf);
	         }

             break;
      /**************************************************************************************/
          case 0x98:     //T=0; for hihgspeed sam card
	         W_DOG();
	         switch(ComBuffer[3])//check message's head
	         {
	            case 0x00:
	            case 0x04:
	            case 0x80:
	            case 0x84:
                    case 0xe0:
	                 key_index=1; break;
	            default:
	                 key_index=0;
	         }
	         if(key_index==0)
	         {
	            SendResponse(COS_CLA_ERROR,1,buf);
	         }
	         if(ComBuffer[1]==6)
	         {
	            len_index=1;
	         }
	         else len_index=0;

	         IO1=1;

                 len_x=ComBuffer[7]+2;
                 len_y=ComBuffer[4];
                 i=0;

                 I_send(ComBuffer[3]);
                 I_send(ComBuffer[4]);
                 I_send(ComBuffer[5]);
                 I_send(ComBuffer[6]);
                 I_send(ComBuffer[7]);

                 if(len_index==1)
                 {
	            sw1=I_receive();
                    if(sw1!=len_y)
                    {
                       sw2=I_receive();
                       buf[0]=sw1;
                       buf[1]=sw2;
                       SendResponse(0x01,3,buf);
                       return;
                    }

       		    while(i<len_x)
                    {
                       CosBuffer[i]=I_receive();
                       i++;
                    }
                    memcpy(ComBuffer+9,CosBuffer,len_x);
                    SendResponse(0x01,i+1+17,buf);
                    return;
                 }

                 sw1=I_receive();
                 for(i=0;i<120;i++)
                 {
                   ;
                 }

		 IO1=1;
                 for(i=8;i<(ComBuffer[1]+2);i++)
                 {
                    I_send(ComBuffer[i]);
                 }

                 sw1=I_receive();
                 sw2=I_receive();
                 if(sw1!=0x61)
                 {
                    buf[0]=sw1;
                    buf[1]=sw2;
                    SendResponse(0x01,3,buf);
                    return;
                 }

                 for(i=0;i<60;i++)
                 {
                   ;
                 }

                 IO1=1;
                 len_y=sw2+2;
	         i=0;
   	         I_send(0x00);
                 I_send(0xc0);
                 I_send(0x00);
                 I_send(0x00);
                 I_send(sw2);

                 sw1=I_receive();
   	         while(i<len_y)
	         {
	            CosBuffer[i]=I_receive();
                    i++;
    	         }
                 memcpy(ComBuffer+9,CosBuffer,len_y);
                 SendResponse(0x01,1+len_y+17,buf);

                 break;

         /************************************************************/
	  case 0x99:                   //RESET SAM CARD
	         Reset1();
                 i=0;
                 while(1)
		 {
		    Status=I_receive1(ComBuffer+9+i);
                    if(Status)  break;
                    i++;
		 }
                 if(i<5)              //look as error
                 {
                  SendResponse(0x80,1+i+17,buf);
                  return;
                 }
                 SendResponse(0x01,1+i+17,buf);
                 break;
/********************************************************************************/
        case 0x72:                   //T=0;   T=1; IC COMMAND
	         W_DOG();
                 cardsequ=select_sen_refunc();
                 ICProtol=ComBuffer[3+2];

               if(ICProtol!=0x01)
               {
	          switch(ComBuffer[4+2])    //check message's head
	           {
	             case 0x00:
	             case 0x04:
	             case 0x80:
	             case 0x84:
                     case 0xA0:
                     case 0xe0:
	                  key_index=1; break;
	             default:
	                  key_index=0;
	          }
	         if(key_index==0)
	         {
	            SendResponse(COS_CLA_ERROR,1,buf);
	         }
	         if(ComBuffer[1]==9)       // ComBuffer[1]==6
	         {
	            len_index=1;
	         }
	         else len_index=0;

                 len_x=ComBuffer[8+2]+2;
                 len_y=ComBuffer[5+2];
                 i=0;

                Status=cpucard_send(ComBuffer[4+2],(void*)(send_option[cardsequ]));
                Status=cpucard_send(ComBuffer[5+2],(void*)(send_option[cardsequ]));
                Status=cpucard_send(ComBuffer[6+2],(void*)(send_option[cardsequ]));
                Status=cpucard_send(ComBuffer[7+2],(void*)(send_option[cardsequ]));
                Status=cpucard_send(ComBuffer[8+2],(void*)(send_option[cardsequ]));

                 if(len_index==1)
                 {
	           Status=cpucard_rec(&sw1,(void*)(rec_option[cardsequ]));
                   if(sw1!=len_y)
                    {
                       Status=cpucard_rec(&sw2,(void*)(rec_option[cardsequ]));
                       buf[0]=sw1;
                       buf[1]=sw2;
                       SendResponse(0x01,3,buf);
                       return;
                    }

       		    while(i<len_x)
                    {
                       Status=cpucard_rec(CosBuffer+i,(void*)(rec_option[cardsequ]));
                       if(Status)  break;
                       i++;
                    }
                    memcpy(ComBuffer+9,CosBuffer,len_x);
                    SendResponse(0x01,i+1+17,buf);
                    return;
                 }

                 Status=cpucard_rec(&sw1,(void*)(rec_option[cardsequ]));
                 for(i=0;i<60;i++)
                 {
                   ;
                 }

                 for(i=9+2;i<(ComBuffer[1]+2);i++)     //i=8   test
                 {
                    Status=cpucard_send(ComBuffer[i],(void*)(send_option[cardsequ]));
                 }

                  Status=cpucard_rec(&sw1,(void*)(rec_option[cardsequ]));
                  Status=cpucard_rec(&sw2,(void*)(rec_option[cardsequ]));
                 if(sw1!=0x61)
                 {
                    buf[0]=sw1;
                    buf[1]=sw2;
                    SendResponse(0x01,3,buf);
                    return;
                 }

                 for(i=0;i<60;i++)
                 {
                   ;
                 }

                 len_y=sw2+2;
	         i=0;

                   Status=cpucard_send(0x00, (void*)(send_option[cardsequ]));
                   Status=cpucard_send(0x0c0,(void*)(send_option[cardsequ]));
                   Status=cpucard_send(0x00, (void*)(send_option[cardsequ]));
                   Status=cpucard_send(0x00, (void*)(send_option[cardsequ]));
                   Status=cpucard_send(sw2,  (void*)(send_option[cardsequ]));

                 Status=cpucard_rec(&sw1,(void*)(rec_option[cardsequ]));
   	         while(i<len_y)
	         {
                    Status=cpucard_rec(CosBuffer+i,(void*)(rec_option[cardsequ]));
                    if(Status)  break;
                    i++;
    	         }
                 memcpy(ComBuffer+9,CosBuffer,len_y);
                 SendResponse(0x01,1+len_y+17,buf);

             }

              else if(ICProtol==0x01)
               {
                 LEN1=ComBuffer[8] ;           //T=1 协议  2003.02.21
                 for(i=0;i<ComBuffer[8]+4;i++)
                 {
                  Status=cpucard_send(ComBuffer[i+6],(void*)(send_option[cardsequ]));
                 }
                 Status=cpucard_rec(ComBuffer+9,(void*)(rec_option[cardsequ]));//NAD
                 Status=cpucard_rec(ComBuffer+10,(void*)(rec_option[cardsequ]));//PCB
                 Status=cpucard_rec(ComBuffer+11,(void*)(rec_option[cardsequ]));//LEN
                 for(i=0;i<ComBuffer[11]+1;i++)
                 {
                  Status=cpucard_rec(ComBuffer+12+i,(void*)(rec_option[cardsequ]));
                 }
                 SendResponse(0x01,1+3+i+17,buf);
               }
              break;
 /******************************************************************************/
	  case 0x71:                         //RESET ICSLOT OR OPEN ICSLOT/
                  W_DOG();
                  cardsequ=select_sen_refunc();
                  if(ComBuffer[3]==1)  slot1_baud=ComBuffer[4]-1;

                 Reset(ComBuffer[3]-1);
                 i=0;
          	 while(1)
		 {
                   Status=cpucard_rec(ComBuffer+9+i,(void*)(rec_option[cardsequ]));
                   if(Status)  break;
                   i++;
		 }

                if(i<3)                  //look as error
                 {
                  SendResponse(0x80,1+i+17,buf);
                  return;
                 }
                 SendResponse(0x01,1+i+17,buf);
                 break;
/*********************************************************************************/

⌨️ 快捷键说明

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