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. SQLServer2005 常用语法大全

    SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRAN ...

  2. Bulk Insert 高效快速插入数据

    BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_nam ...

  3. nginx的upstream目前支持5种方式的分配

    Nginx   nginx的upstream目前支持5种方式的分配 FROM: 转载 1 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器, 如果后端服务器down掉, 能自动剔除. 2 w ...

  4. 第四篇:SQL

    前言 确实,关于SQL的学习资料,各类文档在网上到处都是.但它们绝大多数的出发点都局限在旧有关系数据库里,内容近乎千篇一律.而在当今大数据的浪潮下,SQL早就被赋予了新的责任和意义. 本篇中,笔者将结 ...

  5. Ubuntu设置环境变量的几种方法

    1.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.1 永久的:需要修改配置文件,变量永久生效. 1.2 临时的:使用export命令声明即可,变量在关闭shell时失效 ...

  6. linux 下各errno的意义

    strerror(errno):获取errno对应的错误 #include <string.h> /* for strerror */ #include <errno.h> # ...

  7. noip 2013 华容道

    /*双向bfs (得分和单项的一样多....)70*/ #include<iostream> #include<cstdio> #include<cstring> ...

  8. FineUI初学手册-部分JS整理

    有人老找JS,我吧FineUI自己写的JS沾过来方便大家看看,在实现前端的时候更灵活   JS 实例 注释 控件 F.ready F.ready(function(){}); 就是ready 很多方法 ...

  9. struts2学生信息管理系统篇章③

    package com.java1234.util; public class PageUtil { //传进来四个参数,tagetUtil是跳转链接的头部,totalNum是总个数,currentP ...

  10. (转)DedeCms Runphp 标签中调用其他变量的方法

    DedeCms Runphp 标签中调用其他变量的方法 我们都知道,在DedeCMS中是可以使用PHP的,常见的方法就是if else了,例如模板制作中,我们需要对来源和作者进行判断,如果为空,则提示 ...