论文部分内容阅读
1 引言
串口通讯是计算机与其他设备进行数据交换时经常使用的方法之一,他具有连接简单、使用灵活方便、数据传递可靠等优点,在工业监控、数据采集和实时控制系统中得到了广泛应用。当前的串口通信编程常用的方法主要有:使用VC++提供的MSComm控件实现串口通信、基于MFC框架实现串口通信、基于某个串口通信C++类、基于API的串口通信。这四种方法相比较,MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
2 ActiveX控件(MSComm控件)介绍
ActiveX是Windows下进行应用程序开发的崭新技术,它的核心内容是组件对象模型COM(Component Object Model)。Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件。具体地说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
(1) 事件驱动法
在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,MSComm控件将触发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。
(2) 查询方法
这种方法适合于较小的应用程序。在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性以检查执行结果或者检查某一事件是否发生。
3 在VC++中利用ActiveX控件进行串行通信的步骤
(1) 在当前的Workspace中插入MSComm控件
Project菜单→Add to Project→Components and Controls→Registered ActiveX Controls→选择Components: Microsoft Communications Control,version 6.0 插入到当前的Workspace中。
(2) 在MainFrm.h中加入MSComm控件
protected:
CMSComm m_ComPort;
在Mainfrm.cpp::OnCreare()中:
DWORDstyle=WS_VISIBLE|WS_CHILD;
if (!m_ComPort.Create(NULL,style,CRe
ct(0,0,0,0),this,ID_COMMCTRL)){
TRACE0("Failed to create OLE Communications Control\n");
return -1;
}
(3) 初始化串口
m_ComPort.SetCommPort(1);
m_ComPort.SetInBufferSize(1024);
m_ComPort.SetOutBufferSize(512);
if(!m_ComPort.GetPortOpen())
m_ComPort.SetPortOpen(TRUE);
m_ComPort.SetInputMode(1);
m_ComPort.SetSettings("9600,n,8,1");
m_ComPort.SetRThreshold(1);
m_ComPort.SetInputLen(0);
(4) 捕捉串口事项
MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。我们介绍比较实用的事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。
(5) 串口读写
完成读写的函数的确很简单,GetInput()和SetOutput()就可。两个函数的原型“VARIANT GetInput();”及“ void SetOutput(const VARIANT& newValue);”都要使用VARIANT类型(所有Idispatch::Invoke的参数和返回值在内部都是作为VARIANT对象处理的)。
无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式)。查阅VARIANT文档知道,可以用BSTR表示字符串,但遗憾的是所有的BSTR都包含宽字符,即使我们没有定义_UNICODE_UNICODE也是这样! WinNT支持宽字符, 而Win95并不支持。
4 结论
本文对Win32下VC++ 程序中使用MSComm串行通信ActiveX控件编程的方法做了探讨,显示了ActiveX技术的强大功能、充分的灵活性和易用性,具有一定的实践意义。
参考文献
[1]龚建伟,熊光明.VisualC++/TurboC串口通信编程实践[M].北京:电子工业出版社,2004.
[2]陈细军,谭民.VC编程中的串口通信技术.计算机应用,2001,(9).
[3]张筠,刘书智.VisualC++实践与提高(串口通信与工程应用篇)[M].北京:中国铁道出版社,2006.
[4]张雄飞,方方.Windows平台下数据采集(串口通讯的实现).计算机自动测量与控制,2001.
[5]刘鎏.用VisualC++实现计算机串行通信的几种方法[J].舰船电子工程,2006.
串口通讯是计算机与其他设备进行数据交换时经常使用的方法之一,他具有连接简单、使用灵活方便、数据传递可靠等优点,在工业监控、数据采集和实时控制系统中得到了广泛应用。当前的串口通信编程常用的方法主要有:使用VC++提供的MSComm控件实现串口通信、基于MFC框架实现串口通信、基于某个串口通信C++类、基于API的串口通信。这四种方法相比较,MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
2 ActiveX控件(MSComm控件)介绍
ActiveX是Windows下进行应用程序开发的崭新技术,它的核心内容是组件对象模型COM(Component Object Model)。Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件。具体地说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
(1) 事件驱动法
在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,MSComm控件将触发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。
(2) 查询方法
这种方法适合于较小的应用程序。在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性以检查执行结果或者检查某一事件是否发生。
3 在VC++中利用ActiveX控件进行串行通信的步骤
(1) 在当前的Workspace中插入MSComm控件
Project菜单→Add to Project→Components and Controls→Registered ActiveX Controls→选择Components: Microsoft Communications Control,version 6.0 插入到当前的Workspace中。
(2) 在MainFrm.h中加入MSComm控件
protected:
CMSComm m_ComPort;
在Mainfrm.cpp::OnCreare()中:
DWORDstyle=WS_VISIBLE|WS_CHILD;
if (!m_ComPort.Create(NULL,style,CRe
ct(0,0,0,0),this,ID_COMMCTRL)){
TRACE0("Failed to create OLE Communications Control\n");
return -1;
}
(3) 初始化串口
m_ComPort.SetCommPort(1);
m_ComPort.SetInBufferSize(1024);
m_ComPort.SetOutBufferSize(512);
if(!m_ComPort.GetPortOpen())
m_ComPort.SetPortOpen(TRUE);
m_ComPort.SetInputMode(1);
m_ComPort.SetSettings("9600,n,8,1");
m_ComPort.SetRThreshold(1);
m_ComPort.SetInputLen(0);
(4) 捕捉串口事项
MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。我们介绍比较实用的事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。
(5) 串口读写
完成读写的函数的确很简单,GetInput()和SetOutput()就可。两个函数的原型“VARIANT GetInput();”及“ void SetOutput(const VARIANT& newValue);”都要使用VARIANT类型(所有Idispatch::Invoke的参数和返回值在内部都是作为VARIANT对象处理的)。
无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式)。查阅VARIANT文档知道,可以用BSTR表示字符串,但遗憾的是所有的BSTR都包含宽字符,即使我们没有定义_UNICODE_UNICODE也是这样! WinNT支持宽字符, 而Win95并不支持。
4 结论
本文对Win32下VC++ 程序中使用MSComm串行通信ActiveX控件编程的方法做了探讨,显示了ActiveX技术的强大功能、充分的灵活性和易用性,具有一定的实践意义。
参考文献
[1]龚建伟,熊光明.VisualC++/TurboC串口通信编程实践[M].北京:电子工业出版社,2004.
[2]陈细军,谭民.VC编程中的串口通信技术.计算机应用,2001,(9).
[3]张筠,刘书智.VisualC++实践与提高(串口通信与工程应用篇)[M].北京:中国铁道出版社,2006.
[4]张雄飞,方方.Windows平台下数据采集(串口通讯的实现).计算机自动测量与控制,2001.
[5]刘鎏.用VisualC++实现计算机串行通信的几种方法[J].舰船电子工程,2006.