Setting Baud Rate
843851Jul 21 2003 — edited Jul 23 2003This isn't specifically a JavaCard question but I think some of you are using PC/SC and might be able to help.
I have a JCOP31bio card and a Reflex USB reader. I am using PC/SC for communication. The problem is that it seems to be using 9600 baud when both devices should be capable of at least 115k. I tried to check this using SCardGetAttrib (I think I did it right) but also when transferring a file of ~2.5 kB it is taking about 4.5s (very noticeable).
Code:
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
wchar_t SmartCardGetConnect(){
LPTSTR szReaders, szRdr;
DWORD cchReaders = SCARD_AUTOALLOCATE;
DWORD dwI, dwRdrCount;
DWORD dwAP;
SCARD_READERSTATE rgscState[MAXIMUM_SMARTCARD_READERS];
// Establish a context.
lReturn = SCardEstablishContext(SCARD_SCOPE_SYSTEM,
NULL,
NULL,
&hSC );
if ( SCARD_S_SUCCESS != lReturn )
return (wchar_t)L"Failed SCardEstablishContext";
// Determine which readers are available.
lReturn = SCardListReaders(hSC,
NULL,
(LPTSTR)&szReaders,
&cchReaders );
if ( SCARD_S_SUCCESS != lReturn )
return (wchar_t)L"Failed SCardListReaders";
// Place the readers into the state array.
szRdr = szReaders;
for ( dwI = 0; dwI < MAXIMUM_SMARTCARD_READERS; dwI++ )
{
if ( 0 == *szRdr )
break;
rgscState[dwI].szReader = szRdr;
rgscState[dwI].dwCurrentState = SCARD_STATE_UNAWARE;
}
dwRdrCount = dwI;
// If any readers are available, proceed.
if ( 0 != dwRdrCount )
{
LPTSTR pmszCards = NULL;
LONG lReturn;
DWORD cch = SCARD_AUTOALLOCATE;
// Retrieve the list of cards.
lReturn = SCardListCards(NULL,
NULL,
NULL,
NULL,
(LPTSTR)&pmszCards,
&cch );
if ( SCARD_S_SUCCESS != lReturn )
return (wchar_t)L"Failed SCardListReaders";
do{
lReturn = SCardGetStatusChange(hSC,
1000,
rgscState,
dwRdrCount );
}while((rgscState[0].dwEventState & SCARD_STATE_PRESENT) != SCARD_STATE_PRESENT);
if ( SCARD_S_SUCCESS != lReturn )
return (wchar_t)L"Failed SCardGetStatusChange";
}
else
return (wchar_t)L"NO READERS AVAILABLE";
//Connect to selected reader
lReturn = SCardConnect( hSC,
(LPCTSTR)szRdr,
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
&hCardHandle,
&dwAP );
if ( lReturn != SCARD_S_SUCCESS)
return (wchar_t)L"Failed SCardConnect";
//------------------------------
/*
LPBYTE pbAttr = NULL;
DWORD cByte = SCARD_AUTOALLOCATE;
DWORD i;
char szMystr[256];
lReturn = SCardGetAttrib(hCardHandle,
SCARD_ATTR_CURRENT_F,
(LPBYTE)&pbAttr,
&cByte);
// Output the bytes.
for (i = 0; i < cByte; i++)
szMystr[i] = *(pbAttr+i);
szMystr[i] = NULL;
//sprintf(szMystr+i, "%c", *(pbAttr+i));
// Free the memory when done.
// hContext was set earlier by SCardEstablishContext
lReturn = SCardFreeMemory( hSC, pbAttr );
*/
//------------------------------
/*
lReturn = SCardReconnect(hSC,
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_UNDEFINED ,//SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
SCARD_RESET_CARD,
&dwAP);
// Set protocol
switch ( dwAP )
{
case SCARD_PROTOCOL_T0: ioProto = *SCARD_PCI_T0; break;
case SCARD_PROTOCOL_T1: ioProto = *SCARD_PCI_T1; break;
}
*/
SCardFreeMemory( hSC,
szReaders );
return (wchar_t)L"OK";
}