VC实现串行通讯的三种途径

日期:2016-08-07 16:46:30编辑作者:申博亚洲
介绍了串行通讯的基本原理,以及在Win98,Win2000环境下实现串行通讯的三种方法,并给出了用Visual C++6.0编写的相应的应用程序。
关键词:VC,串行通讯,CserialPort类,Win API
 
 
随着计算机系统的应用和微机网络的发展,计算机同外设间的通讯功能越发显得重要。其中,串行通讯因具有连接简单、使用灵活方便、数据传递可靠等优点,在工业监控、数据采集和实时控制系统中得到了广泛的应用。
1 串行通讯的基本原理
所谓“串行通讯”是指外设和计算机间使用了数据线、控制线和地线,数据在数据线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。这种通讯方式使用的数据线少,在远距离通讯中可以节约通讯成本,当然,其传输速度比并行传输慢。计算机与外部设备进行数据交换往往采用RS-232进行接收,上传数据和指令,如图1所示。
 
 
 
在Windows环境(Win98、Windows2000)下,串口是系统资源的一部分。应用程序要使用串口进行通讯,必须在使用之前向操作系统提出资源申请要求,即打开串口,通讯完成后必须释放资源,即关闭串口。
2 利用MSComm控件
2.1 简介MSComm控件
MSComm控件在编程时非常方便,而且在VC、VB、Delphi等语言中均可使用。MSComm是Microsoft公司提供的简化Windows串行通讯编程的ActiveX控件,它为应用程序提供了处理串行通讯的两种方法:一是数据驱动方法,一是查询法。
2.2 编程实现
在使用MSComm控件开发失重秤采样显示的程序中,采用了事件驱动法,这种方法是在接收到数据时触发事件并获取缓冲区的数据,下面是其实现程序:
第一步,利用MFC向导建立基于对话框的应用程序CcommDlg,在项目中插入Mscomm控件。
第二步,初始化MSComm控件的参数,现场采样与计算机进行串口通讯时采用8个数据位、1个停止位,无校验,波特率9600。其中,编辑框m_sDisplay用来显示所得数据,数据以*开始,以$结束,主要如下:
    首先,要在CCommDlg.h头文件中包含#include“MSComm.h”,在类中定义public CMSComm m_

第三步,对话框建立响应MSComm事件的处理函数,每当MSComm控件触发事件时该函数将被调用。这个函数是用来处理串口消息事件的,每当串口接收到数据,就会产生一个串口接收数据的消息事件,我们在OnComm()函数中加入响应的处理代码就能实现自己想要的功能了:


}//当然这只是个非常简单的示例,我们可以在这里假如我们需要的复杂的通讯任务
}
第四步,发送数据,先加入一个处理函数,在事件中加入如下的程序,其中,m_strSend是所要发送的Cstring变量。在处理函数中加入:
3 利用CserialPort类进行串口通讯
3.1 选用CserialPort类
的确,使用MSComm控件非常方便,但如果要控制复杂的系统,需要使用多个串口,MSComm控件就有许多不便,这种情况我们就可以选用CserialPort类,这是rimon spekreijse写的一个串口类,可以从下面网址下载:
        http://codeguru.earthweb.com.network.serialport.shtml
3.2 编程实现
同样,我们用开发失重秤采样显示的程序来说明怎样使用此类,数据通讯的过程也使用了起始标志*和结束标志$。
第一步,建立一个基于单文档的MFC应用程序CcommView,将CserialPort.h和CserialPort.cpp两个类文件复制到工程文件夹中,用project-add to project-files命令将上述两个文件加入工程。并在CcommView.h中将头文件中包涵文件CserialPort.h,#include”SerialPort.h”;
第二步,人工增加串口消息响应函数:OnCommunication(WPARAM ch.LPARAM port)
首先,在CcommView.h中加入串口接收的响应函数声明,由于没有自动的消息映射机制,我们必须在消息映射机制的标志处手工添加:



        第四步,在OmCommunication(WPARAM ch,LPARAM port)函数中进行数据处理,每当串口接收缓冲区内有一个字符时,就会产生一个WM_COMM_RXCHAR消息,触发OnCommunication函数,这样,就可以在函数中进行数据处理。


4 使用API通讯函数
4.1 用Win API函数对串口进行操作
在Win API函数中对串口进行操作不是对端口进行直接读写的,而是把所有的设备都看成是文件,从而进行相应的文件操作。
4.2 编程实现
        第一步,在MainFrm.cpp定义全局变量HANDLE hCom;//准备打开的串口的句柄HANDLE hCommWatchThread;//辅助线程的全局函数
    第二步,打开串口,设置串口hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);//这里,我们使用FILE_FLAG_OVERLAPPED结构,这正是使用API函数实现非阻塞通讯的关键所在。

第三步,启动一个辅助线程,用于串口事件的处理。这里用它来监视串口状态,主线程则可专心进行数据处理。

        第四步,要为辅助线程写一个全局函数,主要完成数据接收的工作。



5 结束语
VC开发系统从底层到上层直接面向用户,而且具有强大的调试功能,因此,越来越多地被广大的程序员使用。过程控制领域中,和串口打交道是不可避免的,用这三种方式基本可以完成串口通讯的问题,但我们要根据不同的需要选用不同的方法,使我们的程序精巧且实用,这三种方法在我们的失重秤测控系统、齿轮箱扭矩监控系统和心电仪设备的初步研究中都一一得到了验证。

相关文章

http://www.jinyuankj.com/vc/20160807/36.html

VC++实现对远程计算机屏幕的监视

 在实际工程中,经常有施工现场和控制中心不在一起的情况,在这种情况一般多由工程技术人员往返穿梭其间来实现对远程施工现场的情况了解和 ..

发布日期:2016-08-07 详细>>

http://www.jinyuankj.com/vc/20160807/33.html

用VC++编程控制计算机和光驱

通常有些程序在初次使用使用时,要进行一些象安装特定字体的设置,之后需要重新启动计算机使之生效;而在一些多媒体软件编程中会用到用程序 ..

发布日期:2016-08-07 详细>>

VC6.0编写C/S消息传送程序

网络编程已经成为一种时髦,以TCP IP协议的网络更为流行 自己编一个服务器与客户机互相传送消息的程序,以便增加自己网络编程的经验 下面我 ..

发布日期:2016-08-07 详细>>

VC++动态链接库编程之DLL典型实例

动态链接库DLL实现了库的共享,体现了代码重用的思想。我们可以把广泛的、具有共性的、能够多次被利用的函数和类定义在库中。这样,在再次 ..

发布日期:2016-08-07 详细>>

使用VC6进行ADO编程,使用SQL SERVER 2000+WINDOWS SERVER 2003+VC6(第四部分)

目的是将SUN等服务器产生的日志文件--文本格式,写入到SQL Server数据库,实现功能为:1 修改源日志格式为以逗号分割字段,写入成一个新的 ..

发布日期:2016-08-07 详细>>