3、系统组成及功能
本系统采用分布式上下位机结构,上位机以Windows和PC机作为软硬件资源,下位机由MOTOROLA单片机MC68HC908GP32控制。上下位机之间采用RS232通讯,实现数据交换。利用串行通信的方式,将现场采集的数据交由计算机进行处理,实现对现场设备的监测和控制。各组成部分功能如下:
3.1上位机
以工业PC机、Windows操作系统及支持串行通讯程序的监控软件作为软硬件环境;
3.2下位机
采用MOTOROLA公司生产的高性能CMOS单片机MC68HC908GP32。MC68HC908GP32IDK在线编程开发系统是基于MC68HC908GP32的开发应用系统,它由核心子板和目标评估母板两部分组成。将目标评估母板作为本系统下位机的硬件接口板,利用目标评估母板上的可编程串行通信接口SCI即可实现MOTOROLA单片机与PC机的串行通信。
在使用串行通信接口SCI之前,应对其进行初始化,主要包括波特率寄存器(BAUD)、串行通信数据寄存器(SCDR)、串行通信控制寄存器(SCCR)、串行通信状态寄存器(SCSR)初始化。其中,串行通信状态寄存器SCSR为产生SCI系统中断逻辑电路提供输入信号。对单片机的编程采用汇编语言,其接收和发送子程序如下:
GETD: BRCLR 5,SCSR,GETD;//接收子程序 LDA SCDR RTS SEND: BRCLR 7,SCSR,SEND;//发送子程序 STA SCDR RTS |
4、上位机串行通信程序
在Windows环境下,利用Visual C++6.0实现串行通信主要有两种编程方法:
(1) 使用Windows Visual C++6.0 ActiveX控件;
(2) 调用Windows的API函数。
第一种方法虽然简单易用,但由于必须拿到对话框中使用,在一些需要在线程中实现通信的应用场合,控件的使用显得捉襟见肘。而且这种方法经常发生数据丢失的情况,不能满足实时系统的需求。第二种方法要复杂一些:API是附带在Windows内部的一个极其重要的组成部分。Windows的32位API主要是一系列很复杂的函数、消息的集合,它可以看作是Windows系统为在其下运行的各种开发系统提供的开放式通用功能增强接口。调用API函数,既能保证数据的完整,又可以让我们清楚地掌握串口通信的机制,熟悉各种配置和自由灵活采用不同的流控进行串口通信。所以,在本系统中通过调用API函数来实现串行通信。
4.1程序设计思路
串口通信应用程序设计的总体思路是:首先,确定要打开的串口名、波特率、奇偶校验方式、数据位、停止位,传递给CreateFile()函数打开特定串口;其次,为了保护系统对串口的初始设置,调用GetCommTimeouts()得到串口的原始设置;然后,初始化DCB对象,调用SetCommState()设置DCB,调用SetCommTimeouts()设置串口超时控制;再次,设置串口接发送数据的缓冲区大小,串口的设置就基本完成,之后就可以用ReadCommBlock/WriteCommBlock来读/写串口了。
一般来说,串口的读写由串口读写线程完成,这样可以避免读写阻塞时主程序死锁。本程序是对于全双工的串口读写,所以分别开启读线程和写线程。
4.2编程技术细节
图1为本程序的编程步骤。
4.2.1打开串行口
在Windows下,串行口作为文件处理,使用文件操作对串行口进行处理。调用CreateFlie打开串口,如果成功,返回一个操作句柄,该句柄供随后对串行口的设置、读写等操作用。
if ((COMDEV( npTTYInfo ) = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, //对串口可进行读写操作 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // 采用异步方式读写串口 NULL )) = = (HANDLE) -1 ) return ( FALSE ) ; //若打开串口失败,异常错误 else //打开串口成功,继续下面的操作 |