📄 sy0904.htm
字号:
<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p><font color="#0000FF">用MSComm控件进行串口编程</font> </p>
<p>(一)实验目的<br>
使用MSComm控件读写串行口</p>
<p>(二)实验内容<br>
学会使用MSComm控件,掌握控件的基本属性,学会使用OnComm事件。</p>
<p>(三)要点提示</p>
<p>1、新建工程时确保选中ActiveX Controls选项(Step 2)。</p>
<p>2、在VC项目中加入MSComm控件<br>
选择“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)。</p>
<p>3、设置MSComm控件属性<br>
在Controls工具箱窗口中可以看到MSComm控件,把它拖到你的对话框中,右键点击对话框上MSComm控件图标,选择Properties,将会看到属性页,在这里可以设置控件的大部分属性,例如可以选择Buffers页,把RThreshold的值改为1,以产生OnComm事件。所有这些属性也可以在程序中编写代码设置,例如可以在OnInitDialog加入m_comm1.SetRThreshold(1)。</p>
<p>4、加入成员变量<br>
使用ClassWizard,在Member Variables中双击MSComm控件ID,可以加入CMSComm类型的成员变量。这样程序中就可以使用这个对象操作串口。</p>
<p>5、加入事件<br>
右键点击对话框上MSComm控件图标,选择Events,将会弹出Evnet Handlers对话框,选择OnComm,单击OK即可。</p>
<p>6、VARIANT类型<br>
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类型的变量。</p>
<p>7、SAFEARRAY类型<br>
有时直接使用VARIANT不方便,这时可以考虑把数据转化成CByteArray(任何数据都可以当作字节流处理),再使用COleVariant把它转化成VARIANT。这时数据在VARIANT中被表示为SAFEARRAY类型,可以用它的parray得到指向SAFEARRAY类型的指针,使用SAFEARRAY的pvData域得到指向原始数据的指针。同样Windows也提供了一组函数以方便处理SAFEARRAY类型的变量,详情请参阅MSDN。下面一段程序演示了将一个字符串以字节数组的形式放入VARIANT,再从VARIANT中取出的过程:</p>
<blockquote>
<p>//原始数据<br>
CString str="Test.";<br>
//存为CByteArray<br>
CByteArray array;<br>
array.SetSize(str.GetLength()+1);<br>
strcpy((char*)array.GetData(),str);<br>
//转为COleVariant<br>
COleVariant tmp(array);<br>
//转为VARIANT<br>
VARIANT var=tmp;<br>
……<br>
//得到SAFEARRAY<br>
SAFEARRAY* sa=var.parray;<br>
//得到数据长度<br>
int len=sa->rgsabound[0].cElements;<br>
//得到指向原始数据的指针<br>
//也可直接用char* pData=(char*)var.parray->pvData获得<br>
char* pData=(char*)sa->pvData;</p>
</blockquote>
<p>使用这种方法可以把MSComm传输的任何数据都以字节流处理。(即把数据转成CByteArray发送,从GetInput().parray->pvData获得)</p>
<p>(四)示例程序<br>
该程序使用两个MSComm控件分别控制COM1和COM2。COM1和COM2已连线的情况下,向COM1写数据(SetOutput),COM2的OnComm事件将会被触发,表示COM2的数据缓冲区已经收到数据,这时程序就可以自动去读COM2(GetInput),并将读到的数据显示出来。</p>
<p> 示例程序<a href="comm2.rar">下载</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -