subject_19635.htm
来自「一些关于vc的问答」· HTM 代码 · 共 36 行
HTM
36 行
<p>
序号:19635 发表者:江观 发表日期:2002-10-30 11:23:37
<br>主题:帮忙
<br>内容:<BR>void CHpcComDoc::OnCommRecv() <BR>{<BR>// TODO: Add your command handler code here<BR>char pBuff[100];<BR>int nLength;<BR>CString str;<BR>CEditView *pView;<BR>POSITION firstViewPos;<BR> <BR> firstViewPos=GetFirstViewPosition();<BR> pView=(CEditView *)GetNextView(firstViewPos);<BR><BR> if(!m_bConnected)<BR> {<BR> AfxMessageBox(_T("Can't open connection"));<BR> return;<BR> }<BR> <BR> nLength=RecData(pBuff,100);<BR><BR> if(nLength==0)<BR> AfxMessageBox(_T("Receiving data fail"));<BR><BR> if(nLength)<BR> {<BR> for(int i=0;i<nLength;i++)<BR><BR> str=pBuff[0];<BR> AfxMessageBox(_T("Receiving data Successfully"));<BR> }<BR> strcpy(pBuff,"");<BR><BR> CEdit& edit = (CEdit&)pView->GetEditCtrl();<BR> nLength=edit.GetWindowTextLength();<BR> edit.SetSel(nLength,nLength); //移动插入光标到正文末尾<BR><BR> //edit.SetSel(-1, 0);<BR> edit.ReplaceSel(str); // 向编辑视图中插入收到的字符<BR>}<BR><BR><BR><BR><BR>DWORD CHpcComDoc::RecData(char *pBuff, DWORD dwDataLength)<BR>{ <BR>DWORD dwBytesRead=0;// 实际接收的字节数<BR>DWORD dwBytesWrite=0;<BR>COMSTAT ComStat;// 定义一个COMSTAT结构<BR>DWORD dwErrorFlags;// 用于返回串行驱动程序的错误值<BR>DWORD dwCommModemStatus;// CE_OVERRUN, CE_RXPARITY, CE_FRAME, CE_TXFULL<BR><BR><BR> ClearCommError(m_hCom,&dwErrorFlags,&ComStat);// 清除通信错误<BR><BR> // Specify a set of events to be monitored for the port.<BR> SetCommMask (m_hCom, EV_RXCHAR);<BR><BR> // 等待接收终端握手信号 <BR> while(1)<BR> {<BR> // Wait for an event to occur for the port.<BR> WaitCommEvent (m_hCom, &dwCommModemStatus, 0);<BR> // Re-Specify the set of events to be monitored for the port. <BR> SetCommMask (m_hCom, EV_RXCHAR);<BR><BR> if (dwCommModemStatus & EV_RXCHAR) <BR> { <BR> ReadFile (m_hCom, pBuff, 1, &dwBytesRead, 0);<BR> if(dwBytesRead==1) <BR> break;<BR> } <BR> }<BR> return dwBytesRead;<BR>}<BR><BR>我希望每次调用OnCommRecv() 都能输出当前输入的1个字符<BR>但如果第一次调用,输入123,输出1,可以。第二次调用,输入456,应输出4,却输出2,应该是缓冲区没有清空,请问应该怎麽办?能不能用strcpy(pBuff,"")清?在哪清?请高手帮忙<BR><BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:未出手的飞刀 回复日期:2002-10-30 14:19:07
<br>内容:<BR>不是 pBuff 没清吧,<BR>ReadFile (m_hCom, pBuff, 1, &dwBytesRead, 0);不是自动清了吗
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:江观 回复日期:2002-10-30 16:17:21
<br>内容:那请问是那里的原因呢?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:不说 回复日期:2002-10-30 23:50:26
<br>内容:你每次只读一个字节当然没有清空COM口的缓冲区啦,正确的做法应该是:<BR><BR>ClearCommError(m_hIDComDev, &dwErrorFlags, &ComStat);<BR>if (!ComStat.cbInQue) //这里要判断一下读入缓冲区中有没有东西,有东西才读<BR> return (0);<BR> <BR>dwBytesRead =(DWORD) ComStat.cbInQue;//把缓冲区里的东西全读出来,否则下次读的时候读进来的就是上次剩下的。<BR><BR>bReadStatus = ReadFile(m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead);<BR><BR>读进来以后再对缓冲区进行操作,把不需要的东西扔掉。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:江观 回复日期:2002-10-31 11:34:51
<br>内容:谢谢你@不说@,调试成功了。再问,如果我想输出第2个字符的话,改动str=pBuff[1]就可以了吧?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不说 回复日期:2002-10-31 11:47:33
<br>内容:yes,反正记得读一次处理一次就成了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?