使用网络上流传的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;
}
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;
}
解决方案 »
- 对话框关闭时,对于循环的子线程如何关闭?
- (sdk编程)在设置EDIT只读时,如何同时实现其背景色仍旧为白色?
- 新手问题
- 杭州的c++程序员请进
- InstallShield6.22中我找来找去找不到那个相当于main的程序段program...endprogram
- 在VC中如何实现随机数????????????????????????
- 如何编程调用api安装标准硬件,如标准声卡、标准modem
- 线程的内存分配问题
- 用realplayer的Activex控件做rm播放器,如何实现全屏播放?
- 关于进程优先级的设置
- 如何删除掉网页里某个element?
- 串口调试助手(精装版3.6)收发大量数据时是怎样处理的?
谢谢jennyvenus半天来的解惑!