ISO1444-3块传输协议主要用于应用数据的传输,其实现如下:

unsigned char Apdu(unsigned char *comm,unsigned short  len,unsigned char *resp,unsigned short  *rlen)
{
  unsigned char   IPCB;
  unsigned ;
  unsigned char   OPCB;
  unsigned ];
  unsigned ];
  unsigned short  outlen;
  unsigned short  inlen;
  unsigned char   temp;
  unsigned ,OutOffSet=;
  unsigned ;
  unsigned short  stemplen=len;
  unsigned char   RfMlen;
  unsigned ;
  unsigned ;
  *rlen =;
  RfMlen= Frame_Data_Len_Rf--(unsigned char)RCid_En;
  )
  {
    )
    {
        OPCB = RCid_En?0X0A:0x02;
        OPCB =(stemplen>RfMlen)?(OPCB|0X10):OPCB;
        OPCB = OPCB|rblock_num;
        otempbuf[] = OPCB;
        otempbuf[] = RCID;
        xtemplen = (stemplen>=RfMlen)?RfMlen:stemplen;
        memcpy(&otempbuf[(unsigned ],&comm[OutOffSet],xtemplen);
        outlen = xtemplen +  + (unsigned char)RCid_En;
    }
//    PutDatUart(otempbuf,outlen);
    temp =  I_Block(otempbuf,(unsigned char)outlen,itempbuf,&inlen);
//    PutDatUart(itempbuf,inlen);
    )
    {
        tcount++;
        )
        {
             *rlen = ;
             return temp;
        }
        otempbuf[] =RCid_En?(0XBA|rblock_num):(0XB2|rblock_num);
        otempbuf[] = RCID;
        outlen = +(unsigned char)RCid_En;
        Flag = ;
    }
    else
    {
       tcount = ;
       IPCB=itempbuf[];
       if((IPCB&0XC2)==0X02)  //i-block
       {
            if((IPCB&0x01)==rblock_num)
            {
               rblock_num=!rblock_num;
               )
               {
                   templen = inlen--(unsigned char)RCid_En;
                   memcpy(&resp[InOffSet],&itempbuf[(unsigned ],templen);
                   InOffSet = InOffSet + templen;
                   *rlen = InOffSet;
                   return RF_OK;
                }
                else
                {
                     templen = inlen--(unsigned char)RCid_En;
                     memcpy(&resp[InOffSet], &itempbuf[(unsigned ],templen);
                     InOffSet = InOffSet + templen;
                     //ACK
                     otempbuf[] =0XA2|rblock_num;
                     otempbuf[] =RCid_En?(otempbuf[]|];
                     otempbuf[] =RCID;
                     outlen =  + (unsigned char)RCid_En;
                     Flag = ;
                 }
           }
      }
      else if((IPCB&0XF2)==0XF2) //WTX
      {
            outlen = inlen;
            memcpy(otempbuf,itempbuf,inlen);
            Flag = ;
      }
      else if((IPCB&0XB2)==0XA2)// ack
      {
         if((IPCB&0x01)==rblock_num) //next frame
         {
             rblock_num = !rblock_num;
             OutOffSet = OutOffSet+xtemplen;
             stemplen  = stemplen -xtemplen;
         }
         Flag = ;
      }
      else
      {
            tcount++;
            ) return FM_OVERTIME;
            if((IPCB&0X10)==0X00)
            {
                 otempbuf[] =0XB2|rblock_num;
            }
            else
            {
              otempbuf[] =0XA2|rblock_num;
            }
            otempbuf[] = RCid_En?(otempbuf[]|];
            otempbuf[] = RCID;
            outlen =  + (unsigned char)RCid_En;
            Flag = ;
       }
     }
  }
}
unsigned char I_Block(unsigned char *comm,unsigned char len,unsigned char *resp,unsigned short *rlen)
{
 unsigned char  temp, old_TimerReload;
 unsigned int  xtemp1;
 old_TimerReload=TimerReload;
 ]&0xf7)==0xf2)
 {
      temp=(comm[]&]:comm[];
       && temp<)
      {
           xtemp1=TimerReload*temp;
           )
           {
                TimerReload=;
           }else
           {
                while(TimerReload!=(unsigned char)xtemp1)
                TimerReload=(unsigned char)xtemp1;
           }
           while(TimerReload!=(unsigned char)xtemp1);
      }
 }
 temp = CmdSend(len, comm, Transceive);
 TimerReload=old_TimerReload;
 if (temp == FALSE)
 {
      return OVERTIME;
 }
 temp = ErrorFlag;
 if ((temp & 0x02) == 0x02)
  return PARITYERR;
 if((temp & 0x04) == 0x04)
  return FRAMINGERR;
 if ((temp & 0x08) == 0x08)
  return CRCERR;
 *rlen=Read_FIFO(resp);
 return OK;
}

unsigned char CmdSend(unsigned char count,unsigned char * buff,unsigned char Comm_Set)
{
 unsigned char  temp;
 unsigned char   ctemp1;
 unsigned long   cj;
 unsigned short  near atime1,atime2;
 Command = Idle_Command;
 Clear_FIFO();
 Int_Req=0x7f;
 )
 {
      Write_FIFO(count, buff);
  }
 ; cj< RF_Time2; cj++) //延时500ms
 {
     ) break;
 }
 ))
 return HARDWARE_ERR;
 Command = Comm_Set;     //命令执行
 ; cj< TIMEDELAY; cj++)    //至少延时5s
 {
      temp = Command;
      ctemp1 = Int_Req;
      if(temp == 0x00   || (ctemp1 & 0x0C))   return TRUE;
      else if((ctemp1&0x20)==0x20)            return FALSE;
  }
  return FALSE;
}

