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. bzoj3669: [Noi2014]魔法森林 lct

    记得去年模拟赛的时候好像YY出二分答案枚举a,b的暴力,过了55欸 然后看正解,为了将两维变成一维,将a排序,模拟Kruskal的加边过程,同时维护1到n的最大值,加入一条边e(u,v,a,b)时有以 ...

  2. linux下ssh免密登陆

    如果 有A.B两台主机: 要实现的效果: A主机ssh登录B主机无需输入password: 加密方式选 rsa|dsa均能够.默认rsa 做法: 1.登录A主机 2.ssh-keygen -t [rs ...

  3. 排序(5)---------高速排序(C语言实现)

    继shell发明了shell排序过后呢,各位计算机界的大牛们又開始不爽了,为什么他能发明.我就不能发明呢.于是又有个哥们蹦出来了.哎...那么多排序,就木有一个排序是中国人发明的.顺便吐槽一下,一百年 ...

  4. POJ 3978 Primes(求范围素数个数)

    POJ 3978 Primes(求范围素数个数) id=3978">http://poj.org/problem? id=3978 题意: 给你一个区间范围A和B,要你求出[A,B]内 ...

  5. php session_set_save_handler 函数的用法(mysql)(转)

    <?php /*============================文件说明======================================== @filename:     s ...

  6. Unix文件操作

    一.概述 Unix文件操作常用函数包括open.close.creat.lseek.dup.dup2.fcntl等, 其中open.creat. fcntl函数需要包含头文件<fcntl.h&g ...

  7. Gradle学习目录总结

    如果是你想干的事情,在别人看起来可能是很难的一件事,不过你自己很喜欢,你不会觉得很苦.我开始创业那会是28岁.对我来讲,我创业的目的不是为了自己当老板,我希望有一个平台有一个环境,我可以控制一些资源, ...

  8. Linux基础系列—Linux内核源码目录结构

    /** ****************************************************************************** * @author    暴走的小 ...

  9. jquery之隐藏div

    1.$("#demo").attr("style","display:none;");//隐藏div $("#demo" ...

  10. Python多进程使用

    [Python之旅]第六篇(六):Python多进程使用   香飘叶子 2016-05-10 10:57:50 浏览190 评论0 python 多进程 多进程通信 摘要:   关于进程与线程的对比, ...