摘要:详细论说在VC++6.0中运用ActiveX控件通过串口与单片机进行二进制数据传输的详细办法。 要害词:VC++ ActiveX 串行通讯 在单片机运用体系中,常常需求通过RS-232串行口与微机进行通讯。现在在各种操作体系中,Microsoft的Windows较为常见,并且大多为 Windows95/98等32位渠道。以往在Windows渠道上的串行通讯多运用其供给的API函数来完成,这种办法运用起来需求许多底层设置,因而较为繁琐,并且难以了解。Microsoft推出的ActiveX技能供给了别的一种完成串行通讯的办法。这种办法不只相对较为简略,并且十分有用。尤其是Visual C++这种可视化面向目标的编程环境中,能够真实把串口看作一个目标,编程时只需简略的设置,了解起来也很简略。下面详细评论Microsoft供给的串行通讯ActiveX控件的运用办法。该控件的相应文件是MSCOMM32.OCX,以下简称为MSCOMM控件。 一、MSCOMM控件 MSCOMM控件,即Microsoft Communication Control,是Microsoft为简化Windows下串行通讯编程而供给的ActiveX控件。它供给了一系列规范通讯指令的运用接口,运用它能够树立与串口的衔接,并能够通过串口衔接到其他通讯设备(如调制解调器),宣布指令,交流数据以及监督和呼应串行衔接中产生的事情和过错。MSCOMM控件可用于创立电话拨号程序、串口通讯程序和功用齐备的终端程序。 MSCOMM控件供给了两种处理通讯的办法: (1)事情驱动办法。当通讯事情产生时,MSCOMM控件会触发OnComm事情,调用者能够捕获该事情,通过查看其CommEvent特点便可承认产生的是哪种事情或过错,然后进行相应的处理。这种办法的长处是呼应及时、可靠性高。 (2)查询办法。在程序的每个要害功用之后,能够通过查看CommEvent特点的值来查询事情和过错。假如运用程序较小,这种办法或许更可取。例如,假如写一个简略的电话拨号程序,则没有必要每接纳1个字符都产生事情,因为专一等候接纳的字符是调制解调器的确认呼应。 在运用MSCOMM控件时,1个MSCOMM控件只能一起对应1个串口。假如运用程序需求拜访和控件多个串口,那么有必要运用多个MSCOMM控件。 在VC++中,MSCOMM控件只对应着1个C++类–CMSComm。因为MSCOMM控件自身没有供给办法,所以CMSComm类除了 Create()成员函数外,其他的函数都是Get/Set函数对,用来获取或设置控件的特点。MSCOMM控件也只要1个OnComm事情,用来向调用者告诉有通讯事情产生。 MSCOMM控件有许多很重要的特点,限于篇幅只给出几个较为重要和常用的特点,如表1所列。 表1 MSCOMM控件的重要特点 属 性说 明 CommPort 通讯端口号 Settings 以字符串办法表明的波特率、奇偶校验、数据位 PortOpen 通讯端口的状况,翻开或是封闭 Input 接纳数据 Output 发送数据 InputMode 接纳数据的类型:0为文本;1为二进制二、编程完成 从表1能够看到,MSCOMM能够两种不同的办法接纳数据,即以文本办法和以二进制办法。用MSCOMM控件进行字符数据传输的文献和材料能够找到许多,在Microsoft的MSDN(Microsoft Developer Network)中就能够找到这样的比如,即VCTERM。但是简直一切以单片机为中心的丈量体系所得到的原始数据都是二进制办法的,所以,以二进制办法传输数据将是最为直接而又简练的办法。不只如此,因为MSCOMM控件在文本办法下,其传输的是宽字符格局的字符,要想得到有用信息,还要额定处理。因而本文首要评论在二进制办法下的运用办法。 在VC++6.0中,用APPWizard能够生成三种运用程序:单文档(SDI)、多文档(MDI)和依据对话框的运用程序。为了阐明问题和省去不必要的细节,下面以依据对话框的运用程序为例。 1.创立一个依据对话框的运用程序 翻开VC++6.0集成开发环境,挑选菜单项File/New,在呈现的对话框中选中Projects标签中的MFC AppWizard(exe),然后在Project Name框中填入MyCOMM(可依据需求命名),之后点OK按钮。在接着呈现的对话框中选中Dialog Based项,然后点NEXT按钮。以下的各对话框都依照缺省设置,这样即可生成一个依据对话框的运用程序。在资源编程器中会呈现其对话框模板。 2.刺进MSCOMM控件 挑选菜单项Project/Add to project/Components and Controls…,在弹出的对话框中挑选Registered ActiveX Controls文件夹下的Microsoft Communications Control,version6.0,然后按下Insert按钮,接着会弹出一个对话框,提示生成的类名及文件名,按OK按钮即可完成控件的刺进。这时在对话框的控件工具栏 上会多出一个电话机容貌的控件图标,Workspace的Classview中也多了一个类CMSComm。 此刻即可将MSCOMM控件参加到对话框模板,参加办法与其他控件相同。然后还要在对话框类中相应参加一个成员变量,此处咱们将其命名为m_comm。参加办法为:首要,在对话框模板中,用鼠标右键点击该控件,挑选ClassWizard,在呈现的对话框的Member Variables标签的Control Ids项下,选中IDC_MSCOMM1。然后,按Add Variable…按钮,在呈现的对话框的Member Variable Name项中输入m_comm。最终,按OK按钮即可。 3.设置特点 能够在两个当地对控件的特点进行设置: (1)对话框资源编辑器中。在对话框模板上,用右键单击MSCOMM控件,然后挑选Properties…菜单项,最终便可设置各项特点。此处只对以下几处进行改动,其他承受缺省设置:Rthershold:1,InputLen:1,DTREnable:不选,InputMode:1-Binary。 (2)对话框类的OnInitDialog()函数中。下面是以上设置的函数完成: BOOL CMyCOMMDlg::OnlnitDialog() { CDialog::OnlnitDialog(); //此处为运用结构主动生成代码,不予列出 //TODO:Add extra initialization here m_comm.SetCommPort(1);//运用串口1 m_comm.SetSettings(9600,N,8,1); //波特率为9600,无奇偶校验,8位数据位,1位中止位 m_comm.SetRThreshold(10); //每接纳10个字符就触发1次接纳事情 m_comm.SetSThreshold(0); //不触发发送事情 m_comm.SetInputLen(10); //每次读操作从缓冲区中取10个字符 m_comm.SetInputMode(1); //二进制数据传输办法 m_comm.SetPortOpen(TRUE); //翻开串口 return TRUE;//return TRUE unless you set the focus to a control } 4.发送二进制数据 假如需求发送二进制数据,可将数据作如下处理。详细代码如下: CByteArray bytOutArr; bytOutArr.Add(0x0); //给数组赋值 bytOutArr.Add(0x1); bytOutArr.Add(0x2); bytOutArr.Add(0x3); bytOutArr.Add(0x4); COleVariant varOut; varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型 m_comm.SetOutput (varOut); //发送数据 5.接纳二进制数据 当需求接纳很多的数据时,最好选用事情驱动办法进行编程。详细步骤如下: (1)呼应OnComm事情。在对话框资源编程器中,双击对话框模板上的MSCOMM控件,在弹出的对话框中填入您所期望的事情呼应函数名,此处将其命名为OnCommMscomm1()。 (2)在事情呼应函数中接纳和处理数据。接纳来的数据为变体数据,所以需求做一些处理,详细代码如下: void CMyCOMMDlg::OnCommMscomm1() { COleVariant varRcv; CByteArray byt; int i; long num; switch (m_comm.GetCommEvent()) { cass 1://数据发送事情 break; case 2://数据接纳事情 varRcv=m_comm.GetInput(); varRcv.ChangeType (VT_ARRAY |VT_UI1); BYTE HUGEP *pbstr; HRESULT hr; hr=SafeArrayAccessData (varRcv.parray,(void HUGEP*FAR*)%26;amp;pbstr);//获取安全数组指针 if (FAILED (hr)){ AfxMessageBox(获取数组指针失利!); break;} num=0; hr=SafeArrayGetUBound (varRcv.parray,1,%26;amp;num);//获取数组上界 if (FAILED (hr)){ AfxMessageBox(获取数组上界失利!); break;} for(i=0;i byt.Add(pbstr [i]); SafeArrayUnaccessData (varRcv.parray); //此刻数据已保存在二进制数组byt中,可依据需求进行相关处理 break; default: break; } } 以上代码中的处理部分能够做成一个独自的函数,在此处调用即可。通过以上代码的处理,接纳来的数据已存放在二进制数组byt中,能够依据自己的需求对其进行相关处理,如保存和显现等。 三、硬件接口 单片机与微机之间的硬件接口能够用1片MAX232或ICL232与几个电容即可完成,有许多文献评论过,此处不再多述。 以上办法通过笔者在实践中的运用,感到十分简练、便利,具有很强的有用含义。