实现本功能需要注意到是rblock_num属于全局变量,在RATS中被初始化为0

Frame_Data_Len_Rf在RATS中被初始化为最大帧长度

RCid_En根据RATS中的参数确定为支持CID或者不支持CID

ISO14443-4块传输协议的实现的更多相关文章

  1. ISO7816协议的块传输协议

    1.块传输协议中的前三个字节是强制必须有的 NAD节点地址: 当终端支持多个卡槽,终端和这些卡槽以总线的方式通讯时,该字节有用,其他情况下,默认为0 bit1-3:定义了源地址 bit5-7:定义了目 ...

  2. IC卡的传输协议(2)-块传输协议T=1【转】

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_172024.HTM 2.4 块传输协议T=1 T=1协议中,在TAL和IC卡之间传送的命令.R-APDU和传输控制信息 ...

  3. IC卡的传输协议(2)-块传输协议T=1续【转】

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_172025.HTM (3)容错操作 先来看一下容错的规则定义. * 复位应答后,第一个数据块是由终端发往IC卡的,而且 ...

  4. PBOC第八部分和第十一部分关于TYPEA总结(二)——传输协议(ISO14443-4)

    二.传输协议(ISO14443-4)(8,P50 11,P30) 1.选择应答请求(RATS) 使用RATS命令和PICC协商通讯的最大帧长度(FSD和FSC).帧等待时间(FWT)和启动帧保护时间( ...

  5. ISO7816 传输协议 T0 T1

    T=0协议不能用一条命令来实现,必须分为两步实现:第一条命令为卡片提供数据,然后用另外一条相关的命令来取回数据.这样给卡片的编程带来很大麻烦,同时卡片内存中必须保留上一次操作需要返回的数据.这时如果不 ...

  6. 智能IC卡与终端(读卡器)之间的传输协议

    1.有两种协议 T=0,异步半双工字符传输协议 T=1,异步半双工块传输协议 终端一般都支持这两种协议,IC卡可以选择支持其中的一种.(因为终端可能需要面对各种类型的卡片,所以必须两种协议都支持,而卡 ...

  7. IC卡的传输协议(1)-字符传输协议T=0【转】

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_172022.HTM 在异步半双工传输协议中,主要定义了终端为实现传输控制和特殊需要发出的命令及这些命令的处理过程. 在 ...

  8. Bulk-Only传输协议 UFI命令块规范

    USB设备分为5大类,即显示器.通信设备.音频设备.人机输入和海量存储.通常所用的U盘.移动硬盘均属于海量存储类.海量存储类的规范中包括4个独立的子规范,即CBI传输.Bulk-Only传输.ATA命 ...

  9. HTTP超文本传输协议-HTTP/1.1中文版

    摘要 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...

随机推荐

  1. Spark GraphX的函数源码分析及应用实例

    1. outerJoinVertices函数 首先给出源代码 override def outerJoinVertices[U: ClassTag, VD2: ClassTag] (other: RD ...

  2. python-用户登录小程序

    算是第一篇博客吧~哈哈哈 虽然说是为了完成作业,不过以后估计会常来分享.首先说一下下边这个程序的基本功能.毕竟是第一次写python程序还是有点小激动和满满的成就感的,下边这个程序: 1.输入不存在的 ...

  3. 【足迹C++primer】表达式求值

    表达式求值 /** * 功能:表达式求值(0到9) * 时间:2014年6月15日08:02:31 * 作者:cutter_point */ #include<stdlib.h> #inc ...

  4. [PWA] 9. Service worker registerion && service work's props, methods and listeners

    In some rare cases, you need to ask user to refresh the browsser to update the version. Maybe becaus ...

  5. android开发launcher

    1. launcher是桌面应用程序 一. android.intent.category.LAUNCHER与android.intent.category.HOME的差别?      android ...

  6. html contenteditable

    contenteditable 是html中的一個屬性,在HTML中,某些元素設置 contenteditable='true'  屬性時可以開啟該元素的編輯模式,contenteditable 可以 ...

  7. Analyzing UI Performance with Systrace 使用systrace工具分析ui性能

    While developing your application, you should check that user interactions are buttery smooth, runni ...

  8. ubuntu 安装 flash player

    ubuntu 软件中心里的 flash , 虽说写的支持 chrome , 但安装总不管用 可运行以下两个命令, 再重启 chrome 浏览器 (注意,一定要把打开的浏览器全部关闭, 再打开才可以) ...

  9. 设计模式UML图

    1.简单工厂模式 2.工厂模式 工厂模式与简单工厂模式的不同在于,每个操作类都有自己的工厂,而且把逻辑判断交给了客户端,而简单工厂的逻辑判断在工厂类里边,当增加新的操作类时,简单工厂需要修改工厂类,而 ...

  10. 使用Instant Client配置PL/SQL Developer

    之前使用PL/SQL Developer都是直接在本机安装完整版的Oracle Database,一是省事,二是可以在本机做一些demo测试:最近换了台电脑,感觉Instant Client更简单一些 ...