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

📄 subject_29408.htm

📁 vc
💻 HTM
字号:
<p>
序号:29408 发表者:老牛牛 发表日期:2003-02-07 13:06:56
<br>主题:关于MSCOMM控件的使用问题
<br>内容:MSCOMM控件在CDialog中使用正常,但在CFormView中却无法使用,请教各位高手.谢谢!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:ggj 回复日期:2003-02-10 12:56:31
<br>内容:你的问题和没问一样<BR>1、你说的MSCOMM肯定可以在CFormView中使用<BR>2、如果不能使用和你的代码有关<BR>3、如果你真想解决请贴代码
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:老牛牛 回复日期:2003-02-10 23:59:20
<br>内容:代码:<BR><BR>void CCommtest0View::OnCom() <BR>{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CString variant_inp,safearray_inp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LONG len=0,k=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BYTE rxdata[1024]; //设置BYTE数组 <BR>&nbsp;&nbsp;&nbsp;&nbsp;CString strtemp,string1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int l=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if(m_Comm.GetCommEvent()==2)&nbsp;&nbsp; <BR>&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variant_inp=m_Comm.GetInput(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safearray_inp=variant_inp; //断点检查此处程序错误跳出<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len=strlen(variant_inp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len=safearray_inp.GetOneDimSize(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k&lt;len;k++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safearray_inp.GetElement(&amp;k,rxdata+k);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=0;k&lt;len;k++) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTE bt=*(char*)(rxdata+k); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strtemp.Format("%c",bt); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_ReceiveData1+=strtemp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<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>回复者:ggj 回复日期:2003-02-12 11:04:00
<br>内容:你一定是没有在formview中没有做comm的初始化工作,是不是[assert failure错误,用debug]<BR>通常在dlg都可以使用默认,但是view中必须在oncreate()函数中加上一些特殊的处理<BR>㈠ 在SDI使用ActiveX控件: <BR><BR>  ⑴.在当前的Workspace中插入MSComm控件。 <BR><BR>   Project菜单------&gt;Add to Project----&gt;Components and Controls-----&gt;Registered <BR><BR>   ActiveX Controls---&gt;选择Components: Microsoft Communications Control, <BR><BR>   version 6.0 插入到当前的Workspace中。 <BR><BR>结果添加了类CMSComm(及相应文件:mscomm.h和mscomm.cpp )。 <BR><BR>  ⑵.在MainFrm.h中加入MSComm控件。 <BR><BR>protected: <BR><BR>   CMSComm m_ComPort; <BR><BR>在Mainfrm.cpp::OnCreare()中: <BR><BR>  DWORD style=WS_VISIBLE|WS_CHILD; <BR><BR>   if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){ <BR><BR>TRACE0("Failed to create OLE Communications Control\n"); <BR><BR>return -1;   // fail to create <BR><BR>    } <BR><BR>  ⑶.初始化串口 <BR><BR>m_ComPort.SetCommPort(1);  //选择COM? <BR><BR>m_ComPort. SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes <BR><BR>m_ComPort. SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes// <BR><BR><BR><BR>if(!m_ComPort.GetPortOpen()) //打开串口 <BR><BR>m_ComPort.SetPortOpen(TRUE); <BR><BR>m_ComPort.SetInputMode(1); //设置输入方式为二进制方式 <BR><BR>m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数 <BR><BR><BR><BR>m_ComPort.SetRThreshold(1); //为1表示有一个字符引发一个事件 <BR><BR>     m_ComPort.SetInputLen(0); <BR><BR>⑷.捕捉串口事项。MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。 <BR><BR>在MainFrm.h中: <BR><BR>protected: <BR><BR>afx_msg void OnCommMscomm(); <BR><BR>DECLARE_EVENTSINK_MAP() <BR><BR>在MainFrm.cpp中: <BR><BR>BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )   <BR><BR>ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) <BR><BR>           //映射ActiveX控件事件 <BR><BR>END_EVENTSINK_MAP() <BR><BR>⑸.串口读写. 完成读写的函数的确很简单,GetInput()和SetOutput()就可。两个函数的原型是: <BR><BR>VARIANT GetInput();及 void SetOutput(const VARIANT&amp; newValue);都要使用VARIANT类型(所有Idispatch::Invoke的参数和返回值在内部都是作为VARIANT对象处理的)。 <BR><BR>无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式)。查阅VARIANT文档知道,可以用BSTR表示字符串,但遗憾的是所有的BSTR都是包含宽字符,即使我们没有定义_UNICODE_UNICODE也是这样! WinNT支持宽字符, 而Win95并不支持。为解决上述问题,我们在实际工作中使用CbyteArray,给出相应的部分程序如下: <BR><BR>    void CMainFrame::OnCommMscomm(){ <BR><BR>     VARIANT vResponse;   int k; <BR><BR>if(m_commCtrl.GetCommEvent()==2) {       <BR><BR>k=m_commCtrl.GetInBufferCount(); //接收到的字符数目 <BR><BR>if(k&gt;0) { <BR><BR>vResponse=m_commCtrl.GetInput(); //read <BR><BR>SaveData(k,(unsigned char*) vResponse.parray-&gt;pvData); <BR><BR>} // 接收到字符,MSComm控件发送事件 } <BR><BR>   。。。。。 // 处理其他MSComm控件 <BR><BR>} <BR><BR>void CMainFrame::OnCommSend() { <BR><BR>。。。。。。。。 // 准备需要发送的命令,放在TxData[]中 <BR><BR>CByteArray array; <BR><BR>array.RemoveAll(); <BR><BR>array.SetSize(Count); <BR><BR>for(i=0;i&lt;Count;i++) <BR><BR>array.SetAt(i, TxData[i]); <BR><BR>   m_ComPort.SetOutput(COleVariant(array)); // 发送数据 <BR><BR>} <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>
回复者:老牛牛 回复日期:2003-02-13 00:27:38
<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>
回复者:风云使者 回复日期:2003-02-13 19:52:32
<br>内容: 这样一段文字 “使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --&gt; Add to Project --&gt; Components and Control插入即可,再将该控件从工具箱中拉到对话框中。“<BR> 可是我怎么在activex控件中没看见msccomm阿
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ggj 回复日期:2003-02-14 09:30:49
<br>内容:一般win都已经在system32下了,我一般都是在form或者dlg上直接右键,可以insert activex,找到即可!
<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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -