C++ SCardTransmit,如何读写智能卡

C++ SCardTransmit,如何读写智能卡,c++,smartcard,rfid,smartcard-reader,contactless-smartcard,C++,Smartcard,Rfid,Smartcard Reader,Contactless Smartcard,我在一台打印机上工作,试图读写一张非接触式卡片 这是我正在使用的硬件和软件的手册: 如果我理解正确,使用智能卡(读写)的过程是: 使用scardesttablishContext()建立上下文 使用SCardConnect()通过所选读卡器连接到卡 使用SCardTransmit()与卡交谈 对吗 第1点和第2点工作正常,返回0(SCARD_S_SUCCESS),但SCardTransmit有问题 例如,如果我想阅读第5块,我使用以下代码: SCARD_IO_REQUEST pioRecv

我在一台打印机上工作,试图读写一张非接触式卡片

这是我正在使用的硬件和软件的手册:

如果我理解正确,使用智能卡(读写)的过程是:

  • 使用scardesttablishContext()建立上下文
  • 使用SCardConnect()通过所选读卡器连接到卡
  • 使用SCardTransmit()与卡交谈
  • 对吗

    第1点和第2点工作正常,返回0(SCARD_S_SUCCESS),但SCardTransmit有问题

    • 例如,如果我想阅读第5块,我使用以下代码:

       SCARD_IO_REQUEST pioRecvPci;
      
       DWORD dwActiveProtocol, dwSendLength, dwRecvLength;
       BYTE pbRecvBuffer[16];
       BYTE pbSendBuffer[] = {(BYTE)0xFC, (BYTE)0xB0,(BYTE)0x05, (BYTE)0x00, (BYTE)0x00};
      
       dwSendLength = sizeof(pbSendBuffer);
       dwRecvLength = sizeof(pbRecvBuffer);
      
        SCARD_IO_REQUEST pioSendPci;
      
           pioSendPci.dwProtocol=SCARD_PROTOCOL_T0;
           pioSendPci.cbPciLength= sizeof(pioSendPci);
      
       ret = SCardTransmit(cardHandle,                // SCard API
                              &pioSendPci, 
                              pbSendBuffer, dwSendLength,
                NULL, pbRecvBuffer, &dwRecvLength);
      
      它返回一个错误代码22

      如果我将SCARD_PROTOCOL_T0更改为SCARD_PROTOCOL_T1,它似乎可以工作(我不知道pbRecvBuffer值是否正确):pbRecvBuffer有2个字节,值为:6e 00,ret=0

      这些价值观有意义吗

      我阅读了scardtransmitapi(),在那里我理解我必须使用协议T=0,这是否意味着我必须让SCARD_协议T0工作?在这种情况下,我为什么会收到错误22?我做错了什么

    • 如果我想在block 5中写作,我遵循相同的过程:SCardEstablishContext、SCardConnect和SCardTransmit。我将pbSendBuffer更改为:{(字节)0xFC,(字节)0xD0,(字节)0x05,(字节)0x00,0x10};,但我不太明白数据在哪里,我应该在SCardTransmit上设置什么参数。你能给我举个例子吗


    多谢各位

    你用什么类型的卡?
    `enter code here` we  must  check protocol using switch case and transmit like :
    
    
    switch ( m_dwAP )
        {
        case SCARD_PROTOCOL_T0:
            dwErrorFlags = SCardTransmit(this->m_hCardHandle,
                            SCARD_PCI_T0,
                            rgbIN,
                            bIN,
                            NULL,
                            rgbOUTTra,
                            &uwBufferLen);
            break;
        case SCARD_PROTOCOL_T1:
            dwErrorFlags = SCardTransmit(this->m_hCardHandle,
                            SCARD_PCI_T1,
                            rgbIN,
                            bIN,
                            NULL,
                            rgbOUTTra,
                            &uwBufferLen);
            break;
    }
    here m_dwAP  is active protocol.