testMscommDlg.cpp
上传用户:zjgyljx
上传日期:2022-08-04
资源大小:45k
文件大小:18k
- // testMscommDlg.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "testMscomm.h"
- #include "testMscommDlg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #endif
- // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
- static char STX[1]={0x02},ETX[1]={0x03},DLE[1]={0x10},NAK[1]={0x15};
- class CAboutDlg : public CDialog
- {
- public:
- CAboutDlg();
- // 对话框数据
- enum { IDD = IDD_ABOUTBOX };
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
- // 实现
- protected:
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
- {
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
- END_MESSAGE_MAP()
- // CtestMscommDlg 对话框
- CtestMscommDlg::CtestMscommDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CtestMscommDlg::IDD, pParent)
- , CStrCmd(_T(""))
- , CStrReceive(_T(""))
- {
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- }
- void CtestMscommDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- DDX_Text(pDX, IDC_EDIT_CMD, CStrCmd);
- DDX_Text(pDX, IDC_EDIT_RECEIVE, CStrReceive);
- }
- BEGIN_MESSAGE_MAP(CtestMscommDlg, CDialog)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- //}}AFX_MSG_MAP
- ON_BN_CLICKED(IDC_BUTTON_OPENCOMM, &CtestMscommDlg::OnBnClickedButtonOpencomm)
- ON_BN_CLICKED(IDC_BUTTON_CLOSECOMM, &CtestMscommDlg::OnBnClickedButtonClosecomm)
- ON_BN_CLICKED(IDC_BUTTON_SENDDATA, &CtestMscommDlg::OnBnClickedButtonSenddata)
- ON_BN_CLICKED(IDC_BUTTON_SETUP, &CtestMscommDlg::OnBnClickedButtonSetup)
- ON_BN_CLICKED(IDC_BUTTON_READDATA, &CtestMscommDlg::OnBnClickedButtonReaddata)
- ON_WM_TIMER()
- ON_BN_CLICKED(IDC_BUTTON_RESET, &CtestMscommDlg::OnBnClickedButtonReset)
- ON_BN_CLICKED(IDC_BUTTON_AUTHEN, &CtestMscommDlg::OnBnClickedButtonAuthen)
- END_MESSAGE_MAP()
- // CtestMscommDlg 消息处理程序
- BOOL CtestMscommDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // 将“关于...”菜单项添加到系统菜单中。
- // IDM_ABOUTBOX 必须在系统命令范围内。
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
- // TODO: 在此添加额外的初始化代码
-
- //设置按钮的正确状态
- GetDlgItem(IDC_BUTTON_OPENCOMM)->EnableWindow(TRUE);
- GetDlgItem(IDC_BUTTON_CLOSECOMM)->EnableWindow(FALSE);
- GetDlgItem(IDC_BUTTON_SENDDATA)->EnableWindow(FALSE);
- GetDlgItem(IDC_BUTTON_SETUP)->EnableWindow(FALSE);
- GetDlgItem(IDC_BUTTON_READDATA)->EnableWindow(FALSE);
-
- isStartTimer=false;
- cSeqNr=0;
- Attempt=0;
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
- }
- void CtestMscommDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- // 如果向对话框添加最小化按钮,则需要下面的代码
- // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
- // 这将由框架自动完成。
- void CtestMscommDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // 用于绘制的设备上下文
- SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
- // 使图标在工作矩形中居中
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // 绘制图标
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
- //当用户拖动最小化窗口时系统调用此函数取得光标显示。
- //
- HCURSOR CtestMscommDlg::OnQueryDragIcon()
- {
- return static_cast<HCURSOR>(m_hIcon);
- }
- void CtestMscommDlg::OnBnClickedButtonOpencomm()
- {
- // TODO: 在此添加控件通知处理程序代码
- comm = L"COM3";
- /*hCom = CreateFile(comm, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
- if (hCom == INVALID_HANDLE_VALUE)
- {
- AfxMessageBox(L"打开COM3失败",0,0);
- dwError = GetLastError();
- return;
- }*/
- BOOL fSuccess;
- hCom=CreateFile(comm, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
- if (hCom == INVALID_HANDLE_VALUE)
- {
- AfxMessageBox(L"打开COM3失败",0,0);
- dwError = GetLastError();
- return;
- }
- if(GetFileType(hCom)!=FILE_TYPE_CHAR)
- {
- CloseHandle(hCom);
- return;
- }
- //// 获取串口当前配置
- if (GetCommState(hCom,&config_) == 0)
- {
- AfxMessageBox(L"没有正确的得到配置信息",0,0);
- return;
- }
- config_.BaudRate=57600;
- config_.ByteSize=8;
- config_.Parity=NOPARITY;
- config_.StopBits=ONESTOPBIT;
- config_.fNull=0;
- SetCommState(hCom, &config_);
- SetupComm( hCom, 4096, 4096 ) ;
-
- COMMTIMEOUTS CommTimeOuts;
- CommTimeOuts.ReadIntervalTimeout = 0;
- CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
- CommTimeOuts.ReadTotalTimeoutConstant = 3000;
- // CBR_9600 is approximately 1byte/ms. For our purposes, allow
- // double the expected time per character for a fudge factor.
- CommTimeOuts.WriteTotalTimeoutMultiplier = 30;//2*CBR_9600/BaudRate;
- CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
- SetCommTimeouts( hCom, &CommTimeOuts ) ;
- //设置按钮状态
- GetDlgItem(IDC_BUTTON_OPENCOMM)->EnableWindow(FALSE);
- GetDlgItem(IDC_BUTTON_CLOSECOMM)->EnableWindow(TRUE);
- GetDlgItem(IDC_BUTTON_SENDDATA)->EnableWindow(TRUE);
- GetDlgItem(IDC_BUTTON_SETUP)->EnableWindow(TRUE);
- GetDlgItem(IDC_BUTTON_READDATA)->EnableWindow(TRUE);
- }
- void CtestMscommDlg::OnBnClickedButtonClosecomm()
- {
- // TODO: 在此添加控件通知处理程序代码
- //可以调用CloseHandle API函数关闭串口
- if (hCom == INVALID_HANDLE_VALUE)
- {
- return;
- }
- if(CloseHandle(hCom) == 0) // 调用该函数关闭串口
- {
- AfxMessageBox(L"关闭串口过程中出现问题.",0,0);
- return;
- }
- //设置按钮状态
- GetDlgItem(IDC_BUTTON_OPENCOMM)->EnableWindow(TRUE);
- GetDlgItem(IDC_BUTTON_CLOSECOMM)->EnableWindow(FALSE);
- GetDlgItem(IDC_BUTTON_SENDDATA)->EnableWindow(FALSE);
- GetDlgItem(IDC_BUTTON_SETUP)->EnableWindow(FALSE);
- GetDlgItem(IDC_BUTTON_READDATA)->EnableWindow(FALSE);
- KillTimer(TIMER_READ_DATA);
- }
- void CtestMscommDlg::OnBnClickedButtonSetup()
- {
- Set_port(hCom,1);
- Sleep(100);
- Set_port(hCom,0);
-
- //// TODO: 在此添加控件通知处理程序代码
- //if (hCom == INVALID_HANDLE_VALUE)
- //{
- // return;
- //}
- ////// 获取串口当前配置
- //if (GetCommState(hCom,&config_) == 0)
- //{
- // AfxMessageBox(L"没有正确的得到配置信息",0,0);
- //}
- ////当你已经在DCB结构中获取串口配置,你应该修改其中的参数,如下代码所示:
- //// 指定用户参数
- //config_.BaudRate = 9600; // 波特率
- //config_.StopBits = 0; // 停止位
- //config_.Parity = 0; // 奇偶校验
- //config_.ByteSize = 8; // 数据位
- ///*
- //DWORD BaudRate :
- //波特率 (默认 = 9600)
- //BYTE StopBits :
- //0,1,2 = 1, 1.5, 2 (默认 = 0)
- //BYTE Parity :
- //0-4= 无, 奇, 偶, 标志, 空格 (默认 = 0)
- //BYTE ByteSize :
- //数据位, 4-8 (默认 = 8)
- //*/
- ////调用SetCommState API函数保存配置。SetCommState函数设备控制块(DCB结构)配置通讯设备。该函数重新初始化所有的硬件控制设定,但不清空输入输出队列。代码如下所示:
- //if (SetCommState(hCom,&config_) == 0)
- // AfxMessageBox(L"设置串口出现问题!",0,0);
- }
- void CtestMscommDlg::OnBnClickedButtonReaddata()
- {
- // TODO: 在此添加控件通知处理程序代码
- if (isStartTimer==false)
- SetTimer(TIMER_READ_DATA,300,NULL);
- else
- KillTimer(TIMER_READ_DATA);
- isStartTimer=!isStartTimer;
- }
- void CtestMscommDlg::OnBnClickedButtonSenddata()
- {
- // TODO: 在此添加控件通知处理程序代码
- //获得输入框中的输入,发送该输入到串口
- //要获得数据,一种方式先强制更新数据
- UpdateData(TRUE);
- //AfxMessageBox(CStrCmd,0,0);
- //再一种方式,通过得到文本的方法
- /*CString str;
- GetDlgItemText(IDC_EDIT_CMD,str);
- MessageBox(str);*/
- unsigned long len;
- if (WriteFile(hCom, // 文件句柄
- CStrCmd, // 数据缓冲区指针
- sizeof(CStrCmd), // 字节数
- &len,NULL) == 0) // 接收成功发送数据长度的指针
- {
- AfxMessageBox(L"发送数据出错.",0,0);
- return;
- }
- }
- void CtestMscommDlg::OnTimer(UINT_PTR nIDEvent)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- switch (nIDEvent)
- {
- case TIMER_READ_DATA:
- {
- //读串口
- char inputData[1024];
- unsigned long len;
-
- if (ReadFile(hCom, // 句柄
- inputData, // 数据缓冲区指针
- sizeof(inputData), // 字节数
- &len, // 指向已经读入的字节数
- NULL) == 0) // 重叠I/O结构体
- {
- //AfxMessageBox(L"读串口消息出错",0,0);
- return;
- }
- if (len > 0)
- {
- CStrReceive=(CString)inputData;
- UpdateData(FALSE);
- inputData[len] = NULL; // Assign end flag of message.
- return;
- }
- }
- break;
- default:
- break;
- }
- }
- BYTE CtestMscommDlg::SndCmd(HANDLE hCom)
- {
-
- BYTE i,State=RECV_DLE,cTempBuffer[10];
- BOOL fSuccess,fEnd=FALSE;
- DWORD dwBytesRead,dwBytesWritten;
- SetupComm( hCom, 4096, 4096 ) ;
- PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT |
- PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
- fSuccess=WriteFile( hCom, (LPSTR)&STX, 1, &dwBytesWritten, NULL);
- if(!fSuccess) return MIS_WRITECOMM;
- Attempt=3;
- while(1)
- {
- fSuccess = ReadFile( hCom, (LPSTR)&cTempBuffer,1, &dwBytesRead, NULL) ;
- if(!fSuccess)return MIS_READCOMM;
- if(dwBytesRead==0)
- {
- if(--Attempt>0)
- {
- fSuccess=WriteFile( hCom, (LPSTR)&STX, 1, &dwBytesWritten, NULL);
- if(!fSuccess) return MIS_WRITECOMM;
- }else
- return MIS_TIMEOUT;
- }
- switch(State)
- {
- case RECV_DLE:
- if(cTempBuffer[0]==DLE[0])
- {
- State=RECV_DLE_NAK;
- fSuccess=WriteFile( hCom, cBuffer, dwLen, &dwBytesWritten, NULL);
- if(!fSuccess) return MIS_WRITECOMM;
- }else if(--Attempt>0)
- {
- fSuccess=WriteFile( hCom, (LPSTR)&STX, 1, &dwBytesWritten, NULL);
- if(!fSuccess) return MIS_WRITECOMM;
- }else{
- return MIS_SERERR;
- }
- break;
- case RECV_DLE_NAK:
- if(cTempBuffer[0]==DLE[0])
- {
- return MIS_OK;
- }else if(--Attempt>0)
- {
- State=RECV_DLE;
- fSuccess=WriteFile( hCom, (LPSTR)&STX, 1, &dwBytesWritten, NULL);
- if(!fSuccess) return MIS_WRITECOMM;
- }else{
- return MIS_SERERR;
- }
- break;
- } //end switch
- } //end while 1
- }
- BYTE CtestMscommDlg::RcvDat(HANDLE hCom)
- {
- BYTE MIFS_Err,i,j,State=RECV_STX,cTempBuffer[10];
- WORD MIFS_Check;
- BOOL fSuccess,fEnd=FALSE;
- DWORD RPtr,dwBytesRead,dwBytesWritten;
- while(1)
- {
- fSuccess = ReadFile( hCom, (LPSTR)&cTempBuffer,1, &dwBytesRead, NULL) ;
- if(!fSuccess)return MIS_READCOMM;
- if(dwBytesRead==0) return MIS_TIMEOUT;
- switch(State)
- {
- case RECV_STX:
- if(cTempBuffer[0]==STX[0])
- {
- State=RECV_DATA;
- RPtr=0;
- fSuccess=WriteFile( hCom, (LPSTR)&DLE, 1, &dwBytesWritten, NULL);
- if(!fSuccess) return MIS_WRITECOMM;
- }
- else
- {
- fSuccess=WriteFile( hCom, (LPSTR)&NAK, 1, &dwBytesWritten, NULL);
- if(!fSuccess) return MIS_WRITECOMM;
- }
- break;
- case RECV_DATA:
- if(cTempBuffer[0]==DLE[0])
- {
- State=RECV_DATA_DLE;
- }
- else{
- if(RPtr<HEADER+MAXDATA+1+ChkBytes)
- {
- cBuffer[RPtr++]=cTempBuffer[0];
- }else{
- return MIS_RS232ERR;
- }
- }
- break;
- case RECV_DATA_DLE:
- if(cTempBuffer[0]==DLE[0])
- {
- State=RECV_DATA;
- if(RPtr<HEADER+MAXDATA+1+ChkBytes)
- {
- cBuffer[RPtr++]=DLE[0];
- }
- else
- {
- return MIS_RS232ERR;
- }
- }else if(cTempBuffer[0]==ETX[0])
- {
- if(RPtr<(HEADER+ChkBytes)||RPtr>(HEADER+MAXDATA+ChkBytes) )
- {
- MIFS_Err=MIS_BYTESERR;
- }
- else if((cBuffer[2]+HEADER+ChkBytes)!=RPtr)
- {
- MIFS_Err=MIS_BYTESERR;
- }
- else
- {
- if(ChkBytes==BCC_CHKBYTES)
- {
- MIFS_Check=0;
- for(i=0;i<RPtr;i++)
- {
- MIFS_Check^=(WORD)cBuffer[i];
- }
- }else{
- MIFS_Check=CRC_PRESET;
- for(i=0;i<RPtr;i++)
- {
- MIFS_Check^=(WORD)cBuffer[i]<<8;
- for(j=0;j<8;j++)
- {
- if(MIFS_Check&0x8000)
- {
- MIFS_Check=(MIFS_Check<<1)^CRC_POLYNOM;
- }else{
- MIFS_Check=(MIFS_Check<<1);
- }
- }
- }
- }
- if(MIFS_Check!=0)
- {
- MIFS_Err=MIS_CHECKERR;
- }
- else
- {
- fSuccess=WriteFile( hCom, (LPSTR)&DLE, 1, &dwBytesWritten, NULL);
- if(!fSuccess) return MIS_WRITECOMM;
- return MIS_OK;
- }
- }
- State=RECV_STX;
- fSuccess=WriteFile( hCom, (LPSTR)&NAK, 1, &dwBytesWritten, NULL);
- if(!fSuccess) return MIS_WRITECOMM;
- }
- break;
- } //end switch(State)
- } //end while
- }
- BYTE CtestMscommDlg::Set_port(HANDLE hCom,BYTE port)
- {
- BYTE RetVal;
- cBuffer[0]=++cSeqNr;
- cBuffer[1]=0x5f;
- cBuffer[2]=1;
- cBuffer[3]=~port;
-
- CalcChkBytes();
- RetVal=SndCmd(hCom);
- if(!RetVal)
- {
- RetVal=RcvDat(hCom);
- if(!RetVal)
- {
- RetVal=cBuffer[1];
- }
- }
- return RetVal;
- }
- void CtestMscommDlg::CalcChkBytes()
- {
- DWORD i,j;
- BYTE bcc;
- WORD crc;
- dwLen=HEADER+cBuffer[2];
- if(ChkBytes==BCC_CHKBYTES)
- {
- bcc=0;
- for(i=0;i<dwLen;i++)
- {
- bcc^=cBuffer[i];
- }
- cBuffer[dwLen]=bcc;
- }
- else //CRC16
- {
- crc=CRC_PRESET;
- for(i=0;i<dwLen;i++)
- {
- crc^=(WORD)cBuffer[i]<<8;
- for(j=0;j<8;j++)
- {
- if(crc&0x8000)
- {
- crc=(crc<<1)^CRC_POLYNOM;
- }
- else
- {
- crc=(crc<<1);
- }
- }
- }
- cBuffer[dwLen] =(BYTE)(crc>>8);
- cBuffer[dwLen+1]=(BYTE)crc;
- }
- dwLen+=ChkBytes;
- for(i=0;i<dwLen;i++)
- {
- if(cBuffer[i]==DLE[0])
- {
- for(j=dwLen;j>i;j--)
- {
- cBuffer[j]=cBuffer[j-1];
- }
- dwLen++;i++;
- }
- }
- cBuffer[dwLen++]=DLE[0];
- cBuffer[dwLen++]=ETX[0];
- }
- void CtestMscommDlg::OnBnClickedButtonReset()
- {
- // TODO: 在此添加控件通知处理程序代码
- char RetValue, len;
- BYTE ResCode[64],size,BCC;
- CString Str,S,S1;
- TypeSelect(hCom,0);
- RetValue=MIFwakeup(hCom,ICC_TCL,(unsigned char *)&len,(unsigned char *)ResCode);
- if(len>0)
- Str= CString((char*)ResCode,len);
- else{
- CStrReceive.Append(L"非接触IC卡复位说明:未寻到卡片nr");
- return;
- }
- if( RetValue!=0)
- CStrReceive.Append(L"复位错误nr");
- //CStrReceive+=S1+"复位错误";
- else{
- len=Str.GetLength();
- //InfoMemo->Lines->Add(S1+"复位数据: "+Str);
- if(Str.Mid(1,3)=="3B6")
- CStrReceive.Append(L"3B6nr");
- //CStrReceive.Append(S1+"复位说明: T=0协议 正向约定 TB1和TC1存在"+" 历史字符="+Str.SubString(9,len-8));
- else if(Str.Mid(1,3)=="3B7")
- CStrReceive.Append(L"3B7nr");
- //CStrReceive.Append(S1+"复位说明: T=0协议 正向约定 TA1、TB1和TC1存在"+" 历史字符="+Str.SubString(11,len-10));
- else if(Str.Mid(1,1)=="0"){
- CStrReceive.Append(L"复位说明: 卡片类型=0x");
- CStrReceive.Append(Str);
- /*CStrReceive.Append(L"复位说明: 卡片类型=0x");
- CStrReceive.Append(Str.Mid(1,4));
- CStrReceive.Append(L" UID=0x");
- CStrReceive.Append(Str.Mid(11,2));
- CStrReceive.Append(Str.Mid(9,2));
- CStrReceive.Append(Str.Mid(7,2));
- CStrReceive.Append(Str.Mid(5,2));
- CStrReceive.Append(L" SIZE=0x");
- CStrReceive.Append(Str.Mid(15,2));
- CStrReceive.Append(L" ATS=");
- CStrReceive.Append(Str.Mid(17,len-16));
- CStrReceive.Append(L"nr");*/
- //CStrReceive=S1+"复位说明: 卡片类型=0x"+Str.Mid(1,4)+" UID=0x"+Str.Mid(11,2)+Str.Mid(9,2)+Str.Mid(7,2)+Str.Mid(5,2)+" SIZE=0x"+Str.Mid(15,2)+" ATS="+Str.Mid(17,len-16);
- //CStrReceive.Append(S1+"复位说明: 卡片类型=0x"+Str.SubString(1,4)+" UID=0x"+Str.SubString(11,2)+Str.SubString(9,2)+Str.SubString(7,2)+Str.SubString(5,2)+" SIZE=0x"+Str.SubString(15,2)+" ATS="+Str.SubString(17,len-16));
- }
- }
- UpdateData(FALSE);
- }
- BYTE CtestMscommDlg::TypeSelect(HANDLE hCom,BYTE TypeSelect)
- {
- BYTE RetVal=0,i;
- cBuffer[0]=++cSeqNr;
- cBuffer[1]=0x80;
- cBuffer[2]=1;
- cBuffer[3]=TypeSelect;
- CalcChkBytes();
- RetVal=SndCmd(hCom);
- if(!RetVal)
- {
- RetVal=RcvDat(hCom);
- if(!RetVal)
- {
- if((RetVal=cBuffer[1])!=0) return 1;
- }
- }
- return 0;
- }
- unsigned int CtestMscommDlg::MIFwakeup(HANDLE hCom,BYTE fICC,unsigned char *lenr,unsigned char *resp) //0x70
- {
- DWORD dwBytesRead;
- BYTE RetVal;
- int i;
- cBuffer[0]=++cSeqNr;
- cBuffer[1]=0x71;
- cBuffer[2]=1;
- cBuffer[3]=fICC;
- CalcChkBytes();
- RetVal=SndCmd(hCom);
- if(!RetVal)
- {
- RetVal=RcvDat(hCom);
- if(!RetVal)
- {
- RetVal=cBuffer[1];
- *lenr=cBuffer[2];
- for(i=0;i<*lenr;i++)
- resp[i]=cBuffer[i+3];
- for(i=*lenr-1;i>=0;i--)
- BinToHex(resp[i], (char *)(resp+2*i));
- resp[*lenr*2]='';
- *lenr=*lenr*2;
- }
- }
- return RetVal;
- }
- void CtestMscommDlg::BinToHex(BYTE dt,char *ch)
- {
- BYTE tmp;
- tmp=dt>>4;
- if(tmp<=9) ch[0]=tmp+0x30;
- else ch[0]=tmp+0x37;
- tmp=dt&0x0f;
- if(tmp<=9) ch[1]=tmp+0x30;
- else ch[1]=tmp+0x37;
- }
- BYTE CtestMscommDlg::HexToBin(char *_ch)
- {
- BYTE _dt[2];
- BYTE i;
- for(i=0;i<2;i++)
- {
- if((_ch[i]>='0')&(_ch[i]<='9'))
- _dt[i]=_ch[i]-0x30;
- else if((_ch[i]>='A')&&(_ch[i]<='F'))
- _dt[i]=_ch[i]-0x37;
- else if((_ch[i]>='a')&&(_ch[i]<='f'))
- _dt[i]=_ch[i]-0x57;
- else _dt[i]=5;
- }
- return ((_dt[0]<<4)+(_dt[1]&0x0f));
- }
- void CtestMscommDlg::OnBnClickedButtonAuthen()
- {
- // TODO: 在此添加控件通知处理程序代码
- //BYTE src[8],dest[8],key[16];
- //int i,count;
- //WORD sw;
- //char ResCode[200];
- //char *S,*S1;
- //S1="0084000008";
- //sw=MainForm->CPUCardCmd1(S1,ResCode);
- //S1=AuthenKeyCbx->Text;
- //count=AuthenKeyCbx->Text.Length()/2;
- //if(count!=16&&count!=8)
- //{
- // ShowMessage("密钥数据长度错误!");
- // return;
- //}
- //AutoDESencrypt(S1.c_str(),MainForm->RngStr.c_str(),ResCode);
- //S=AnsiString(ResCode,16);
- //MainForm->InfoMemo->Lines->Add("");
- //MainForm->InfoMemo->Lines->Add("使用密钥: "+S1+" 加密随机数");
- //MainForm->InfoMemo->Lines->Add("随机数加密结果: "+S);
- //S1="008200"+KeyTagEdit->Text+"08"+S;
- //sw=MainForm->CPUCardCmd1(S1,ResCode);
- //if(sw==0x9000) Close();
- }
- //
- //WORD CtestMscommDlg::CPUCardCmd1(char * Str,char * ResCode)
- //{
- //
- //}