⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap12_4.htm

📁 很不错的一本关于VC的书
💻 HTM
📖 第 1 页 / 共 4 页
字号:
            NULL))==NULL)</p>          <p align="JUSTIFY">return FALSE;</p>          <p align="JUSTIFY">// 为重叠写创建事件对象,手工重置,初始化为无信号的</p>          <p align="JUSTIFY">if((m_osWrite.hEvent=CreateEvent(NULL, TRUE, FALSE,             NULL))==NULL)</p>          <p align="JUSTIFY">return FALSE;</p>          </b>           <p align="JUSTIFY">return TRUE;</p>          <p align="JUSTIFY">}</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">void CTerminalDoc::OnFileConnect() </p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">// TODO: Add your command handler code here</p>          <p><b> </b></p>          <b>           <p align="JUSTIFY">if(!OpenConnection())</p>          <p align="JUSTIFY">AfxMessageBox(&quot;Can't open connection&quot;);</p>          </b>           <p align="JUSTIFY">}</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">void CTerminalDoc::OnFileDisconnect() </p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">// TODO: Add your command handler code here</p>          <p><b> </b></p>          <b>           <p align="JUSTIFY">CloseConnection(); </p>          </b>           <p align="JUSTIFY">}</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">void CTerminalDoc::OnUpdateFileConnect(CCmdUI* pCmdUI)           </p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">// TODO: Add your command update UI handler code             here</p>          <p><b> </b></p>          <b>           <p align="JUSTIFY">pCmdUI-&gt;Enable(!m_bConnected);</p>          </b>           <p align="JUSTIFY">}</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">void CTerminalDoc::OnUpdateFileDisconnect(CCmdUI*             pCmdUI) </p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">// TODO: Add your command update UI handler code             here</p>          <p><b> </b></p>          <b>           <p align="JUSTIFY">pCmdUI-&gt;Enable(m_bConnected);</p>          </b>           <p align="JUSTIFY">}</p>          <p align="JUSTIFY"> </p>          <p><b> </b></p>          <b>           <p align="JUSTIFY">// 打开并配置串行口,建立工作者线程</p>          <p align="JUSTIFY">BOOL CTerminalDoc::OpenConnection()</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">COMMTIMEOUTS TimeOuts;</p>          <p align="JUSTIFY">POSITION firstViewPos;</p>          <p align="JUSTIFY">CView *pView;</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">firstViewPos=GetFirstViewPosition();</p>          <p align="JUSTIFY">pView=GetNextView(firstViewPos);</p>          <p align="JUSTIFY">m_hTermWnd=pView-&gt;GetSafeHwnd();</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">if(m_bConnected)</p>          <p align="JUSTIFY">return FALSE;</p>          <p align="JUSTIFY">m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE,             0, NULL,</p>          <p align="JUSTIFY">OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,           </p>          <p align="JUSTIFY">NULL); // 重叠方式</p>          <p align="JUSTIFY">if(m_hCom==INVALID_HANDLE_VALUE)</p>          <p align="JUSTIFY">return FALSE;</p>          <p align="JUSTIFY">SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);</p>          <p align="JUSTIFY">SetCommMask(m_hCom, EV_RXCHAR);</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">// 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作</p>          <p align="JUSTIFY">TimeOuts.ReadIntervalTimeout=MAXDWORD; </p>          <p align="JUSTIFY">TimeOuts.ReadTotalTimeoutMultiplier=0; </p>          <p align="JUSTIFY">TimeOuts.ReadTotalTimeoutConstant=0; </p>          <p align="JUSTIFY">/* 设置写超时以指定WriteComm成员函数中的</p>          <p align="JUSTIFY">GetOverlappedResult函数的等待时间*/</p>          <p align="JUSTIFY">TimeOuts.WriteTotalTimeoutMultiplier=50; </p>          <p align="JUSTIFY">TimeOuts.WriteTotalTimeoutConstant=2000;</p>          <p align="JUSTIFY">SetCommTimeouts(m_hCom, &amp;TimeOuts);</p>          <p align="JUSTIFY">if(ConfigConnection())</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL,           </p>          <p align="JUSTIFY">0, CREATE_SUSPENDED, NULL); // 创建并挂起线程</p>          <p align="JUSTIFY">if(m_pThread==NULL)</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">CloseHandle(m_hCom);</p>          <p align="JUSTIFY">return FALSE;</p>          <p align="JUSTIFY">}</p>          <p align="JUSTIFY">else</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">m_bConnected=TRUE;</p>          <p align="JUSTIFY">m_pThread-&gt;ResumeThread(); // 恢复线程运行</p>          <p align="JUSTIFY">}</p>          <p align="JUSTIFY">}</p>          <p align="JUSTIFY">else</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">CloseHandle(m_hCom);</p>          <p align="JUSTIFY">return FALSE;</p>          <p align="JUSTIFY">}</p>          <p align="JUSTIFY">return TRUE;</p>          <p align="JUSTIFY">}</p>          </b>           <p align="JUSTIFY"> </p>          <p><b> </b></p>          <b>           <p align="JUSTIFY">// 结束工作者线程,关闭串行口</p>          <p align="JUSTIFY">void CTerminalDoc::CloseConnection()</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">if(!m_bConnected) return;</p>          <p align="JUSTIFY">m_bConnected=FALSE;</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">//结束CommProc线程中WaitSingleObject函数的等待</p>          <p align="JUSTIFY">SetEvent(m_hPostMsgEvent); </p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">//结束CommProc线程中WaitCommEvent的等待</p>          <p align="JUSTIFY">SetCommMask(m_hCom, 0); </p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">//等待辅助线程终止</p>          <p align="JUSTIFY">WaitForSingleObject(m_pThread-&gt;m_hThread, INFINITE);</p>          <p align="JUSTIFY">m_pThread=NULL;</p>          <p align="JUSTIFY">CloseHandle(m_hCom);</p>          <p align="JUSTIFY">}</p>          </b>           <p align="JUSTIFY"> </p>          <p align="JUSTIFY">// 让用户设置串行口</p>          <p align="JUSTIFY">void CTerminalDoc::OnFileSettings() </p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">// TODO: Add your command handler code here</p>          <p><b> </b></p>          <b>           <p align="JUSTIFY">CSetupDlg dlg;</p>          <p align="JUSTIFY">CString str;</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">dlg.m_bConnected=m_bConnected;</p>          <p align="JUSTIFY">dlg.m_sPort=m_sPort;</p>          <p align="JUSTIFY">str.Format(&quot;%d&quot;,m_nBaud);</p>          <p align="JUSTIFY">dlg.m_sBaud=str;</p>          <p align="JUSTIFY">str.Format(&quot;%d&quot;,m_nDataBits);</p>          <p align="JUSTIFY">dlg.m_sDataBits=str;</p>          <p align="JUSTIFY">dlg.m_nParity=m_nParity;</p>          <p align="JUSTIFY">dlg.m_nStopBits=m_nStopBits;</p>          <p align="JUSTIFY">dlg.m_nFlowCtrl=m_nFlowCtrl;</p>          <p align="JUSTIFY">dlg.m_bEcho=m_bEcho;</p>          <p align="JUSTIFY">dlg.m_bNewLine=m_bNewLine;</p>          <p align="JUSTIFY">if(dlg.DoModal()==IDOK)</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">m_sPort=dlg.m_sPort;</p>          <p align="JUSTIFY">m_nBaud=atoi(dlg.m_sBaud);</p>          <p align="JUSTIFY">m_nDataBits=atoi(dlg.m_sDataBits);</p>          <p align="JUSTIFY">m_nParity=dlg.m_nParity;</p>          <p align="JUSTIFY">m_nStopBits=dlg.m_nStopBits;</p>          <p align="JUSTIFY">m_nFlowCtrl=dlg.m_nFlowCtrl;</p>          <p align="JUSTIFY">m_bEcho=dlg.m_bEcho;</p>          <p align="JUSTIFY">m_bNewLine=dlg.m_bNewLine;</p>          <p align="JUSTIFY">if(m_bConnected)</p>          <p align="JUSTIFY">if(!ConfigConnection())</p>          <p align="JUSTIFY">AfxMessageBox(&quot;Can't realize the settings!&quot;);</p>          <p align="JUSTIFY">}</p>          </b>           <p align="JUSTIFY">}</p>          <p align="JUSTIFY"> </p>          <p><b> </b></p>          <b>           <p align="JUSTIFY">// 配置串行口</p>          <p align="JUSTIFY">BOOL CTerminalDoc::ConfigConnection()</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">DCB dcb;</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">if(!GetCommState(m_hCom, &amp;dcb))</p>          <p align="JUSTIFY">return FALSE;</p>          <p align="JUSTIFY">dcb.fBinary=TRUE;</p>          <p align="JUSTIFY">dcb.BaudRate=m_nBaud; // 波特率</p>          <p align="JUSTIFY">dcb.ByteSize=m_nDataBits; // 每字节位数</p>          <p align="JUSTIFY">dcb.fParity=TRUE;</p>          <p align="JUSTIFY">switch(m_nParity) // 校验设置</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">case 0: dcb.Parity=NOPARITY;</p>          <p align="JUSTIFY">break;</p>          <p align="JUSTIFY">case 1: dcb.Parity=EVENPARITY;</p>          <p align="JUSTIFY">break;</p>          <p align="JUSTIFY">case 2: dcb.Parity=ODDPARITY;</p>          <p align="JUSTIFY">break;</p>          <p align="JUSTIFY">default:;</p>          <p align="JUSTIFY">}</p>          <p align="JUSTIFY">switch(m_nStopBits) // 停止位</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">case 0: dcb.StopBits=ONESTOPBIT;</p>          <p align="JUSTIFY">break;</p>          <p align="JUSTIFY">case 1: dcb.StopBits=ONE5STOPBITS;</p>          <p align="JUSTIFY">break;</p>          <p align="JUSTIFY">case 2: dcb.StopBits=TWOSTOPBITS;</p>          <p align="JUSTIFY">break;</p>          <p align="JUSTIFY">default:;</p>          <p align="JUSTIFY">}</p>          <p align="JUSTIFY">// 硬件流控制设置</p>          <p align="JUSTIFY">dcb.fOutxCtsFlow=m_nFlowCtrl==1;</p>          <p align="JUSTIFY">dcb.fRtsControl=m_nFlowCtrl==1?</p>          <p align="JUSTIFY">RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;</p>          <p align="JUSTIFY">// XON/XOFF流控制设置</p>          <p align="JUSTIFY">dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;</p>          <p align="JUSTIFY">dcb.XonChar=XON;</p>          <p align="JUSTIFY">dcb.XoffChar=XOFF;</p>          <p align="JUSTIFY">dcb.XonLim=50;</p>          <p align="JUSTIFY">dcb.XoffLim=50;</p>          <p align="JUSTIFY">return SetCommState(m_hCom, &amp;dcb);</p>          <p align="JUSTIFY">}</p>          </b>           <p align="JUSTIFY"> </p>          <p><b> </b></p>          <b>           <p align="JUSTIFY">// 从串行口输入缓冲区中读入指定数量的字符</p>          <p align="JUSTIFY">DWORD CTerminalDoc::ReadComm(char *buf,DWORD dwLength)</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">DWORD length=0;</p>          <p align="JUSTIFY">COMSTAT ComStat;</p>          <p align="JUSTIFY">DWORD dwErrorFlags;</p>          <p align="JUSTIFY">ClearCommError(m_hCom,&amp;dwErrorFlags,&amp;ComStat);</p>          <p align="JUSTIFY">length=min(dwLength, ComStat.cbInQue);</p>          <p align="JUSTIFY">ReadFile(m_hCom,buf,length,&amp;length,&amp;m_osRead);</p>          <p align="JUSTIFY">return length;</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">}</p>          <p align="JUSTIFY"> </p>          <p align="JUSTIFY">// 将指定数量的字符从串行口输出</p>          <p align="JUSTIFY">DWORD CTerminalDoc::WriteComm(char *buf,DWORD dwLength)</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">BOOL fState;</p>          <p align="JUSTIFY">DWORD length=dwLength;</p>          <p align="JUSTIFY">COMSTAT ComStat;</p>          <p align="JUSTIFY">DWORD dwErrorFlags;</p>          <p align="JUSTIFY">ClearCommError(m_hCom,&amp;dwErrorFlags,&amp;ComStat);</p>          <p align="JUSTIFY">fState=WriteFile(m_hCom,buf,length,&amp;length,&amp;m_osWrite);</p>          <p align="JUSTIFY">if(!fState){</p>          <p align="JUSTIFY">if(GetLastError()==ERROR_IO_PENDING)</p>          <p align="JUSTIFY">{</p>          <p align="JUSTIFY">GetOverlappedResult(m_hCom,&amp;m_osWrite,&amp;length,TRUE);//             等待</p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -