本发明涉及数据传输系统,特别是通过对从数据通信设备来的数据流进行控制,从而防止串行数据丢失的方法和装置。 目前有许多软件程序和硬件装置可用来完成异步串行通信。一种典型的在主机上的异步通信应用包括两部分功能实体:中断服务程序(ISR),每当从串行端口接到中断命令时,就执行该程序;应用程序取出从ISR收到的字符并执行所请求的操作。
主机接收一个字符一般经历以下过程:由一个远处的发送器,例如一个调制解调器的接收部分,产生字符,再将字符送至一个串行通信插板,把串行数据格式流变成并行数据格式字符,并且放入一个串行通信插板缓冲器。然后串行插板向主机发出信号,并带有一个中断命令,这样主机就准备读出从串行插板来的字符。在串行插板接收另一个字符并将其放入缓冲器之前,主机读出从串行插板缓冲器来的这个字符的最长时间为1/传送字符速率。例如,如果包括开始位和结束位,每个串行字符需要10位,而且每秒传送9600位(9600bps)或960字符/秒,那么在字符丢失之前,主机只有(11960)秒(1.04毫秒)的时间去读出该字符。如果主机没有及时读出该字符,该字符就会在串行插板缓冲器中被下一个字符所改写,这被认为是“损失”。在更快的数据传输速率的情况下,时间限制变得更为严格:传输速率为19200比特/秒,主机有0.52毫秒的时间去读出字符;传输速率为38400比特/秒,读出时间降至0.26毫秒。
当主机接收到中断命令时,不论它正在做什么,都必须立即停止,去读出从串行插板传过来的字符。这是通过执行串行插板ISR做到的。ISR有一系列任务去完成。一般情况下,它首先禁止中断,以便防止另一中断命令抢先占取ISR。然后,ISR必须询问串行插板,确定引起中断的原因。一旦确定是一个新来地字符引起中断时,主机必须检验串行插板既没有检测出奇偶错误,又没有检测出超限错误,然后从串行插板中读出字符(于是清除中断),并且再将该字符存入一个随机存取存储器(RAM)缓冲器中,以备今后使用。如果RAM缓冲器即将占满,那么ISR会向远处的计算机发出停止传送数据的信号。此外,ISR可以恢复中断,以便其它设备能够由它们自己的ISR服务。
用于异步串行通信的硬件设备一般包括一台通用异步接收发送器(UART),此如由加利福尼亚Santa Clara的National Semiconductor制造的8250、16450和16550A。软件程序通常设计用来支持一个特定类型的UART。16550AUART具有一个16字节的缓冲器,它不需要对UAUART产生的中断命令立即引起注意。然而,主机必须使UART运行的速度足够高,以便防止缓冲器的空间被占满,否则数据将丢失。
防止数据丢失的典型方法是采用数据流控制:软件程序向远处的发送器发出停止数据输出的信号,直到主机抓住存储在缓冲器中的数据为止。一般情况下,数据流控制使DTR(数据终端就绪)或串行插板的RTS(请求发送)行处于“尚未就绪”状态,以便停止从远处的发送器发来的串行数据流。此外,几个数据传输协议经ASCⅡ命令,比如XON或XOFF,提供数据流控制。
采用这一方法存在着问题,因为计算机等待时间太长,比如在多任务系统中,这可能使向远处发送器发信号的速度减慢。在对该信号做出响应之前,远处的发送器也可能发出一个或多个字符。结果,整个反应时间太慢,以致于不能在数据丢失之前停止数据流。
因此,需要有一种串行数据流控制方法,它能向远处的发送器发出信号,及时停止数据流,防止数据丢失。
还需要有一种方法和装置,它能自动控制串行数据流,而无需应用程序的干预。
本发明提供了一种方法和装置,利用它可以向数据通信设备中的一个远处的发送器发出停止数据流的信号,而无需应用程序的干预。本发明是用于主机中的异步串行通信适配器插板的一部分。本发明的最佳实施例包括一个16550AUART,一个被用来揭示允许或禁止自动数据流控制的微处理器,执行自动数据流控制的电路,以及使微处理器允许或禁止自动数据流控制的门电路。
UART具有信号BAUDOUT,它是一个16倍波特率的时钟信号。UART还有一个反向信号-RXREADY,当UART16字节FIFO(先进先出)缓冲器中至少存在一字节的串行数据时,它能变成低电位。本发明采用这两个信号和一个计数器来对数据流进行控制。当-RXREADY信号变成低电位时,计数器对BAUDOUT信号计数。当计到一个预定的数目、FIFO缓冲器未被腾空时,计数器产生一个输出信号,它使计数器停止计数。这一输出使DTR/或RTS信号不再送至远处的发送器,这就向发送器发出停止发送数据的信号。这样,计数器的输出使得远处的发送器停止数据传输。
当从远处的发送器来的数据传输停止时,UARTFIFO就有一个由主机来将其腾空的机会。当FIFO腾空以后,-RXREADY返回高电位,于是对计数器清零。再次发出DTR和/或RTS信号,远处的发送器能够重新传输数据。
因此,当FIFO缓冲器一定比例的容量被占用时,本发明能自动向远处的发送器发出停止发送的信号,而一旦FIFO缓冲器全部腾空之后,它又能发出信号,恢复发送。这使得主机不用管理数据流控制。
本发明还能让使用者决定是允许自动数据流控制还是禁止自动数据流控制。将QII输出信号阻塞就能禁止自动数据流控制。
本发明进行自动数据流控制时,还允许主机直接禁止DTR和/或RTS信号,通知远处的发送器,停止发送。
因此,本发明的目的是提供一种方法和装置,利用它可以自动控制由一个远处的发送器发送的串行数据流,而无需主机中的应用程序的干预。
本发明的另一个目的是通过控制由一个远处的发送器发送的串行数据流,防止串行数据的丢失。
本发明的第三个目的是提供一种允许或禁止装置对由一个远处的发送器发送的串行数据流进行自动控制的方法。
本发明的最后一个目的是在进行自动数据流控制时,仍然允许主机向远处的发送器发出停止发送数据的信号。
图1是本发明的最佳实施例在其最佳环境中的示意图。
图2是数据流控制器的另一实施例。
图3是本发明的最佳实施例的工作流程图。
现在来看附图,图中同样的标号代表同一部件。图1是本发明的最佳实施例在其最佳环境中的示意图。主机10经主机总线12与一个双通道异步串行通信插板11相连,主机总线12代表主机地址总线、数据总线和控制总线。插板11装在主机10的一个扩展槽里。插板11包括一个主机数据缓冲器13,两个并行/串行变换器,例如通用异步接收发送器(UARTS)14和15或通用同步异步接收发送器(USARTS),两个数据流控制器150和180,两个串行端口行缓冲器16和17,两个串行端口连接器20和21,一个接口电路22,以及一个微处理器23。数据流控制器包括一个计数器151和门电路157~160。数据流控制器180与数据流控制器150完全相同,并具有同样的功能。
主机10可以仅仅使用UART14或UART15,或者同时使用二者。此外,一个UART,例如UART14,可以用作自动数据流控制,而另一个UART,例如UART15,可以用作标准数据流控制。应该注意,UART14和UART15具有共同的数据总线40,该总线把它们与主机数据缓冲器13和接口电路22相连。两个UART还有共同的地址/控制总线41,该总线把它们与接口电路22相连。主机数据缓冲器13和接口电路22经主机总线12与主机10相连。主机缓冲器13是一个双向缓冲器,它控制流向主机10和流出主机10的数据流。缓冲器13的操作由接口电路22经导线43和45控制。由于共同的总线40和41,所以主机10和微处理器23向这些总线输送数据、地址和控制信号的能力就要受到限制,否则,随着数据的丢失,就会产生总线争用问题。在本发明的最佳实施例中,接口电路22控制对主机10和微处理器23的访问,将结果经总线40和41送至数据流控制器150和180的UARTs。在该最佳实施例中,UARTs14和15是National Semiconductor NS16550,微处理器23是Intel 8031。
在最佳实施例中,接口电路22是由一个门电路阵列实现的。然而,如果需要的话,它也可以由一个微处理机来实现。对本领域的普通技术人员来说,在阅读了下面对接口电路22所完成的功能的描述之后,会很清楚地了解它的结构和工作情况。在最佳环境中,主机10是IBMPS/2,AT/PC,或其它的兼容机。在最佳环境中,串行端口连接器20和21和一个通信设备(图中未画出)例如调制解调器相连。串行端口连接器20和21最好是EIAPS-232-D串行接口。UARTs14和15对连接器20和21的串行数据格式的数据和总线40的并行数据格式的数据进行变换。缓冲器16和17完成标准的行缓冲功能和信号缓换功能。
插板11被设计成与现存的软件设备兼容,它期望能在一个预定的地址找到一个信号UART。然而,在最佳环境中,主机10包括驱动器软件,它使用插板11上的一个或两个UARTs以及由插板11提供的附加特性。一些这样的附加特性是:用于发送和接收两种方式的先进先出(FIFO)缓冲器,对串行端口连接器20和21上的到来的数据进行自动数据流控制,在主机10的存储器和插板11的FIFOs之间,对传输的数据进行直接存储器存取(DMA)。如果想了解更多的细节,读者可参阅共同未决美国专利申请 号、 号和 号(代理人案卷号分别为04050-1-0840,04050-1-0845和04050-1-0855),在这里可作为本申请的参考文件。
UART14的BAUDOUT和-RXREADY输出端分别经导线152和153与一个11位计数器151的时钟(CLK)输入端和复位(RST)输入端相连。计数器151的Q11输出端经导线156与计数器151的“非允许”(-EN)输入端相连,并且经导线156还与每个具有两个输入端的与门157和158的一个输入端相连。应该懂得,当-RXREADY为高电位(逻辑“1”),计数器151复位,Q11输出为低电压,与门157和158关闭,并使导线171和172上为低电位。当-RXREADY为低电位(逻辑“0”),计数器151将对导线152上的BAUDOUT脉冲计数,直至输出Q11为高电位。这时,计数器151不再计数,并维持输出高电位。Q11输出的高电位打开门电路157和158。因此,如果微处理器23使导线161或162的电位为逻辑“1”,那么门电路157或158的输出分别为高电位。导线161或162上的逻辑“0”分别关闭门电路157或158。
门电路157和158的输出端经导线171和172分别与具有两个输入端的或门160的一个输入端相连。UART14的“非数据终端就绪”(-DTR)和“非请求发送”(-RTS)输出端分别经导线154和155与门电路159和160的输出端分别经导线164和165与串行端口行缓冲器16相连。门电路159和160的输出分别为非DTR和非RTS信号,它们被串行端口行缓冲器16反相和缓冲,然后传给与串行端口连接器20相连的远处的数据通信设备的发送器(图中未画出)。
在最佳实施例中,自动数据流控制的过程如下所述。UART14包括一个16字节的先进先出(FIFO)缓冲器。UART14有一个信号-RXREADY,不管什么时候,只要从串行数据端口20向UART14FIFO缓冲器至少传送一字节未被主机读出的数据,-RXREADY就为低电位。UART14还有另一个信号BAUDOUT,它是一个16倍波特率的时钟信号。当-RXREADY为低电位,计数器151对BAUDOUT计数。当经过1024个BAUDOUT脉冲周期,而FIFO缓冲器空间未被腾空时,计数器151的Q11输出为高电位。对1024个BAUDOUT脉冲周期的计数器代表传送64位的时间,或者每字符10位、共传送6.4个字符的时间。在FIFO缓冲器溢出之前,至少还有9.6个字符的时间留给远处的与串行数据端口20相连的发送器作出反应。于是,在本发明的最佳实施例中,当FIFO缓冲器只占满40%时,数据流控制就开始了。必须说明的是,这些数值可作设计选择,而并非关键。
当计数值到达1024时,Q11输出端为门电路157和158提供一个开启高电位。如果微处理器23从“数据终端就绪1”(DTRI)经导线161向门电路157提供第二个开启高电位,从“请求发送1”(RTSI)经导线162向门电路158提供第二个开启高电位,那么门电路157和158分别输出高电位,且分别送入门电路159和160使之关闭,因此使它们的输出为高电位,在串行端口连接器20产生低电位的RTS和DTR信号。这样就向远处的发送器发出停止发送数据的信号,从而中断从串行数据端口20向UART14FIFO缓冲器的数据流。
当主机10已经全部处理完UART14FIFO缓冲器中的数据,以致FIFO缓冲器全部腾空时,-RXREADY转变成高电位。这使得计数器151读零,Q11输出返回低电位。门电路157和158的输出变为低电位,门电路159和160的输出也变为低电位,这使得连接器20的信号变为高电位,从而允许远处的发送器恢复向UART14FIFO缓冲器传输数据。
因此可以看出,不论什么时间,只要主机10不能跟上数据传输速率,计数器151的输出Q11将变高电位,从而使串行端口连接器20的DTR和/或RTS输出信号变为低电位,并向远处的发送器发出信号,停止发送。一旦主机10读出UART14缓冲器中的全部数据,-RXREADY信号变成低电位,因而使计数器151复位并使之保持,直至收到第一个字节,此时计数器151计数。如果主机10能以足够快的速率从UART14FIFO中读出数据,那么FIFO将以足够快的速率腾空,这使计数器151复位,防止输出Q11变为高电位。在这种情况下,不发出数据流控制信号。
如果由于某种原因,不需要自动数据流控制,那么使用者可以让主机10经接口电路22向微处理器23发出一条命令,使自动数据流控制不能进行。在这种情况下,微处理器23使导线161和162上的信号为低电位,从而关闭门电路157和158,并使门电路159和160完成非反相缓冲器的功能。然后,主机必须控制数据流,这是通过向UART14发出指令,使其在导线154和155上的-DTR和/或-RTS输出处于开始或停止数据流所需要的状态来实现的。
应该懂得,即使自动数据流控制不能进行,主机10仍能够让数据流停止,这是通过使UART14在导线154和155上的电位为高电位,从而向远处的发送器发出停止发送数据等一系列过程完成的。因此,主机10总是能够停止传输数据。
必环注意,连接器20的DTR和RTS线可以一起受到控制,或单独受到控制。此外,一条线,例如DTR线,可以在自动数据流控制之下,而另一条线在主机10的数据流控制之下。再者,UART14和数据流控制器150可以单独受UART15和数据流控制器180的控制。
现在来看图2,它是数据流控制器150或180的另一个实施例。不同之处在于计数器151没有“允许”输入端。在这种情况下,UART14的BAUDOUT信号通过导线152与具有两个输入端的与非门电路173的一个输入端相连。计数器151的Q11输出经导线156与反相器175的输入端相连。反相器175的输出经导线176与门电路173的另一个输入端相连,并且还同具有两个输入端的或非门177和178中每一个的一个输入端相连。门电路177和178的输出部分别与导线171和172相连。门电路173的输出经导线174与计数器151的“非时钟”(CLK)输入端相连。当输出Q11为高电位,则反相器175的输出为低电位,因此关闭门电路173,使时钟脉冲不能进入计数器151。于是计数器151保持其Q11的输出状态,直至导线153上的-RXREADY信号使计数器151复位。
门电路177的另一个输入端以及门电路178的另一个输入端分别经导线161′和162′与微处理器23相连。符号“′”表示其信号电平与图1中相应的信号电平相反。如果能进行DTR数据流控制,微处理器23将使导线161′为低电位。导线161′和176上的低电位使得门电路177的输出为高电位,这又使门电路159的输出为高电位。经串行端口行缓冲器16反相,串行端口连接器20上的信号通知远处的发送器停止发送。这样,图2的电路完成与图1的电路相同的功能。
现在来看图3,它是本发明的最佳实施例工作流程图。判断框190询问是否在FIFO缓冲器中至少还有一字节数据未被主机读出。如果答案是否定的,那么在步骤191中,计数停止并复位,DTR和RTS线有输出信号,并返回判断框190。如果答案是肯定的,那么判断框192询问FIFO容量的40%是否已被占用,占用容量的40%是数据流控制开始起作用的时间。如果缓冲器至少未被占用40%,那么在步骤193计数开始或继续。然后返回判断框190。如果缓冲器至少被占用40%,那么在步骤194计数停止,DTR和/或RTS数据线没有输出信号,并且从串行数据端口进入的数据流停止。然后判断框195判断缓冲器是否被腾空。如果答案是否定的,那么重复执行判断框195。如果答案是肯定的,那么执行步骤191重新开始数据流。
从以上说明可以看出,每当缓冲器腾空,则计数停止并复位。同样,如果那时缓冲器还没有被腾空,那么经过一个预定的计数之后,DTR和/或RTS线没有输出信号,从而停止远处的发送器发送数据。
因此还可以看出,没有主机的干预或不让主机知道仍可进行数据流控制。这种数据流控制能防止丢失主机通常无法迅速处理的数据。
通过以上说明可以懂得,本发明描述了一种在没有主机干预或不让主机知道的情况下对远处发送器发送的串行数据流进行自动控制的方法和装置。通过对远处发送器发送的这种数据流进行控制,本发明能防止丢失串行数据。本发明还提供了一种手段,它使装置能够或不能够对远处发送器发送的串行数据流进行自动控制。
还应该懂得,数据流控制器150和180可以作为接口电路222或微处理器23的一部分。
虽然对本发明的最佳实施例进行了具体描述,但是应该懂得,对它们做各种修改和变化是完全可能的。所以,本发明的保护范围仅由下面的权利要求限定。