一种全双工异步串行通信方法及其通信系统
本发明涉及通信技术,具体地说,涉及通信技术中的信息传输技术,尤其涉及一种利用DMA(Direct Memory Access,即直接存储器访问)控制的全双工异步串行通信方法,本发明还涉及应用这种通信方法的通信系统。
目前,实现两个控制设备之间点对点的串行数据通信,现有技术主要采用两种方式:一种是简单的异步串行口通信,如图1A所示,两个控制设备A和B之间通过各自的CPU A1和CPU B1以及异步串行口A2和B2进行串行通信;另一种是采用HDLC链路异步串行通信,如图1B所示,这种通信方式是在简单的异步串行口通信技术的基础上,在每个控制设备中增加一个HDLC控制器A3和B3。采用HDLC通信链路的优点是显而易见的:由于采用了HDLC协议,通信链路稳定可靠,速率较高,可达到64K bps。但是HDLC通信需要专用的HDLC控制芯片,相对成本较高。所以简单的异步串行口通信方式也有广泛的应用。相对而言,简单的异步串行口通信的链路的器件成本要低的多,而且在消息量不大的情况下,采用简单的软件处理即可保证可靠性。但是在消息处理量较大的情况下,简单的异步串行口通信由于每个字节的处理都需要CPU的参与,严重地影响了CPU的效率,难以满足实际需求。总之,现在广泛使用的串行数据通信的两种方式,或者可能增加硬件的成本,或者难以满足CPU的处理要求。
因此,本发明的目的在于提供一种全双工异步串行通信方法,这种通信方法既可以不增加硬件的成本,又可以提高CPU的工作效率。
此外,本发明的另一个目的还在于提供一种利用本发明的全双工异步串行通信方法的通信系统,该系统同样既可以不增加硬件成本,又可以提高CPU的工作效率。
基于本发明的上述目的,本发明提供的一种全双工异步串行通信方法,适用于两个控制设备之间进行点对点的数据通信,所述通信方法包括数据发送过程和数据接收过程,其中,所述数据发送过程包括:
发送数据的控制设备的CPU检测其内的DMA控制器的发送通道的工作状态:
如果所述DMA控制器的发送通道为空闲,则将要发送的数据写入到所述DMA控制器的发送数据缓冲区;
发送数据的所述控制设备的CPU向所述DMA控制器发出数据发送指令,启动所述DMA控制器发送数据,并将所述DMA控制器的发送通道的工作状态置为忙;
所述DMA控制器通过其发送通道向串行端口发送存储在所述发送数据缓冲区内的数据;
数据发送完成后,所述DMA控制器向发送数据的所述控制设备的CPU产生中断;
发送数据的所述控制设备的CPU接收到该中断后,将所述DMA控制器的发送通道的工作状态置为空闲;
所述数据接收过程包括:
接收数据的控制设备的CPU检测其内的DMA控制器的接收通道的工作状态;
如果所述DMA控制器的接收通道为空闲,则接收数据的控制设备的CPU向所述DMA控制器发送接收指令,启动所述DMA控制器接收数据,并将所述DMA控制器的接收通道的工作状态置为忙;
所述DMA控制器通过其接收通道从串行端口接收数据,并将数据存储在接收数据缓冲区中;
数据接收完成后,所述DMA控制器向接收数据的所述控制设备的CPU产生中断;
接收数据的所述控制设备的CPU接收到该中断后,接收所述DMA控制器的接收数据缓冲区中的数据,并将所述DMA控制器的接收通道的工作状态置为空闲。
根据本发明的另一个目的,本发明还提供一种利用上述方法的全双工异步串行通信系统,该系统包括两个进行点对点数据通信的控制设备,每个控制设备包括:
CPU,用于控制整个控制设备的工作;
串行端口;
DMA控制器,连接在所述CPU与所述串行端口之间,该DMA控制器包括发送通道、接收通道、发送数据缓冲区和接收数据缓冲区;所述发送数据缓冲区用于存储从所述CPU来的要发送的数据;所述发送通道用于将存储在所述发送数据缓冲区中的数据发送到所述串行端口;所述接收通道用于从所述串行端口接收数据;所述接收数据缓冲区用于存储所述接收通道接收到的数据;
其中所述两个控制设备的串行端口之间通过数据传输线连接。
如上所述,从整个数据收发过程来看,由于采用了DMA控制器,CPU只负责启动DMA控制器发送数据块以及响应DMA控制器的中断接收数据块,具体的每个字节数据通过串行端口收发过程均由DMA控制器来实现。因此,对于CPU来说是完全透明的。这样的通信方式大大减少了CPU的处理时间。由于DMA控制器的处理速度很快,因而,串行通信的速率也大大提高了。在采用了本发明的方法之后,通信速率可以达到56Kbps,基本上与HDLC通信方式相当,还可以进一步提高到112Kbps的速率,以满足实际的要求。
下面将结合附图详细描述本发明的实施例,以期能对本发明的目的、特征和优点以更进一步的理解。图中:
图1A和1B示意了已有技术的两种异步串行口通信方式;
图2是本发明的全双工异步串行通信系统的结构示意图;
图3是本发明的全双工异步串行通信方法中的数据发送过程的流程图;
图4是本发明的全双工异步通信方法中的数据接收过程的流程图;
图5是DMA收发两端数据块不同步的情形的示意图。
如图2所示,本发明的全双工异步串行通信系统包括有两个控制设备C和D。这两个控制设备C和D之间有数据需要进行通信,它们之间通过数据线E来传递数据。
对于每个控制设备来说,它们之间用于数据通信的部件组成及结构是相同的。如图2左半部分所示,控制设备C的主要包括CPU C1、DMA控制器C2和串行端口C3,DMA控制器C2位于CPU C1与串行端口C3之间。CPU C1的作用是控制整个控制设备的工作,其一部分作用就是控制DMA控制器C2的工作。DMA控制器C2包括有:发送数据缓冲区C2SB、接收数据缓冲区C2RB、发送通道C2S和接收通道C2R。发送数据缓冲区C2SB用于存储控制设备C要发送的数据,发送通道C2S将存储在发送数据缓冲区C2SB中的数据发送到串行端口C3。接收通道C2R用于从串行端口C3接收控制设备D发送来的数据,并将接收到的数据存储在接收数据缓冲区C2RB中。由于在本发明中,DMA控制器采用了两个独立的数据通道,即:发送通道和接收通道,因此,可以实现数据的全双工通信。
如上所述,控制设备D在数据通信方面,具有与控制设备C相同的组成和结构,同样包括有:CPU D1、DMA控制器D2(DMA控制器D2包括:发送数据缓冲区D2SB、接收数据缓冲区D2RB、发送通道D2S和接收通道D2R)以及串行端口D3。这些部件的作用与控制设备C相同,在此不再重复。
下面,结合图3和图4解释图2所示的全双工异步串行通信系统的工作情况。
两个设备之间的通信是相对的,也就是说,对于一个设备来说,是发送数据,则对于另一个设备来说,就是接收数据。因此,下面分两个过程来描述。
先解释数据发送过程。假设,控制设备C要向控制设备D发送数据。首先,控制设备C的CPU C1检测DMA控制器的发送通道C2S的工作状态。一般情况下,在进入初始状态时,CPU总是将DMA控制器C2的发送通道和接收通道的工作状态初始化为空闲。如果在步骤S101检测到DMA控制器的发送通道C2S的工作状态为空闲,则CPU C1将要发送给控制设备D的数据写入到DMA控制器C2的发送数据缓冲区C2SB(步骤S102)。当该缓冲区C2SB写满后,CPU C1就向DMA控制器C2发出数据发送指令,启动DMA控制器C2发送数据,同时将DMA控制器的发送通道的工作状态置为忙(步骤S103)。然后,在步骤S104,DMA控制器C2接收到CPU的发送指令,将存储在发送数据缓冲区C2SB内的数据发送给串行端口C3。在DMA控制器C2发送数据期间,CPU C1可以进行其它工作,例如进行其它运算或处理。由于本发明的通信系统为双工系统,因此,此时,CPU C1也可以控制数据接收工作。
当存储在缓冲器C2SB中的数据发送完毕之后,DMA控制器C2就向CPUC1产生一个中断信号,表示DMA控制器C2已完成数据的发送工作(S105)。CPU C1在接收到该中断后,就将DMA控制器C2的发送通道C2S的工作状态设置为空闲(步骤S106),以便能进行下一次数据发送。至此,一块数据发送完成。在CPU C1的控制下,可以进行另一块数据的发送工作,其流程相同。
当控制设备C如上将一块数据发送到串行端口C3上后,如图2所示,控制设备C和控制设备D的串行端口C3和D3之间通过数据线E进行了连接,因此,这些数据块将沿着数据线E传送到控制设备D的串行端D3上。这时,相对于控制设备D来说,就是数据接收过程。下面参照图4解释数据接收流程。
如图4所示,首先,控制设备D的CPU D1检测DMA控制器D2的接收通道D2R的工作状态(S201),如果接收通道D2R的工作状态为空闲,CPU D向DMA控制器D2发送接收指令,启动DMA控制器D2接收数据,并将DMA控制器D2的接收通道的工作状态置为忙(S202)。然后,在步骤S203,DMA控制器D2通过其接收通道D2R从串行端口D3接收控制设备C发送来的数据,并将接收到的数据存储在接收数据缓冲区D2RB。在DMA控制器D2接收数据其间,如上述数据接收过程一样,不需要CPU D1的参与,此时CPU D1可以从事其它控制和处理工作,也可以进行数据接收。
当数据接收完成之后,DMA控制器D2向CPU D1产生一个中断信号(S204),表示DMA控制器D2的数据接收完毕。在步骤S205,CPU D1接收到DMA控制器D2产生的中断信号,获悉DMA控制器D2已完成数据接收,此时,CPU就中断其它工作,从DMA控制器D2的接收数据缓冲区D2RB中接收数据,同时将DMA控制器D2的接收通道D2R的工作状态置为空闲。
至此,控制设备D的数据接收工作完毕。当控制设备C又有新的数据发送来之后,控制设备D可以用相同的流程接收数据。
上面虽然描述了控制设备C发送数据,控制设备D接收数据。但应当理解,由于控制设备C和控制设备D在完成数据通信功能方面的组成和结构是完全相同的,因此,控制设备D也可以用来发送数据,控制设备C也可以用来接收数据。
在上面所述的实施例中,控制设备C和D中的串行端口C3和D3可以采用常用的RSC-232串行端口,数据线E可以采用RSC-232数据线。显然,对于本技术领域的普通技术人员来说,也可以用其它的串行端口和数据线来替代,因此,这里的实施例并不是对本发明的保护范围的限定,而只是一种例举,以便说明本发明的可实施性。
以上的实施例描述了简单情形的基于DMA控制的异步串行通信方法和通信系统。在系统实际开发过程中,上述简单的数据收发过程并不能满足系统的稳定性和可靠性的要求。DMA控制方式虽然在计算机系统中得到了广泛应用,但是,点对点DMA控制方式通信应用很少见,单个DMA控制方式的数据存取相对点对点DMA直接控制物理层进行通信要简单得多。原因是DMA虽然效率较高,但并非智能化,在两个DMA控制器各自独立工作的情况下,数据块的收发情况是比较复杂的,最主要的问题就是数据块不同步的问题。下面详细说明这个问题。
数据块收发不同步的原因主要是DMA控制器固有工作特性造成的:在DMA控制器控制异步串行端口进行通信时,对于DMA控制器的发送通道来说在发送一个指定大小数据块之前其并无物理信号通知接收方的DMA控制器的接收通道,其只管发送完一个指定大小数据块即告一次数据发送结束。对DMA接收通道来说,不知道何时对方开始发送数据块,其只能一直等待,接收一个一个的字节数据,直到接收到指定个数的数据即认为一次数据接收完成。这样问题产生了,一次DMA接收的数据块可能来自不同的发送数据块,而一次发送的数据块可能被接收到两个数据块中,如附图5所示。
另一个实施所采用的方法是:为了克服DMA收发端数据不同步的问题,在接收端进行数据块的拼装,即在接收端识别出那些数据属于发送端的同一个数据块,将这些数据进行重组,还原。所采用的方法:在发送端,对有效数据进行打包,加上帧头和帧尾。帧头表示一批有效数据的开始地址,帧尾表示该批有效数据的结束地址。为了处理简单,可以规定每次发送的数据块大小是固定的。但每次需要发送的有效数据帧大小有差异,因此在有效数据帧大小不足以填满数据块的情况下,用空闲字节将数据块添满。在接收端设置一环形数据缓冲区,也就是说,图2实施例中的接收数据缓冲区采用环形数据缓冲区,该环形数据缓冲区可存放两个数据块。接收端收到一个数据块即将其放到环形缓冲区中,然后按先进先出的原则,在环形数据缓冲区中按线性查找算法检索出有效的数据帧。这样就可以有效的解决收发两端不同步的问题。
另外,在数据中也可以增加一个奇偶校验字。对数据的检错、纠错就是通过数据帧中增加的校验字来实现的。校验采用“和校验”,对于校验出错的数据帧采用收错重发的机制。流量控制的实现基于滑动窗口机制,窗口数的大小由数据传送的最大时延来决定。由于存在可能超过窗口机制的数据高峰流量,对于造成窗口数据缓冲池溢出的数据帧采取丢弃的策略。
以上以实施例的形式对本发明作了详细的描述。应当理解,这些实施例仅用于说明和理解本发明,本发明的保护范围并不应限于这些实施例及其细节的描述,而应由所附权利要求书来限定。