使用网络上流传的uim卡读写软件(cdma uim card personalize),通过串口抓包分析其读写卡时的数据。。前面的几行数据是:1 [00000000]  IRP_MJ_CREATE       Port Opened - s
2 [00000003]  IOCTL_SERIAL_SET_BAUD_RATE      Baud Rate: 38400
3 [00000004]  IOCTL_SERIAL_SET_LINE_CONTROL   StopBits: 1, Parity: No, DataBits: 8
4 [00000008]  IOCTL_SERIAL_SET_BAUD_RATE      Baud Rate: 9600
5 [00000008]  IOCTL_SERIAL_SET_LINE_CONTROL   StopBits: 2, Parity: Even, DataBits: 8
6 [00000008]  IOCTL_SERIAL_SET_BAUD_RATE      Baud Rate: 9600
7 [00000009]  IOCTL_SERIAL_SET_LINE_CONTROL   StopBits: 2, Parity: Even, DataBits: 8
8 [00000029]  IRP_MJ_READ   Length: 0011, Data: 3B 97 11 00 02 02 04 22 00 3F 03 
9 [00000049]  IRP_MJ_READ   Length: 0011, Data: 3B 97 11 00 02 02 04 22 00 3F 03 
10[00000049]  IRP_MJ_WRITE  Length: 0005, Data: A0 A4 00 00 02
11[00000055]  IRP_MJ_READ   Length: 0006, Data: A0 A4 00 00 02 A4 
12[00000055]  IRP_MJ_WRITE  Length: 0002, Data: 3F 00 
13[00000062]  IRP_MJ_READ   Length: 0004, Data: 3F 00 9F 17 其中,第8,第9两行,从数据上看,应该是 复位时的应答(ATR),可是怎么会有两个呢?
再有,我自己通过win32 api 和 CSerialPort 都没办法读到这两行数据。。有谁能解惑解惑???当然了,接下来的数据读写也不正确。各位高见,还请多多指教其中,CSerialPort代码如下:BOOL CSerialPortRW::Read(){
BYTE* pBuf = new BYTE[2048];
memset(pBuf,0,2048); CSerialPort sPort;

if(sPort.IsOpen())
sPort.Close();

try{
sPort.Open(m_nPort,
9600,
CSerialPort::EvenParity,
8,
CSerialPort::TwoStopBits,
CSerialPort::NoFlowControl,
TRUE); sPort.Setup(1024,1024);

//设置按二进制读取???
DCB dcb;
sPort.GetState(dcb);
dcb.fBinary=1;

sPort.SetState(dcb); CEvent cEvent(FALSE, TRUE);
OVERLAPPED overlapped;
memset(&overlapped, 0, sizeof(overlapped));
overlapped.hEvent = cEvent; try
{
sPort.Read(pBuf, 36, overlapped);  //想要在这读取ATR,返回空值。。什么都没有
sPort.Read(pBuf,36,overlapped);
}
catch(CSerialException* pEx)
{
if (pEx->m_dwError == ERROR_IO_PENDING)
{
DWORD dwBytesTransferred = 0;
sPort.GetOverlappedResult(overlapped, dwBytesTransferred, TRUE);
pEx->Delete();
}
else
{
DWORD dwError = pEx->m_dwError;
pEx->Delete();
CSerialPort::ThrowSerialException(dwError);
}
}
}catch(CSerialException* pEx){
// TODO:设置出错信息1024
char error[1024]; pEx->GetErrorMessage(error,1024);
pEx->Delete(); sPort.Close();
return -1;
}

sPort.Close(); delete[] pBuf;
return 1;
}

解决方案 »

  1.   

    复位信息只有在reset之后才能发出来。指令读不到。
      

  2.   

    呵呵,是这样,我是读不到复位后的应答信息,用别人的读写卡软件,可以返回有“3B 97 11 00 02 02 04 22 00 3F 03”的信息。可我按这样的步骤:打开串口->读取;这样读不到复位的应答。这让我很迷惑,不知道能不能这样读。劳驾你了!
      

  3.   

    不说专业的术语,简单来说,读卡器有标准的和非标准的,标准的叫pcsc读卡器,与主机通讯采用usb接口,有详细的规范。非标准的一般都是国内小厂生产,或满足特殊需求的,与主机通讯以前大多数采用串口,现在也逐步换成了usb口。读卡器一般需要主机发送指令才能触发某动作,比如apdu指令,由主机发起,然后读卡器接收到指令后,发给卡,读卡器收到返回数据,再发给主机。比较特殊的事件就是复位,复位可以由主机发起,也可以由读卡器发起,大部分读卡器都会检测卡的插入事件,并自动执行复位时序动作。标准的pcsc读卡器,复位可以由两个动作来完成,非标准的读卡器,复位由厂商自己制定,比如某厂商发送FEFEFEFEFE就指示读卡器复位,发完之后读数据,就能收到复位信息。
      

  4.   

    这么强悍啊。。
    谢谢jennyvenus半天来的解惑!