Sample code for 30+ languages & platforms
PureBasic

PC/SC Get Card UID

See more SCard Examples

Sends the APDU command to get a card's UID.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkSCard.pb"
IncludeFile "CkBinData.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    scard.i = CkSCard::ckCreate()
    If scard.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; First establish a context to the PC/SC Resource Manager
    success = CkSCard::ckEstablishContext(scard,"user")
    If success = 0
        Debug CkSCard::ckLastErrorText(scard)
        CkSCard::ckDispose(scard)
        ProcedureReturn
    EndIf

    ; Use your own smart card reader name here.
    success = CkSCard::ckConnect(scard,"ACS ACR122 0","shared","no_preference")
    If success = 0
        Debug CkSCard::ckLastErrorText(scard)
        CkSCard::ckDispose(scard)
        ProcedureReturn
    EndIf

    Debug "Connected reader: " + CkSCard::ckConnectedReader(scard)
    Debug "Active protocol: " + CkSCard::ckActiveProtocol(scard)
    Debug "ATR: " + CkSCard::ckCardAtr(scard)
    Debug "Reader Status: " + CkSCard::ckReaderStatus(scard)

    ;  Send the APDU command 0xFF, 0xCA, 0x00, 0x00, 0x00
    bdRecv.i = CkBinData::ckCreate()
    If bdRecv.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkSCard::ckTransmitHex(scard,CkSCard::ckActiveProtocol(scard),"FFCA000000",bdRecv,32)
    If success = 1

        Debug "Received: " + CkBinData::ckGetEncoded(bdRecv,"hex")

        ; The UID is the returned data without the final 2 bytes.
        numBytes.i = CkBinData::ckNumBytes(bdRecv)
        If numBytes > 2
            Debug "UID: " + CkBinData::ckGetEncodedChunk(bdRecv,0,numBytes - 2,"hex")
        EndIf

    Else
        Debug CkSCard::ckLastErrorText(scard)
    EndIf

    ; Disconnect from this reader.
    success = CkSCard::ckDisconnect(scard,"leave")
    If success = 0
        Debug CkSCard::ckLastErrorText(scard)
    EndIf

    ; Applications should always release the context when finished.
    success = CkSCard::ckReleaseContext(scard)
    If success = 0
        Debug CkSCard::ckLastErrorText(scard)
    EndIf



    CkSCard::ckDispose(scard)
    CkBinData::ckDispose(bdRecv)


    ProcedureReturn
EndProcedure