介绍了串行通讯的基本原理,以及在Win98,Win2000环境下实现串行通讯的三种方法,并给出了用Visual C++6.0编写的相应的应用程序。
}//当然这只是个非常简单的示例,我们可以在这里假如我们需要的复杂的通讯任务
}
第四步,在OmCommunication(WPARAM ch,LPARAM port)函数中进行数据处理,每当串口接收缓冲区内有一个字符时,就会产生一个WM_COMM_RXCHAR消息,触发OnCommunication函数,这样,就可以在函数中进行数据处理。
第四步,要为辅助线程写一个全局函数,主要完成数据接收的工作。
关键词: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_
首先,要在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函数实现非阻塞通讯的关键所在。
第二步,打开串口,设置串口hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);//这里,我们使用FILE_FLAG_OVERLAPPED结构,这正是使用API函数实现非阻塞通讯的关键所在。
第三步,启动一个辅助线程,用于串口事件的处理。这里用它来监视串口状态,主线程则可专心进行数据处理。
第四步,要为辅助线程写一个全局函数,主要完成数据接收的工作。
5 结束语
VC开发系统从底层到上层直接面向用户,而且具有强大的调试功能,因此,越来越多地被广大的程序员使用。过程控制领域中,和串口打交道是不可避免的,用这三种方式基本可以完成串口通讯的问题,但我们要根据不同的需要选用不同的方法,使我们的程序精巧且实用,这三种方法在我们的失重秤测控系统、齿轮箱扭矩监控系统和心电仪设备的初步研究中都一一得到了验证。
参考文献
1 David J.Kruglinski.Visual C++技术内幕.北京:清华大学出版社,1999
2 Kate Gregory.Visual C++开发使用手册.北京:机械工业出版社,1999
4 (美)Marshall Braint,Lance Lovette.MFC开发人员指南.北京:机械工业出版社,2000
5 姚燕南,薛匀义.微机原理.西安:西安电子科技大学出版社,1998
评论
查看更多