DOS下串口高速中断软件的实现

时间:2022-04-21 06:33:00

DOS下串口高速中断软件的实现

摘要:该文结合应用实际介绍了在Dos下串口高速中断的处理办法,弥补了现有资料在高速串口中断时会丢失数据的不足。

关键词:DOS;串口;高速中断;中断服务程序

中图分类号:TP316 文献标识码:A 文章编号:1009-3044(2012)28-6702-03

串行接口设备凭借其控制灵活、接口简单、占用系统资源少等优点,被广泛应用于工业控制、家庭安防、GPS卫星定位导航等领域。在这些嵌入式系统中,可能会有很多从设备都通过串行接口与主机进行通信。

本文中系统软件通过串口来向外发送控制数据。控制机为x86架构的计算机,操作系统为MS-DOS6.22。由于系统中数据传输距离比较远,超过了232串口的最大传输距离。所以需要使用差分串口来提高传输距离,这就需要我们使用第三方提供的串口扩展卡,在系统中扩展出两个422串口。我们使用中断方式来处理串口收发的数据。这种办法相比起查询方式来可以大大的节省CPU时间,使CPU可以省出时间来干别的事。

本文中的串口数据传输速度非常快,这就使得中断被触发的频率很快。刚开始我们根据专门讲串口编程的书[1]和网上查到的资料来编程。调试的时候发现有数据丢失的现象。进一步探查发现数据丢失是由于有些串口中断丢失了,数据没有被处理。经过不断的探查,我们终于找到了解决串口中断丢失问题的办法。下面按照编程的步骤一步一步来进行说明。

1 软件实现

1.1 串口初始化

首先需要对串口进行初始化,设置数据位,停止位和波特率。COM端口的寄存器组如表1所示,共有12个寄存器,使用了8个地址,其中部分寄存器共用一个地址,由DLAB=0/1来区分。DLAB是线路控制寄存器的第7位。根据下表所示的线路控制寄存器相对于串口基地址的偏移3来访问它。首先设置允许访问波特率寄存器,再根据表2线路控制寄存器各位的意义来设置波特率,最后再设置停止位和数据位。源代码如下所示。

1.2 中断编程

首先需要挂接中断,使得pc机在中断触发以后可以调用我们的中断处理程序。这分为以下几步,

1)使用dos系统调用_dos_getvect[3]函数,把我们的中断处理函数(本文中为int_COM)挂接到相应的中断向量上,本文中为IRQ12。

2)对系统中的8259中断管理器进行设置,在其中打开串口对应中断的屏蔽位,以使pc机不会屏蔽串口中断。

3)需要通过串口的中断允许寄存器来设置我们想要响应的串口中断,比如接受中断、发送中断还是两者都响应等等。

源代码如下:

1.3 编写中断服务程序

中断服务程序的编写是本文的关键,做本项目的时候参考了大量介绍串口编程的专业书籍,其中介绍的串口中断服务程序的写法大同小异,按照其方法来写中断服务程序,在传输数据量大,中断频率高的时候就会频繁的出现数据丢失的现象。这说明这种写法是有问题的。按照书上的说法,串口在接收数据的时候每收到一个字符,中断就会被触发一次,这样只需在串口中断服务程序里每次判断这个中断是否是接收中断,如果是的话,就读取一个字符数据,这样就可以了。但是我们在实际中发现经常会出现中断服务函数被调用一次就可能会有多个字符被接收进来的情况。解决这个问题的关键是中断服务程序要象下面源代码所示,在程序中把中断处理程序中处理接收部分括进一个while(1)循环。这样在接受完一个字符后,程序会再次检查中断识别寄存器,看看是否又接受到字符了,直到确认没有数据了,也没有发送中断的时候程序才会从return处退出。而根据现有的资料来编写中断服务程序,就相当于是没有while(1)循环的语句,中断触发以后程序判断是否是接收中断,如果是就读取一个字符数据,完后就退出中断服务程序。跟前一种写法相比显然会少接收到一些字符。这已经被本项目实际所证明。

2 结论

本文中所介绍的虽然是DOS下串口的编程,但是编写方法是直接端口访问,所以其方法也适用于其它操作系统,如vworks等。关于中断的一些看法,如“在实际中发现经常会出现中断服务函数被调用一次就可能会有多个字符被接收进来的情况”,也同样适用于其它在x86架构下的中断处理。具有一定的普遍意义。

参考文献:

[1] 龚建伟,熊光明.串口通信编程实践[M].北京:电子工业出版社,2005:169-195.

[2] 罗利.基于中断方式PC104 高速串行通讯软件[J].电子测量技术,2004(4):110-112.

[3] 刘甲耀,严桂兰.TURBOC 语言程序设[M].北京:电子工业出版社,1998.

上一篇:基于iTextSharp的PDF生成技术应用研究 下一篇:浅析高校图书馆电子资源建设