📄 chap12_4.htm
字号:
<p ALIGN="JUSTIFY">//</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">#include "SetupDlg.h"</b></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">CTerminalDoc::CTerminalDoc()</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">// TODO: add one-time construction code here</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">m_bConnected=FALSE;</p>
<p ALIGN="JUSTIFY">m_pThread=NULL;</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">m_nBaud = 9600;</p>
<p ALIGN="JUSTIFY">m_nDataBits = 8;</p>
<p ALIGN="JUSTIFY">m_bEcho = FALSE;</p>
<p ALIGN="JUSTIFY">m_nFlowCtrl = 0;</p>
<p ALIGN="JUSTIFY">m_bNewLine = FALSE;</p>
<p ALIGN="JUSTIFY">m_nParity = 0;</p>
<p ALIGN="JUSTIFY">m_sPort = "COM2";</p>
<p ALIGN="JUSTIFY">m_nStopBits = 0;</b></p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">CTerminalDoc::~CTerminalDoc()</p>
<p ALIGN="JUSTIFY">{</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if(m_bConnected)</p>
<p ALIGN="JUSTIFY">CloseConnection();</p>
<p ALIGN="JUSTIFY">// </font><font SIZE="3">删除事件句柄</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if(m_hPostMsgEvent)</p>
<p ALIGN="JUSTIFY">CloseHandle(m_hPostMsgEvent);</p>
<p ALIGN="JUSTIFY">if(m_osRead.hEvent)</p>
<p ALIGN="JUSTIFY">CloseHandle(m_osRead.hEvent);</p>
<p ALIGN="JUSTIFY">if(m_osWrite.hEvent)</p>
<p ALIGN="JUSTIFY">CloseHandle(m_osWrite.hEvent);</b></p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">BOOL CTerminalDoc::OnNewDocument()</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">if (!CDocument::OnNewDocument())</p>
<p ALIGN="JUSTIFY">return FALSE;</p>
<p ALIGN="JUSTIFY">((CEditView*)m_viewList.GetHead())->SetWindowText(NULL);</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// TODO: add reinitialization code here</p>
<p ALIGN="JUSTIFY">// (SDI documents will reuse this document)</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// </font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">WM_COMMNOTIFY</font><font SIZE="3">消息创建事件对象,手工重置,初始化为有信号的</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)</p>
<p ALIGN="JUSTIFY">return FALSE;</p>
<p ALIGN="JUSTIFY">memset(&m_osRead, 0, sizeof(OVERLAPPED));</p>
<p ALIGN="JUSTIFY">memset(&m_osWrite, 0, sizeof(OVERLAPPED));</p>
<p ALIGN="JUSTIFY">// </font><font SIZE="3">为重叠读创建事件对象,手工重置,初始化为无信号的</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if((m_osRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)</p>
<p ALIGN="JUSTIFY">return FALSE;</p>
<p ALIGN="JUSTIFY">// </font><font SIZE="3">为重叠写创建事件对象,手工重置,初始化为无信号的</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if((m_osWrite.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)</p>
<p ALIGN="JUSTIFY">return FALSE;</b></p>
<p ALIGN="JUSTIFY">return TRUE;</p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">void CTerminalDoc::OnFileConnect() </p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">// TODO: Add your command handler code here</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if(!OpenConnection())</p>
<p ALIGN="JUSTIFY">AfxMessageBox("Can't open connection");</b></p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">void CTerminalDoc::OnFileDisconnect() </p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">// TODO: Add your command handler code here</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">CloseConnection(); </b></p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></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></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">pCmdUI->Enable(!m_bConnected);</b></p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></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></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">pCmdUI->Enable(m_bConnected);</b></p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// </font><font SIZE="3">打开并配置串行口,建立工作者线程</font><font FACE="Times New Roman" SIZE="3"></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"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">firstViewPos=GetFirstViewPosition();</p>
<p ALIGN="JUSTIFY">pView=GetNextView(firstViewPos);</p>
<p ALIGN="JUSTIFY">m_hTermWnd=pView->GetSafeHwnd();</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></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); // </font><font SIZE="3">重叠方式</font><font FACE="Times New Roman" SIZE="3"></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"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// </font><font SIZE="3">把间隔超时设为最大,把总超时设为</font><font FACE="Times New Roman" SIZE="3">0</font><font SIZE="3">将导致</font><font FACE="Times New Roman" SIZE="3">ReadFile</font><font SIZE="3">立即返回并完成操作</font><font FACE="Times New Roman" SIZE="3"></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">/* </font><font SIZE="3">设置写超时以指定</font><font FACE="Times New Roman" SIZE="3">WriteComm</font><font SIZE="3">成员函数中的</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">GetOverlappedResult</font><font SIZE="3">函数的等待时间</font><font FACE="Times New Roman" SIZE="3">*/</p>
<p ALIGN="JUSTIFY">TimeOuts.WriteTotalTimeoutMultiplier=50; </p>
<p ALIGN="JUSTIFY">TimeOuts.WriteTotalTimeoutConstant=2000;</p>
<p ALIGN="JUSTIFY">SetCommTimeouts(m_hCom, &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); // </font><font SIZE="3">创建并挂起线程</font><font FACE="Times New Roman" SIZE="3"></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->ResumeThread(); // </font><font SIZE="3">恢复线程运行</font><font FACE="Times New Roman" SIZE="3"></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -