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. bzoj1036 zjoi2008 树的统计 count

    填坑= =第一道裸树剖 #include<cstdio> #include<algorithm> #include<cstring> #include<cst ...

  2. 谈一下spring 的理解

    spring,大家基本都在使用,两个核心: 声明式事务AOP : 控制反转依赖注入IOC: 以前对控制反转和依赖注入很模糊,现在大概理解了意思,控制反转,有spring容易来控制bean 的创建,我们 ...

  3. Android系统默认Home应用程序(Launcher)的启动过程源码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还须要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...

  4. 数据库系统——B+树索引

    原文来自于:http://dblab.cs.toronto.edu/courses/443/2013/05.btree-index.html 1. B+树索引概述 在上一篇文章中,我们讨论了关于ind ...

  5. Junit使用教程(一)

    几乎所有程序员都听说过Junit的大名,但不知真正懂得运用它的人有多少,我便是其中的一个小白. 知道Junit是用来测试的,但却把“宝刀”当成了“菜刀”用.为了从此不再菜鸟,特此总结整理了下Junit ...

  6. HDFS Architecture--官方文档

    HDFS Architecture Introduction The Hadoop Distributed File System (HDFS) is a distributed file syste ...

  7. Android AppWidget(转)

    AppWidget不知道大家使用这个多不多,这个在手机上也叫做挂件,挂件也就是放在桌面方便用户进行使用的,从android1.6开始挂件支持一些简单的lauout和view,到了android4.0之 ...

  8. 给方法传递参数:ref参数和out参数

    /*--------------------------------------------------- 给方法传递参数:ref参数和out参数 (P106) ------------------- ...

  9. C#—委托分析

    1.简单委托示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; names ...

  10. mysql 优化点小结

    1.数据库表设计的合理性 1)三范式 一范式:原子性,属性不可分: 二范式:无部分依赖, 例:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分),存在部分依赖 (学号) → (姓名, 年龄) ...