Windows 2K平台下多机通信卡
扫描二维码
随时随地手机看文章
摘要:在工业现场,监控系统经常采用RS-485/423/422通信标准。然而,在Windows2K平台下,复杂的多机通信和大数据量的传输会加重计算机的负担。作者采用自制的多机通信卡解决了这一问题。本文介绍了Windows2K平台下多机通信的基本原理,论述了多机通信卡的设计方法,进一步阐述了驱动程序设计的一般原则。
关键词:RS-485,单片机,多机通信,WDM
1引言
在电力监控系统中,为保证数据通信的可靠性,从机经常采用RS-485标准接口同主机进行通信。通常,主机是一台安装有Windows9X、WinNT或Windows2K等操作系统的计算机。从机为8051单片机系统,8051串行口的输入输出为TTL电平,抗干扰性较差,只能在几米的范围之内传输数据。
为了增强抗干扰性,提高串地通信的可靠性,增加传输距离,必须采用标准串行总线接口。若将串行口的输入输出电平转换成目前流行的RS-485标准串行总线接口,那么主机也必须完成相应的RS-485转换接口。普遍采用的做法是给计算机外接一个RS-485/232转换接口卡,利用现有的RS-232接口完成主机同从机之间的通信。
在单机通信的情况下,这种做法是可以的。但是在多机通信中,实现起来非常麻烦,而且会大量占用计算机CPU的时间。下面介绍Windows平台实现通信的几种基本方式,以及开发多机通信卡的方法和技巧。
2Windows平台下多机通信方式
利用计算机的串行通信适配器,其核心为可编程异步收发器UART8250芯片,8250由10个可寻址寄存器供CPU读/写,实现与外界的数据通信,制动通信协议和提供通信状态信息。这样,可以满足单机通信的要求。
8051单片机的串行通道是一个全双工的串行通信口,既可以实现双机通信,也可以实现多机通信。当串行口工作在方式2或方式3时,若特殊功能寄存器SCON的SM2由软件置为“1”,则为多机方式;若SM2置为“0”,则为9位异步通信方式。
在多机通信时,8051的帧格式是11位,其中第9位是SCON中的TB8,它是多机通信时发送地址(TB8=1)或发送数据(TB8=0)的标志。
计算机的串行通信接口芯片8250并不具有多机通信的功能,也不能产生类似8051的TB8。为了完成多机通信的功能,一般的实现方式是:
计算机给每台8051单片机系统发送9位数据,查询是否有要发送的数据,并等待应答。若有,则接收数据;没有,则继续查询下一台。由此可以看出,这种通信方式速度是很慢的(如果有一台8051长时间没有响应,则耗时更长),而且也并不可靠,从机的台数越多则计算机的资源浪费就会越严重。这种实现方式效率不高,不能满足我们的通信要求。
因此,直接利用计算机串口的方式进行通信是行不通的。为了尽可能减轻CPU的负担,采用自行设计的智能通信卡,利用中断方式的通信(这里指的是从机与通信卡之间的通信方式),来解决这个问题。
3通信卡与多个8051通信的原理
为完成异步串行通信,首先就需要实现异步收发器的功能,其次还要实现多机通信时发送的帧格式。考虑到8051除了实现异步收发的功能外,还可以编制控制程序,使用起来更加灵活、方便,因此,用8051来实现异步收发器。为了提高通信速度,从机与通信卡之间采用中断通信方式。
具体的实现方案如图1所示。
图示的这种硬件结构,使从机解放出来,平时不必处于监听状态。当计算机要求通信时,可以利用多机通信卡的处理器向从机发出中断信号,即通信卡通过3487(TTL电平转换为RS-485电平),从机通过3486(RS-485电平转换为TTL电平)进行从机中断信号联系。从机进入中断服务程序后,则关闭外部中断,保护现场,监听主机发送的地址信号,并对其进行识别,如果与本机地址相符,取消监听,进入通信状态。
通信卡与计算机进行通信是通过数据接口和译码电路实现的。该接口卡利用中断方式与计算机通信,即通信卡向计算机发出中断请求,计算机接收到相应中断请求后,执行数据收发的任务。其中,计算机对通信卡的访问是利用内存映射方式实现的。
4通信卡设计
该通信卡基于ISA总线工业标准。它的设计主要分为三个部分:地址译码电路、数据接口电路和控制逻辑电路。
(1)地址译码电路
由于采用的是端口统一编址的方式(也就是给每一个I/O端口分配一个存储器地址),I/O端口的寻址信号由地址总线通过译码得到。CPU用存储器读写指令对I/O接口进行读写,此时,I/O端口的读写操作控制信号采用存储器读(MEMR)和存储器写(MEMW)信号。而在通信卡上为实现内存映射就必须完成相应的译码转换,也就是将对应的双口RAM地址与分配的地址空间对应起来,实现地址的转换。
实现时,采用动态配置内存映射设备,改变内存映射端口的地址也相对方便,比老式的ISA[1]接口用跳线配置要优越些。该双口RAM为8K,但计算机能够访问的只有4K。其中CTRL线是8KRAM的控制线,通过该线可以实现“乒乓”结构[1]的数据传输。
(2)数据接口电路
数据接口电路实现数据线的驱动功能。尽管很多计算机主板的数据总线都经过驱动,但为了确保可靠性,数据总线不应直接与双口RAM相连接,而是通过数据驱动器件与数据线相连。
(3)控制逻辑电路
控制逻辑电路是与计算机通信的核心部分,该部分主要是实现“乒乓”结构的硬件控制部分。当存储器中的RAM达到HALFREADY(半满状态)时发出中断申请实现数据的传输,同时,将CTRL状态取反,使得计算机访问的是其中的一半,即实现了数据传输的“乒乓”结构。此外,数据的读写控制也通过控制逻辑实现。
89C52实现与从机多机通信,同时将得到的数据存入双口RAM中,控制逻辑协调RAM的数据读写工作。
5设备驱动程序的设计
在Windows9x下的VxD(虚拟设备驱动程序)相比,Windows2K下的WDM(Windows设备驱动模型)驱动程序要复杂一些。
WDM驱动程序是分层的,不同层上的驱动程序有着不同的优先级[2]。此外,WDM还引入了FDO(功能设备对象)与PDO(物理设备对象)两个新类来描述硬件。[!--empirenews.page--]
在开发驱动程序过程中,使用了DriverStudio中的DriverWorks工具用来创建WDM框架。
DriverWorks提供用于访问内存映射地址的类KmemoryRange和KmemoryRegister。实现步骤如下:
(3)在初始化成功后,可以调用类KmemoryRange的成员函数实现对内存映射地址寄存器[2]的访问。
在驱动程序的开发中还涉及到硬件中断的处理。具体地说,首先安装一个中断服务例程(ISR),当相应的中断发生时,内核调用它的中断服务例程。中断服务例程的第一个工作是判断该中断是否由自己的设备产生。如果不是,则返回FALSE,交给其他的中断服务例程;如果是,则处理该中断,并返回TRUE。
同样,DriverWorks提供Kinterrpt和KdefrredCall类处理中断。具体编程如下:
6结束语
由于在接口卡中采用了89C52芯片完成数据收发工作,同时协助主机进行信号的处理,这在很大程度上减轻了主机的负担,加速了I/O操作。在驱动程序的编制上,采用了WDM驱动模型,这样可以很方便地将程序移植到任何支持WDM模型的操作系统中去。