testMscommDlg.cpp
上传用户:zjgyljx
上传日期:2022-08-04
资源大小:45k
文件大小:18k
源码类别:

通讯编程

开发平台:

Visual C++

  1. // testMscommDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "testMscomm.h"
  5. #include "testMscommDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #endif
  9. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  10. static    char STX[1]={0x02},ETX[1]={0x03},DLE[1]={0x10},NAK[1]={0x15};
  11. class CAboutDlg : public CDialog
  12. {
  13. public:
  14. CAboutDlg();
  15. // 对话框数据
  16. enum { IDD = IDD_ABOUTBOX };
  17. protected:
  18. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
  19. // 实现
  20. protected:
  21. DECLARE_MESSAGE_MAP()
  22. };
  23. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  24. {
  25. }
  26. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  27. {
  28. CDialog::DoDataExchange(pDX);
  29. }
  30. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  31. END_MESSAGE_MAP()
  32. // CtestMscommDlg 对话框
  33. CtestMscommDlg::CtestMscommDlg(CWnd* pParent /*=NULL*/)
  34. : CDialog(CtestMscommDlg::IDD, pParent)
  35. , CStrCmd(_T(""))
  36. , CStrReceive(_T(""))
  37. {
  38. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  39. }
  40. void CtestMscommDlg::DoDataExchange(CDataExchange* pDX)
  41. {
  42. CDialog::DoDataExchange(pDX);
  43. DDX_Text(pDX, IDC_EDIT_CMD, CStrCmd);
  44. DDX_Text(pDX, IDC_EDIT_RECEIVE, CStrReceive);
  45. }
  46. BEGIN_MESSAGE_MAP(CtestMscommDlg, CDialog)
  47. ON_WM_SYSCOMMAND()
  48. ON_WM_PAINT()
  49. ON_WM_QUERYDRAGICON()
  50. //}}AFX_MSG_MAP
  51. ON_BN_CLICKED(IDC_BUTTON_OPENCOMM, &CtestMscommDlg::OnBnClickedButtonOpencomm)
  52. ON_BN_CLICKED(IDC_BUTTON_CLOSECOMM, &CtestMscommDlg::OnBnClickedButtonClosecomm)
  53. ON_BN_CLICKED(IDC_BUTTON_SENDDATA, &CtestMscommDlg::OnBnClickedButtonSenddata)
  54. ON_BN_CLICKED(IDC_BUTTON_SETUP, &CtestMscommDlg::OnBnClickedButtonSetup)
  55. ON_BN_CLICKED(IDC_BUTTON_READDATA, &CtestMscommDlg::OnBnClickedButtonReaddata)
  56. ON_WM_TIMER()
  57. ON_BN_CLICKED(IDC_BUTTON_RESET, &CtestMscommDlg::OnBnClickedButtonReset)
  58. ON_BN_CLICKED(IDC_BUTTON_AUTHEN, &CtestMscommDlg::OnBnClickedButtonAuthen)
  59. END_MESSAGE_MAP()
  60. // CtestMscommDlg 消息处理程序
  61. BOOL CtestMscommDlg::OnInitDialog()
  62. {
  63. CDialog::OnInitDialog();
  64. // 将“关于...”菜单项添加到系统菜单中。
  65. // IDM_ABOUTBOX 必须在系统命令范围内。
  66. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  67. ASSERT(IDM_ABOUTBOX < 0xF000);
  68. CMenu* pSysMenu = GetSystemMenu(FALSE);
  69. if (pSysMenu != NULL)
  70. {
  71. CString strAboutMenu;
  72. strAboutMenu.LoadString(IDS_ABOUTBOX);
  73. if (!strAboutMenu.IsEmpty())
  74. {
  75. pSysMenu->AppendMenu(MF_SEPARATOR);
  76. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  77. }
  78. }
  79. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  80. //  执行此操作
  81. SetIcon(m_hIcon, TRUE); // 设置大图标
  82. SetIcon(m_hIcon, FALSE); // 设置小图标
  83. // TODO: 在此添加额外的初始化代码
  84. //设置按钮的正确状态
  85. GetDlgItem(IDC_BUTTON_OPENCOMM)->EnableWindow(TRUE);
  86. GetDlgItem(IDC_BUTTON_CLOSECOMM)->EnableWindow(FALSE);
  87. GetDlgItem(IDC_BUTTON_SENDDATA)->EnableWindow(FALSE);
  88. GetDlgItem(IDC_BUTTON_SETUP)->EnableWindow(FALSE);
  89. GetDlgItem(IDC_BUTTON_READDATA)->EnableWindow(FALSE);
  90. isStartTimer=false;
  91. cSeqNr=0;
  92. Attempt=0;
  93. return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  94. }
  95. void CtestMscommDlg::OnSysCommand(UINT nID, LPARAM lParam)
  96. {
  97. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  98. {
  99. CAboutDlg dlgAbout;
  100. dlgAbout.DoModal();
  101. }
  102. else
  103. {
  104. CDialog::OnSysCommand(nID, lParam);
  105. }
  106. }
  107. // 如果向对话框添加最小化按钮,则需要下面的代码
  108. //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  109. //  这将由框架自动完成。
  110. void CtestMscommDlg::OnPaint()
  111. {
  112. if (IsIconic())
  113. {
  114. CPaintDC dc(this); // 用于绘制的设备上下文
  115. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  116. // 使图标在工作矩形中居中
  117. int cxIcon = GetSystemMetrics(SM_CXICON);
  118. int cyIcon = GetSystemMetrics(SM_CYICON);
  119. CRect rect;
  120. GetClientRect(&rect);
  121. int x = (rect.Width() - cxIcon + 1) / 2;
  122. int y = (rect.Height() - cyIcon + 1) / 2;
  123. // 绘制图标
  124. dc.DrawIcon(x, y, m_hIcon);
  125. }
  126. else
  127. {
  128. CDialog::OnPaint();
  129. }
  130. }
  131. //当用户拖动最小化窗口时系统调用此函数取得光标显示。
  132. //
  133. HCURSOR CtestMscommDlg::OnQueryDragIcon()
  134. {
  135. return static_cast<HCURSOR>(m_hIcon);
  136. }
  137. void CtestMscommDlg::OnBnClickedButtonOpencomm()
  138. {
  139. // TODO: 在此添加控件通知处理程序代码
  140. comm =  L"COM3";
  141. /*hCom = CreateFile(comm, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
  142. if (hCom == INVALID_HANDLE_VALUE)
  143. {
  144.         AfxMessageBox(L"打开COM3失败",0,0);
  145. dwError = GetLastError();
  146. return;
  147. }*/
  148. BOOL fSuccess;
  149. hCom=CreateFile(comm, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
  150. if (hCom == INVALID_HANDLE_VALUE)
  151. {
  152. AfxMessageBox(L"打开COM3失败",0,0);
  153. dwError = GetLastError();
  154. return;
  155. }
  156. if(GetFileType(hCom)!=FILE_TYPE_CHAR)
  157. {
  158. CloseHandle(hCom);
  159. return;
  160. }
  161. //// 获取串口当前配置
  162. if (GetCommState(hCom,&config_) == 0)
  163. {
  164. AfxMessageBox(L"没有正确的得到配置信息",0,0);
  165. return;
  166. }
  167. config_.BaudRate=57600;
  168. config_.ByteSize=8;
  169. config_.Parity=NOPARITY;
  170. config_.StopBits=ONESTOPBIT;
  171. config_.fNull=0;
  172. SetCommState(hCom, &config_);
  173. SetupComm( hCom, 4096, 4096 ) ;
  174. COMMTIMEOUTS CommTimeOuts;
  175. CommTimeOuts.ReadIntervalTimeout = 0;
  176. CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
  177. CommTimeOuts.ReadTotalTimeoutConstant = 3000;
  178. // CBR_9600 is approximately 1byte/ms. For our purposes, allow
  179. // double the expected time per character for a fudge factor.
  180. CommTimeOuts.WriteTotalTimeoutMultiplier = 30;//2*CBR_9600/BaudRate;
  181. CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
  182. SetCommTimeouts( hCom, &CommTimeOuts ) ;
  183. //设置按钮状态
  184. GetDlgItem(IDC_BUTTON_OPENCOMM)->EnableWindow(FALSE);
  185. GetDlgItem(IDC_BUTTON_CLOSECOMM)->EnableWindow(TRUE);
  186. GetDlgItem(IDC_BUTTON_SENDDATA)->EnableWindow(TRUE);
  187. GetDlgItem(IDC_BUTTON_SETUP)->EnableWindow(TRUE);
  188. GetDlgItem(IDC_BUTTON_READDATA)->EnableWindow(TRUE);
  189. }
  190. void CtestMscommDlg::OnBnClickedButtonClosecomm()
  191. {
  192. // TODO: 在此添加控件通知处理程序代码
  193. //可以调用CloseHandle API函数关闭串口 
  194. if (hCom == INVALID_HANDLE_VALUE)
  195. {
  196. return;
  197. }
  198. if(CloseHandle(hCom) == 0)    // 调用该函数关闭串口
  199. {
  200. AfxMessageBox(L"关闭串口过程中出现问题.",0,0);
  201. return;
  202. }
  203.     //设置按钮状态
  204. GetDlgItem(IDC_BUTTON_OPENCOMM)->EnableWindow(TRUE);
  205. GetDlgItem(IDC_BUTTON_CLOSECOMM)->EnableWindow(FALSE);
  206. GetDlgItem(IDC_BUTTON_SENDDATA)->EnableWindow(FALSE);
  207. GetDlgItem(IDC_BUTTON_SETUP)->EnableWindow(FALSE);
  208. GetDlgItem(IDC_BUTTON_READDATA)->EnableWindow(FALSE);
  209. KillTimer(TIMER_READ_DATA);
  210. }
  211. void CtestMscommDlg::OnBnClickedButtonSetup()
  212. {
  213. Set_port(hCom,1);
  214. Sleep(100);
  215. Set_port(hCom,0);
  216. //// TODO: 在此添加控件通知处理程序代码
  217. //if (hCom == INVALID_HANDLE_VALUE)
  218. //{
  219. // return;
  220. //}
  221. ////// 获取串口当前配置
  222. //if (GetCommState(hCom,&config_) == 0)
  223. //{
  224. // AfxMessageBox(L"没有正确的得到配置信息",0,0);
  225. //}
  226. ////当你已经在DCB结构中获取串口配置,你应该修改其中的参数,如下代码所示: 
  227. //// 指定用户参数
  228. //config_.BaudRate = 9600;  // 波特率
  229. //config_.StopBits = 0;  // 停止位
  230. //config_.Parity = 0;      // 奇偶校验
  231. //config_.ByteSize = 8;  // 数据位
  232. ///*
  233. //DWORD BaudRate : 
  234. //波特率 (默认 = 9600) 
  235. //BYTE StopBits : 
  236. //0,1,2 = 1, 1.5, 2 (默认 = 0) 
  237. //BYTE Parity : 
  238. //0-4= 无, 奇, 偶, 标志, 空格 (默认 = 0) 
  239. //BYTE ByteSize : 
  240. //数据位, 4-8 (默认 = 8) 
  241. //*/
  242. ////调用SetCommState API函数保存配置。SetCommState函数设备控制块(DCB结构)配置通讯设备。该函数重新初始化所有的硬件控制设定,但不清空输入输出队列。代码如下所示: 
  243. //if (SetCommState(hCom,&config_) == 0)
  244. // AfxMessageBox(L"设置串口出现问题!",0,0);
  245. }
  246. void CtestMscommDlg::OnBnClickedButtonReaddata()
  247. {
  248. // TODO: 在此添加控件通知处理程序代码
  249. if (isStartTimer==false)
  250. SetTimer(TIMER_READ_DATA,300,NULL);
  251. else
  252. KillTimer(TIMER_READ_DATA);
  253. isStartTimer=!isStartTimer;
  254. }
  255. void CtestMscommDlg::OnBnClickedButtonSenddata()
  256. {
  257. // TODO: 在此添加控件通知处理程序代码
  258. //获得输入框中的输入,发送该输入到串口
  259. //要获得数据,一种方式先强制更新数据
  260. UpdateData(TRUE);
  261. //AfxMessageBox(CStrCmd,0,0);
  262. //再一种方式,通过得到文本的方法
  263. /*CString str;
  264. GetDlgItemText(IDC_EDIT_CMD,str);
  265. MessageBox(str);*/
  266.     unsigned long len;
  267. if (WriteFile(hCom,         // 文件句柄
  268. CStrCmd,              // 数据缓冲区指针
  269. sizeof(CStrCmd),              // 字节数
  270. &len,NULL) == 0)          // 接收成功发送数据长度的指针
  271. {
  272. AfxMessageBox(L"发送数据出错.",0,0);
  273. return;
  274. }
  275. }
  276. void CtestMscommDlg::OnTimer(UINT_PTR nIDEvent)
  277. {
  278. // TODO: 在此添加消息处理程序代码和/或调用默认值
  279. switch (nIDEvent)
  280. {
  281. case TIMER_READ_DATA:
  282. {
  283. //读串口
  284. char inputData[1024];
  285. unsigned long len;
  286. if (ReadFile(hCom,    // 句柄
  287. inputData,               // 数据缓冲区指针
  288. sizeof(inputData),              // 字节数
  289. &len,                 // 指向已经读入的字节数
  290. NULL) == 0)              // 重叠I/O结构体
  291. {
  292. //AfxMessageBox(L"读串口消息出错",0,0);
  293. return;
  294. }
  295. if (len > 0)
  296. {
  297.             CStrReceive=(CString)inputData;
  298. UpdateData(FALSE);
  299. inputData[len] = NULL; // Assign end flag of message.
  300. return;  
  301. }  
  302. }
  303. break;
  304. default:
  305. break;
  306. }
  307. }
  308. BYTE CtestMscommDlg::SndCmd(HANDLE hCom)
  309. {
  310. BYTE i,State=RECV_DLE,cTempBuffer[10];
  311. BOOL fSuccess,fEnd=FALSE;
  312. DWORD dwBytesRead,dwBytesWritten;
  313. SetupComm( hCom, 4096, 4096 ) ;
  314. PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT |
  315. PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
  316. fSuccess=WriteFile( hCom, (LPSTR)&STX, 1, &dwBytesWritten, NULL);
  317. if(!fSuccess) return MIS_WRITECOMM;
  318. Attempt=3;
  319. while(1)
  320. {
  321. fSuccess = ReadFile( hCom, (LPSTR)&cTempBuffer,1, &dwBytesRead, NULL) ;
  322. if(!fSuccess)return MIS_READCOMM;
  323. if(dwBytesRead==0)
  324. {
  325. if(--Attempt>0)
  326. {
  327. fSuccess=WriteFile( hCom, (LPSTR)&STX, 1, &dwBytesWritten, NULL);
  328. if(!fSuccess) return MIS_WRITECOMM;
  329. }else
  330. return MIS_TIMEOUT;
  331. }
  332. switch(State)
  333. {
  334. case RECV_DLE:
  335. if(cTempBuffer[0]==DLE[0])
  336. {
  337. State=RECV_DLE_NAK;
  338. fSuccess=WriteFile( hCom, cBuffer, dwLen, &dwBytesWritten, NULL);
  339. if(!fSuccess) return MIS_WRITECOMM;
  340. }else if(--Attempt>0)
  341. {
  342. fSuccess=WriteFile( hCom, (LPSTR)&STX, 1, &dwBytesWritten, NULL);
  343. if(!fSuccess) return MIS_WRITECOMM;
  344. }else{
  345. return MIS_SERERR;
  346. }
  347. break;
  348. case RECV_DLE_NAK:
  349. if(cTempBuffer[0]==DLE[0])
  350. {
  351. return MIS_OK;
  352. }else if(--Attempt>0)
  353. {
  354. State=RECV_DLE;
  355. fSuccess=WriteFile( hCom, (LPSTR)&STX, 1, &dwBytesWritten, NULL);
  356. if(!fSuccess) return MIS_WRITECOMM;
  357. }else{
  358. return MIS_SERERR;
  359. }
  360. break;
  361. }  //end switch
  362. }  //end while 1
  363. }
  364. BYTE CtestMscommDlg::RcvDat(HANDLE hCom)
  365. {
  366.   BYTE MIFS_Err,i,j,State=RECV_STX,cTempBuffer[10];
  367.   WORD MIFS_Check;
  368.   BOOL fSuccess,fEnd=FALSE;
  369.   DWORD RPtr,dwBytesRead,dwBytesWritten;
  370.   while(1)
  371.   {
  372.     fSuccess = ReadFile( hCom, (LPSTR)&cTempBuffer,1, &dwBytesRead, NULL) ;
  373.   if(!fSuccess)return MIS_READCOMM;
  374.       if(dwBytesRead==0) return MIS_TIMEOUT;
  375.     switch(State)
  376.     {
  377.       case RECV_STX:
  378.         if(cTempBuffer[0]==STX[0])
  379.      {
  380.           State=RECV_DATA;
  381.        RPtr=0;
  382.        fSuccess=WriteFile( hCom, (LPSTR)&DLE, 1, &dwBytesWritten, NULL);
  383.           if(!fSuccess) return MIS_WRITECOMM;
  384.        }
  385.        else
  386.        {
  387.          fSuccess=WriteFile( hCom, (LPSTR)&NAK, 1, &dwBytesWritten, NULL);
  388.           if(!fSuccess) return MIS_WRITECOMM;
  389.        }
  390.         break;
  391.       case RECV_DATA:
  392.         if(cTempBuffer[0]==DLE[0])
  393.         {
  394.   State=RECV_DATA_DLE;
  395. }
  396. else{
  397.   if(RPtr<HEADER+MAXDATA+1+ChkBytes)
  398.   {
  399.     cBuffer[RPtr++]=cTempBuffer[0];
  400.   }else{
  401.             return MIS_RS232ERR;
  402.   }
  403.  }
  404.          break;
  405.       case RECV_DATA_DLE:
  406.         if(cTempBuffer[0]==DLE[0])
  407.        {
  408.           State=RECV_DATA;
  409.           if(RPtr<HEADER+MAXDATA+1+ChkBytes)
  410.          {
  411.            cBuffer[RPtr++]=DLE[0];
  412.          }
  413.          else
  414.   {
  415.             return MIS_RS232ERR;
  416.   }
  417. }else if(cTempBuffer[0]==ETX[0])
  418. {
  419.   if(RPtr<(HEADER+ChkBytes)||RPtr>(HEADER+MAXDATA+ChkBytes) )
  420.   {
  421.     MIFS_Err=MIS_BYTESERR;
  422.   }
  423.   else if((cBuffer[2]+HEADER+ChkBytes)!=RPtr)
  424.   {
  425.     MIFS_Err=MIS_BYTESERR;
  426.   }
  427.   else
  428.   {
  429.     if(ChkBytes==BCC_CHKBYTES)
  430.     {
  431.       MIFS_Check=0;
  432.       for(i=0;i<RPtr;i++)
  433.       {
  434.         MIFS_Check^=(WORD)cBuffer[i];
  435.       }
  436.     }else{
  437.          MIFS_Check=CRC_PRESET;
  438.       for(i=0;i<RPtr;i++)
  439.       {
  440.         MIFS_Check^=(WORD)cBuffer[i]<<8;
  441. for(j=0;j<8;j++)
  442. {
  443.   if(MIFS_Check&0x8000)
  444.   {
  445.     MIFS_Check=(MIFS_Check<<1)^CRC_POLYNOM;
  446.   }else{
  447.     MIFS_Check=(MIFS_Check<<1);
  448.   }
  449.          }
  450.       }
  451.     }
  452.     if(MIFS_Check!=0)
  453.     {
  454.               MIFS_Err=MIS_CHECKERR;
  455.     }
  456.     else
  457.     {
  458.       fSuccess=WriteFile( hCom, (LPSTR)&DLE, 1, &dwBytesWritten, NULL);
  459.       if(!fSuccess) return MIS_WRITECOMM;
  460.               return MIS_OK;
  461.     }
  462.   }
  463.   State=RECV_STX;
  464.   fSuccess=WriteFile( hCom, (LPSTR)&NAK, 1, &dwBytesWritten, NULL);
  465.   if(!fSuccess) return MIS_WRITECOMM;
  466. }
  467. break;
  468.     }   //end switch(State)
  469.   }     //end while
  470. }
  471. BYTE CtestMscommDlg::Set_port(HANDLE hCom,BYTE port)
  472. {
  473. BYTE  RetVal;
  474. cBuffer[0]=++cSeqNr;
  475. cBuffer[1]=0x5f;
  476. cBuffer[2]=1;
  477. cBuffer[3]=~port;
  478.     CalcChkBytes();
  479. RetVal=SndCmd(hCom);
  480. if(!RetVal)
  481. {
  482. RetVal=RcvDat(hCom);
  483. if(!RetVal)
  484. {
  485. RetVal=cBuffer[1];
  486. }
  487. }
  488.   return RetVal;
  489. }
  490. void CtestMscommDlg::CalcChkBytes()
  491. {
  492.  DWORD i,j;
  493.  BYTE bcc;
  494.  WORD crc;
  495.  dwLen=HEADER+cBuffer[2];
  496.  if(ChkBytes==BCC_CHKBYTES)
  497.  {
  498.   bcc=0;
  499.   for(i=0;i<dwLen;i++)
  500.   {
  501.    bcc^=cBuffer[i];
  502.   }
  503.   cBuffer[dwLen]=bcc;
  504.  }
  505.  else //CRC16
  506.  {
  507.   crc=CRC_PRESET;
  508.   for(i=0;i<dwLen;i++)
  509.   {
  510.    crc^=(WORD)cBuffer[i]<<8;
  511.    for(j=0;j<8;j++)
  512.    {
  513.     if(crc&0x8000)
  514.     {
  515.      crc=(crc<<1)^CRC_POLYNOM;
  516.     }
  517.     else
  518.     {
  519.      crc=(crc<<1);
  520.     }
  521.    }
  522.   }
  523.   cBuffer[dwLen]  =(BYTE)(crc>>8);
  524.   cBuffer[dwLen+1]=(BYTE)crc;
  525.  }
  526.  dwLen+=ChkBytes;
  527.  for(i=0;i<dwLen;i++)
  528.  {
  529.    if(cBuffer[i]==DLE[0])
  530.    {
  531.      for(j=dwLen;j>i;j--)
  532.      {
  533.        cBuffer[j]=cBuffer[j-1];
  534.      }
  535.  dwLen++;i++;
  536.    }
  537.  }
  538.  cBuffer[dwLen++]=DLE[0];
  539.  cBuffer[dwLen++]=ETX[0];
  540. }
  541. void CtestMscommDlg::OnBnClickedButtonReset()
  542. {
  543. // TODO: 在此添加控件通知处理程序代码
  544. char RetValue, len;
  545. BYTE ResCode[64],size,BCC;
  546. CString Str,S,S1;
  547. TypeSelect(hCom,0);
  548. RetValue=MIFwakeup(hCom,ICC_TCL,(unsigned char *)&len,(unsigned char *)ResCode);
  549. if(len>0)
  550. Str= CString((char*)ResCode,len);
  551. else{
  552. CStrReceive.Append(L"非接触IC卡复位说明:未寻到卡片nr");
  553. return;
  554. }
  555. if( RetValue!=0)
  556. CStrReceive.Append(L"复位错误nr");
  557. //CStrReceive+=S1+"复位错误";
  558. else{
  559. len=Str.GetLength();
  560. //InfoMemo->Lines->Add(S1+"复位数据: "+Str);
  561. if(Str.Mid(1,3)=="3B6") 
  562.     CStrReceive.Append(L"3B6nr");
  563. //CStrReceive.Append(S1+"复位说明: T=0协议 正向约定 TB1和TC1存在"+" 历史字符="+Str.SubString(9,len-8));
  564. else if(Str.Mid(1,3)=="3B7") 
  565.     CStrReceive.Append(L"3B7nr");
  566. //CStrReceive.Append(S1+"复位说明: T=0协议 正向约定 TA1、TB1和TC1存在"+" 历史字符="+Str.SubString(11,len-10));
  567. else if(Str.Mid(1,1)=="0"){
  568. CStrReceive.Append(L"复位说明: 卡片类型=0x");
  569. CStrReceive.Append(Str);
  570. /*CStrReceive.Append(L"复位说明: 卡片类型=0x");
  571. CStrReceive.Append(Str.Mid(1,4));
  572. CStrReceive.Append(L" UID=0x");
  573. CStrReceive.Append(Str.Mid(11,2));
  574. CStrReceive.Append(Str.Mid(9,2));
  575. CStrReceive.Append(Str.Mid(7,2));
  576. CStrReceive.Append(Str.Mid(5,2));
  577. CStrReceive.Append(L" SIZE=0x");
  578. CStrReceive.Append(Str.Mid(15,2));
  579. CStrReceive.Append(L" ATS=");
  580. CStrReceive.Append(Str.Mid(17,len-16));
  581.     CStrReceive.Append(L"nr");*/
  582. //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);
  583. //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));
  584. }
  585. }
  586. UpdateData(FALSE);
  587. }
  588. BYTE CtestMscommDlg::TypeSelect(HANDLE hCom,BYTE TypeSelect)
  589. {
  590.   BYTE  RetVal=0,i;
  591.   cBuffer[0]=++cSeqNr;
  592.   cBuffer[1]=0x80;
  593.   cBuffer[2]=1;
  594.   cBuffer[3]=TypeSelect;
  595.   CalcChkBytes();
  596.   RetVal=SndCmd(hCom);
  597.   if(!RetVal)
  598.   {
  599.     RetVal=RcvDat(hCom);
  600.     if(!RetVal)
  601.     {
  602.       if((RetVal=cBuffer[1])!=0)  return 1;
  603.     }
  604.   }
  605.   return 0;
  606. }
  607. unsigned int CtestMscommDlg::MIFwakeup(HANDLE hCom,BYTE fICC,unsigned char *lenr,unsigned char *resp)       //0x70
  608. {
  609.   DWORD dwBytesRead;
  610.   BYTE RetVal;
  611.   int i;
  612.   cBuffer[0]=++cSeqNr;
  613.   cBuffer[1]=0x71;
  614.   cBuffer[2]=1;
  615.   cBuffer[3]=fICC;
  616.   CalcChkBytes();
  617.   RetVal=SndCmd(hCom);
  618.   if(!RetVal)
  619.   {
  620.     RetVal=RcvDat(hCom);
  621.     if(!RetVal)
  622.     {
  623.       RetVal=cBuffer[1];
  624.       *lenr=cBuffer[2];
  625.       for(i=0;i<*lenr;i++)
  626.         resp[i]=cBuffer[i+3];
  627.       for(i=*lenr-1;i>=0;i--)
  628.        BinToHex(resp[i], (char *)(resp+2*i));
  629.       resp[*lenr*2]='';
  630.       *lenr=*lenr*2;
  631.     }
  632.   }
  633.   return RetVal;
  634. }
  635. void CtestMscommDlg::BinToHex(BYTE dt,char *ch)
  636. {
  637.   BYTE tmp;
  638.   tmp=dt>>4;
  639.   if(tmp<=9) ch[0]=tmp+0x30;
  640.   else ch[0]=tmp+0x37;
  641.   tmp=dt&0x0f;
  642.   if(tmp<=9) ch[1]=tmp+0x30;
  643.   else ch[1]=tmp+0x37;
  644. }
  645. BYTE CtestMscommDlg::HexToBin(char *_ch)
  646. {
  647.   BYTE _dt[2];
  648.   BYTE i;
  649.   for(i=0;i<2;i++)
  650.   {
  651.     if((_ch[i]>='0')&(_ch[i]<='9'))
  652.       _dt[i]=_ch[i]-0x30;
  653.     else if((_ch[i]>='A')&&(_ch[i]<='F'))
  654.       _dt[i]=_ch[i]-0x37;
  655.     else if((_ch[i]>='a')&&(_ch[i]<='f'))
  656.       _dt[i]=_ch[i]-0x57;
  657.     else _dt[i]=5;
  658.   }
  659.   return ((_dt[0]<<4)+(_dt[1]&0x0f));
  660. }
  661. void CtestMscommDlg::OnBnClickedButtonAuthen()
  662. {
  663. // TODO: 在此添加控件通知处理程序代码
  664. //BYTE src[8],dest[8],key[16];
  665. //int i,count;
  666. //WORD sw;
  667. //char ResCode[200];
  668. //char *S,*S1;
  669. //S1="0084000008";
  670. //sw=MainForm->CPUCardCmd1(S1,ResCode);
  671. //S1=AuthenKeyCbx->Text;
  672. //count=AuthenKeyCbx->Text.Length()/2;
  673. //if(count!=16&&count!=8)
  674. //{
  675. // ShowMessage("密钥数据长度错误!");
  676. // return;
  677. //}
  678. //AutoDESencrypt(S1.c_str(),MainForm->RngStr.c_str(),ResCode);
  679. //S=AnsiString(ResCode,16);
  680. //MainForm->InfoMemo->Lines->Add("");
  681. //MainForm->InfoMemo->Lines->Add("使用密钥: "+S1+" 加密随机数");
  682. //MainForm->InfoMemo->Lines->Add("随机数加密结果: "+S);
  683. //S1="008200"+KeyTagEdit->Text+"08"+S;
  684. //sw=MainForm->CPUCardCmd1(S1,ResCode);
  685. //if(sw==0x9000) Close();
  686. }
  687. //
  688. //WORD CtestMscommDlg::CPUCardCmd1(char * Str,char * ResCode)
  689. //{
  690. //
  691. //}