一、MSComm控件简介:
关于MSComm控件的资料请参考:http://msdn.microsoft.com/en-us/library/aa259393(v=VS.60).aspx
MSComm(Microsoft Communications Control)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串口收发数据的简便方法。MSComm控件提供了以下两种用于通信的方法:
1.事件驱动(Event-driven )方法:
事件驱动方法是用于串口交互的一种非常有效的方法。许多情况下,事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或 Carrier Detect (CD)或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。 OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。 在编程过程中,可在 OnComm 事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。
2.查询方法:
查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“ 确定 ”响应。
每个 MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。我们可以从Windows的控制面板来修改这些串口地址和中断地址。
虽然MSComm控件有许多重要属性,但首先需要熟悉下面几个:
(1)CommPort属性 (Integer)
void CMSComm::SetCommPort(short nNewValue);
short CMSComm::GetCommPort();
这一属性设置并返回连接的串行端口号,Windows将会利用该串口和外界通信。在设计时,nNewValue可以设置成从1~16的任何数(默认值为1)。但是如果用PortOpen属性打开一个并不存在的端口时,MSComm控件会产生错误68(设备无效)。
注意:必须在打开端口之前设置CommPort属性。
(2)Settings属性
void CMSComm::Settings(LPCTSTR lpszNewValue);
String CMSComm::GetSettings();
该属性用于设置并返回数据传输速率、奇偶校验、数据比特、停止比特参数。当端口打开时,如果value非法,则MSComm控件产生错误380(非法属性值)。其中lpszNewValue用字符串表示,由四个设置值组成,有如下的组成格式:“BBBB,P,D,S”,BBBB为数据传输速率,P为奇偶校验,D为数据比特,S为停止比特。Value的默认值是:“9600,N,8,1”.
传输速率可以是:110、300、600、1200、2400、4800、9600、14400、19200、28800、38400、56000、57600、115200、12800、25600
奇偶校验可以是:E偶校验(EVEN) ,M标号校验(MARK) ,N无校验(NONE) ,O奇校验(ODD) ,S空格校验(SPACE)
数据比特数可以是:4、5、6、7、8
停止比特数可以是:1、1.5、2。
注意:只有当通信的双方的Settings属性值都一样时,通信连接才能生效。
(3)PortOpen属性
void CMSComm::SetPortOpen(BOOL bNewValue);
BOOL CMSComm::GetPortOpen();
用于打开或者关闭串口。bNewValue设为TRUE,打开串口;设为FALSE关闭串口。
一般情况下在程序开始时打开端口,在程序结束时关闭端口。当应用程序终止时,MSComm控件将自动关闭串口。在打开串口前,确定CommPort属性调协为正确的串口号。而且,用户的串口设备必须支持Settings属性中的设置。如果硬件设备不支持Settings属性中的一些设置,则硬件工作或许不正确。
(4)Input属性
VARIANT CMSComm::GetInput();
表示从接收缓冲区移走一串字符,将缓冲区中收到的数据读入变量。属性值为VARIAN型变量。该属性在端口未打开时不可用,在运行时是只读的。
注意:当InputMode属性值为0时(文本模式),变量中含String型数据。当InputMode属性值为1(二进制模式),变量中含Byte型数组数据。
(5)Output属性
void CMSComm::SetOutput(const VARIANT & newValue);
Output属性用于向发送缓冲区写数据流。属性为VARIANT变量。该属性在端口未打开时不可用,在运行时只是写的。
注意:Output属性可以发送文本数据或二进制数据。传输文本数据时,应该将字符型 数据放入VARIANT变量中;传输二进制数据(即按字节传送)时,应将字节型数据放入VARIANT型变量中。如果通常给应用程序发送ANSI字符串,可以以文本方式发送。如果数据包含了内嵌控制字符、NULL字符等,必须将其作为二进制传递过去。
二、MSComm控件应用的例子(VS2005):
1、新建一个基于对话框的项目,在资源管理器中做出下面的对话框,对话框内右键选“插入ActiveX控件”,对话框内出现个像电话的控件,这就是MSComm控件了!
左图是添加到对话框的MSComm控件的属性值
2.具体源代码