温度监控系统的设计(一)(5)

;在开发PC上位机的通信程序中,人们常用的编程语言可分为3类:(1) 直接面向底层硬件的汇编语言。(2) DOS环境下的高级编程语言,如: C语言等。(3) Windows环境下的高级编程语言,如:VC++等。而在这3种方式中Windows环境下的串口编程以其设备无关性,可移植性以及界面友好等特征而得到广泛应用。同时在Windows操作系统已经占据统治地位的情况下,欲开发良好的通信程序,利用Windows环境下的高级语言已渐成为必然的选择。
开发Windows环境下的串口通信程序主要有以下2种方法:
 (1) 利用Windows API(Application Program Interface)用户程序接口函数;
 (2) 利用ActiveX控件;
后者的主要特点是简单易学,但前者的功能更为强大控制手段更为灵活。

6.3.2 PC软件通信方式的选择
 在Win32环境下串行通信有两种:主要方式即同步方式,异步方式两种方式有各自的特点。在软件设计时应根据实际情况选择合适的方式。
(1)同步方式
 在同步方式中,读串口的函数试图在串口的接收缓冲区中读取规定数目的数据,直到规定数目的数据全部被读出或设定的超时时间已到时才返回。例如:(以C++ Builder编程语言为例下同)
……………………
……………………
COMMTIMEOUTS cto;
int timeConstant, timeMutiplier;
cto.ReadTotalTimeoutConstant = timeConstant; //设置总超时常数
cto.ReadTotalTimeoutMultiplier = timeMutiplier; //设置总超时系数
SetCommTimeouts(m_hFile,&cto); //超时设置
…………………………
…………………………
ReadFile (hComport,inBuffer,nWantRead,&nRealRead,NULL);//读串口
…………………………
…………………………
COMMTIMEOUTS结构用于设置超时,指定读写函数的等待时间
在ReadFile 函数中hComport 为待读串口句柄;inBuffer 为输入缓冲区大小;nWantRead 为每次调用ReadFile 时,函数试图读出的字节数;nRealRead 为实际读出的字节数;最后一个参数值NULL 代表ReadFile将采用同步文件读写方式。
(2)异步方式
 异步方式中,利用Win32 的多线程结构,可以让串口的读写操作在后台进行,而应用程序的其它部分在前台执行例如:
……………………
……………………
……………………
CreateFile(lpszPort, //打开串口
GENERIC_READ|GENERIC_WRITE,
0,
0,
……………………
……………………
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, //允许异步操作
0);
OVERLAPPED lpOverlapped;
COMMTIMEOUTS cto;
int timeConstant, timeMutiplier;
cto.ReadTotalTimeoutConstant = timeConstant; //设置总超时常数
cto.ReadTotalTimeoutMultiplier = timeMutiplier; //设置总超时系数
SetCommTimeouts(m_hFile,&cto); //超时设置
lpOverlapped.hEvent=CreateEvent (NULL.TRUE,FALSE,NULL);
……………………
……………………
……………………
ReadFile (hComport,inBuffer,nWantRead,&nRealRead,&lp Overlapped); //读串口
……………………
lpOverlapped 是1个OVERLAPPED 结构变量,OVERLAPPED 结构用于指出读写操作与其它操作的重叠为了实现线程间同步与通信,上面的代码中用CreateEvent 函数产生1 个人工复位事件,并将其句柄赋予lpOverlapped的hEvent成员这样,在异步读写完成时,Windows95发送该事件信号。
(3)两种方式的比较
 异步方式利用多线程结构来监视通信设备,其最大优点是程序对接收数据具有自主觉察能力。一旦通信线程查询到数据已发送到串口上,线程自动向应用程序发送一个数据接收到的消息,应用程序可用该消息来读取通信设备传来的数据。并且使用通信线程还不占用CPU时间,这样系统实际上具有了同时控制多个通信设备(如MODEM)的能力。因此在对系统强壮性要求较高的场合下应采用异步方式。
 异步方式的优点也恰是同步方式的缺点。使用同步方式时容易发生线程阻塞,从而使系统性能下降。但在某些场合下,该缺点可以通过一些措施尽可能地减小,而其简单易用的优点却是很好地体现出来。如果不考虑Win95的进程和线程的问题,仅在串口有数据时,去读串口缓冲区就可以了。此时确定串口读取的时机,握手协议及软件纠错的实现是程序员应考虑的主要问题,也是减小线程阻塞所带来的负面影响的主要措施。
可以采用同步转输方式的场合有如下一些特点:
 ① 何时转输数据由PC机来决定,下位机只是被动接收并执行命令。
 ② 有限时间内,PC机命令可以执行完毕并返回结果。而不会使PC机处于长时间等待。
 ③ 每次所转输的数据的长度是已知的,所转输的数据量是有限且比较小。
我们在开发串行通信程序时,分别应用这两种方式开发都获得了成功。鉴于应用异步方式的安全性和普遍性

6.3.3具体实现方法
下面以C++ Builder为例,叙述PC机通信软件的实现过程:
(1)打开串口
 在Win32中,串口和其他通信设备是作为文件处理的。串口的打开并闭读取以及写入所用的函数与操作文件的函数相同。
通信会话由调用CreateFile 函数打开串口开始,CreateFile 以读访问权限,写访问权限或读写访问权限“打开串口”并设定了对其是异步操作方式。还是同步操作方式调用该函数打开串口进行读写操作的例子如下:
mHandle = CreateFile(lpszPort, //串口名
GENERIC_READ|GENERIC_WRITE, //允许读/写
0, //独占方式串口不能共享
NULL, //安全性属性一般设为0
OPEN_EXISTING, //串口是已存在的不能建新端口
lpOverlapped, //异步方式
0 //串口无模板文件应设为0
);
如果调用成功函数返回串口的句柄赋给Handle,如果调用失败则函数返回INVALID_HANDLE_VALUE。
(2)初始化串口
 对串口的初始化工作包括对波特率,数据位,停止位,奇偶校验位I/O 缓冲大小以及超时等参数的设置。在调用API 函数进行串口初始化时,波特率

温度监控系统的设计(一)(5)相关推荐