其他选项按照缺省设置或者根据具体设备的要求进行设置。如果需要通过多个串行口与多台设备通信,那么每一个串行口对应于一个单独的MSComm控件。串行口的设置参数既可以在对话框编辑器里设定,也可以在程序代码中通过调用CMSComm类的成员函数设定。例如,我们可以在MyCOMDlg类的OnInitDialog成员函数中初始化MSComm控件的参数,代码如下: BOOL CMyCOMDlg::OnInitDialog() { CDialog:OnInitDialog(); //以上为MFC框架自动生成的代码,在此不列出 //TODO:Add extra initialization here m_wndCOM1.SetCommPort(1); m_wndCOM1.SetSettings("9600,e,7,1"); m_wndCOM1.SetRThreshold(1); m_wndCOM1.SetSThreshold(0); m_wndCOM1.SetInputLen(1); m_wndCOM1.SetPortOpen(TRUE);//打开通信口 return TRUE;//return TRUE unless you set the focus to a control }
接下来为程序主对话框建立响应MSComm事件的处理函数,每当MSComm控件触发事件时该函数将被调用。在对话框编辑器中用鼠标左键双击MSComm控件图标,在弹出的对话框中输入函数名OnCommCOM1,该事件处理函数的原型定义和消息映射入口将自动被添加到CMyCOMDlg类中,我们所要做的只是在OnCommCOM1函数中给出具体的数据处理程序段,代码示例如下: void CMyCOMDlg::OnCommCom1() { //TOD O:Add your control notification handler code here CString sInput; switch(m_wndCOM1.GetCommEvent()) { case 1: //comEvSend事件 /*如有数据要发送,可采用以下代码: VARIANT varOut; VariantInit(&varOut); varOut.vt=VT_BSTR; USES_CONVERSION; varOut.bstrVal=SysAllocString(T2OLE)("My data")); if(varOut.bstrVal){ m_wndCOM1.SetOutput(varOut); SysFreeString(varOut.bstrVal); } */ break; case 2: //comEvReceiv事件,有数据到达 sInput=m_wndCOM1.GetInput().bstrVal; //对接收到的数据做必要处理 break; case 1009://comEventRxParity事件,奇偶校验错误 //错误处理代码 break; default: break; } ? ? 在这里必须注意的一点是在发送字符数据时,必须向MSComm控件提供Unicode格式的字符串,在以上代码中用到了USES_CONVERSION和T2OLE宏进行ANSI字符串到Unicode字符串的转换,具体内容可参考Visual C++6.0所带的MSDN文档,在此不加赘述。 本文对Windows 98下Visual C++ 程序中使用MSComm串行通信ActiveX控件编程的方法做了探讨,显示了ActiveX技术的强大功能、充分的灵活性和易用性,具有一定的实践意义。 参考文献 1 Microsoft公司.Microsoft Development Network. 2 Kate Gregory.Special Edition Using Visual C++5.