用MSComm控件进行串口编程
(一)实验目的 使用MSComm控件读写串行口
(二)实验内容 学会使用MSComm控件,掌握控件的基本属性,学会使用OnComm事件。
(三)要点提示
1、新建工程时确保选中ActiveX Controls选项(Step 2)。
2、在VC项目中加入MSComm控件 选择“Project->Add To Project->Components and Controls”菜单命令,就会弹出Components and Controls Gallery对话框。可以在Regiestered ActiveX文件夹中选中“Microsoft Communications Controls, Version 6.0”选项,单击“Insert”按钮就可以完成添加MSComm控件的操作。这时VC会自动向工程中加入一个CMSComm类(mscomm.cpp和mscomm.h)。
3、设置MSComm控件属性 在Controls工具箱窗口中可以看到MSComm控件,把它拖到你的对话框中,右键点击对话框上MSComm控件图标,选择Properties,将会看到属性页,在这里可以设置控件的大部分属性,例如可以选择Buffers页,把RThreshold的值改为1,以产生OnComm事件。所有这些属性也可以在程序中编写代码设置,例如可以在OnInitDialog加入m_comm1.SetRThreshold(1)。
4、加入成员变量 使用ClassWizard,在Member Variables中双击MSComm控件ID,可以加入CMSComm类型的成员变量。这样程序中就可以使用这个对象操作串口。
5、加入事件 右键点击对话框上MSComm控件图标,选择Events,将会弹出Evnet Handlers对话框,选择OnComm,单击OK即可。
6、VARIANT类型 Variant是一种特殊的数据类型,根据使用的方式,它可以包含不同类别的信息。一般说来,你可以用Variant变量存储任何数据类型,对它执行各种操作和类型转换。它主要在VB中使用,在VC中为了支持OLE、COM、ActiveX控件而引入。在VC中VARIANT是一个struct,可以用它的不同的域引用其不同类型的值,例如当VARIANT是一个double型时,可以用它的dblVal域得到和设置它的值。VC中还引入了两个类对VARIANT类型加以支持:COleVariant和_variant_t,其中COleVariant需要包含afxdisp.h,_variant_t需要包含comdef.h。此外Windows还提供了VariantInit、VariantClear、VariantChangeType、VariantCopy等函数以方便处理VARIANT类型的变量。
7、SAFEARRAY类型 有时直接使用VARIANT不方便,这时可以考虑把数据转化成CByteArray(任何数据都可以当作字节流处理),再使用COleVariant把它转化成VARIANT。这时数据在VARIANT中被表示为SAFEARRAY类型,可以用它的parray得到指向SAFEARRAY类型的指针,使用SAFEARRAY的pvData域得到指向原始数据的指针。同样Windows也提供了一组函数以方便处理SAFEARRAY类型的变量,详情请参阅MSDN。下面一段程序演示了将一个字符串以字节数组的形式放入VARIANT,再从VARIANT中取出的过程:
//原始数据 CString str="Test."; //存为CByteArray CByteArray array; array.SetSize(str.GetLength()+1); strcpy((char*)array.GetData(),str); //转为COleVariant COleVariant tmp(array); //转为VARIANT VARIANT var=tmp; …… //得到SAFEARRAY SAFEARRAY* sa=var.parray; //得到数据长度 int len=sa->rgsabound[0].cElements; //得到指向原始数据的指针 //也可直接用char* pData=(char*)var.parray->pvData获得 char* pData=(char*)sa->pvData;
使用这种方法可以把MSComm传输的任何数据都以字节流处理。(即把数据转成CByteArray发送,从GetInput().parray->pvData获得)
(四)示例程序 该程序使用两个MSComm控件分别控制COM1和COM2。COM1和COM2已连线的情况下,向COM1写数据(SetOutput),COM2的OnComm事件将会被触发,表示COM2的数据缓冲区已经收到数据,这时程序就可以自动去读COM2(GetInput),并将读到的数据显示出来。
示例程序下载
|