📄 subject_29408.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> CString variant_inp,safearray_inp;<BR> LONG len=0,k=0;<BR> BYTE rxdata[1024]; //设置BYTE数组 <BR> CString strtemp,string1;<BR> int l=0;<BR> <BR><BR> if(m_Comm.GetCommEvent()==2) <BR> { <BR> variant_inp=m_Comm.GetInput(); <BR> safearray_inp=variant_inp; //断点检查此处程序错误跳出<BR> len=strlen(variant_inp); len=safearray_inp.GetOneDimSize(); <BR> for(k=0;k<len;k++)<BR> safearray_inp.GetElement(&k,rxdata+k); for(k=0;k<len;k++) <BR> {<BR> BYTE bt=*(char*)(rxdata+k); <BR> strtemp.Format("%c",bt); <BR> m_ReceiveData1+=strtemp; <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>
<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菜单------>Add to Project---->Components and Controls----->Registered <BR><BR> ActiveX Controls--->选择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& 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>0) { <BR><BR>vResponse=m_commCtrl.GetInput(); //read <BR><BR>SaveData(k,(unsigned char*) vResponse.parray->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<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 --> Add to Project --> 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 + -