Sample code for 30+ languages & platforms
Tcl

PC/SC Get Card UID

See more SCard Examples

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

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

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

set scard [new_CkSCard]

# First establish a context to the PC/SC Resource Manager
set success [CkSCard_EstablishContext $scard "user"]
if {$success == 0} then {
    puts [CkSCard_lastErrorText $scard]
    delete_CkSCard $scard
    exit
}

# Use your own smart card reader name here.
set success [CkSCard_Connect $scard "ACS ACR122 0" "shared" "no_preference"]
if {$success == 0} then {
    puts [CkSCard_lastErrorText $scard]
    delete_CkSCard $scard
    exit
}

puts "Connected reader: [CkSCard_connectedReader $scard]"
puts "Active protocol: [CkSCard_activeProtocol $scard]"
puts "ATR: [CkSCard_cardAtr $scard]"
puts "Reader Status: [CkSCard_readerStatus $scard]"

#  Send the APDU command 0xFF, 0xCA, 0x00, 0x00, 0x00
set bdRecv [new_CkBinData]

set success [CkSCard_TransmitHex $scard [CkSCard_activeProtocol $scard] "FFCA000000" $bdRecv 32]
if {$success == 1} then {

    puts "Received: [CkBinData_getEncoded $bdRecv hex]"

    # The UID is the returned data without the final 2 bytes.
    set numBytes [CkBinData_get_NumBytes $bdRecv]
    if {$numBytes > 2} then {
        puts "UID: [CkBinData_getEncodedChunk $bdRecv 0 [expr $numBytes - 2] hex]"
    }

} else {
    puts [CkSCard_lastErrorText $scard]
}

# Disconnect from this reader.
set success [CkSCard_Disconnect $scard "leave"]
if {$success == 0} then {
    puts [CkSCard_lastErrorText $scard]
}

# Applications should always release the context when finished.
set success [CkSCard_ReleaseContext $scard]
if {$success == 0} then {
    puts [CkSCard_lastErrorText $scard]
}


delete_CkSCard $scard
delete_CkBinData $bdRecv