关于QNX的串口及其中断,我的理解对吗?还有些其他问题,请了解的兄弟多指教,谢谢。

不好意思,QNX 新手,请多指教。

QNX 的串口必须分配一个中断,每当串口收到一个字节的数据,就由串口硬件产生一次中断。如果用户不接管这个中断,那么,系统缺省的处理程序就将当前数据复制到缓冲区,然后清掉终端标志。是这样吗?

这种情况下,如果多个串口分享一个中断,数据繁忙的时候可能造成延误,丢失数据。

还有一个问题。我有多个串口,接收不同通道发来的数据。每个通道数据都是30字节左右一个数据包,长度固定,数据包大约70毫秒一个。数据包的开头有特定的字符。

假设我利用单独的线程从不同的串口接收。请问我在线程中怎样能够快速地判断是否已收到一桢完整的数据包?若没有完整数据,我可以将cpu时间交给别的线程使用,检测别的串口。如能如此,可以达到比较高的效率。

我现在的想法是:每个线程循环从串口中读取,若5毫秒没有收到数据包的开头,则sleep一段时间。如收到开头,则继续从串口中读取一个完整的数据包,完成一次数据接收,其他线程继续轮流读取。这样安排好象有点浪费。请问有好办法吗?谢谢。

你的理解,涉及到硬件,驱动硬件的驱动程序,与使用驱动程序的用户程序三个层次,感觉你有点搞混了。

首先串口是个硬件,有串口芯片。正常工作时,串口线上的数据一个bit一个bit地到达芯片,硬件芯片会把它们组装成一个Byte,存在芯片里。硬件可以在收到一个字节后就发中断,但串口芯片里通常会有FIFO,可以存一些字节(16到64不等)。所以也可以把串口设成每4个字节一中断什么的。不过,这是驱动程序的责任了。

接下来的层次是串口驱动程序(是个软件)。在QNX来说,就是个devc-serXXXX这样的程序。这个程序有两大责任,一是初始化硬件,挂中断,处理中断,把收到的数据存入驱动自己的缓存中(还有发送处理),反正是与硬件打交道的事。另一责任就是响应用户程序的请求,用户程序要求读数据时,从输入缓存中返回数据;用户程序要求发送数据时,就将用户的数据先存入输出缓存,然后驱动硬件发送出去。

最后一个就是用户程序了,用户程序基本上就是open()/read()/write()/close()操作了。

归结到你的问题。

  1. 对中断的处理,是在串口驱动程序中。即使多个串口共享一个中断,也不一定造成数据丢失。

2)对于数据包的识别的问题,可以看看 readcond()这个函数,特别是你的情况,可以看看FORWORD那节的描述。

xtang, 非常感谢你的回答。现在我明白多了。不过仍然有一些疑问。

(1)硬件和驱动程序层次上,devc-ser8250 这个驱动程序缺省设置是几个字节已中断。
(2)我现在8个串口共享一个,我担心通信繁忙时会丢失数据。
(3)记得devc-ser8250缺省的缓冲区是256字节,这样我一个100字节的数据包应该不会造成缓冲区溢出吧?

我会去仔细阅读 readcond()的说明。我所说的编程,都是用户程序这一层次的。

再次感谢!

Sorry, 具体到devc-ser8250的设置,我也不记得了,要查源码和手册才知道。

devc-ser8250的输入输出缓冲大小可以在启动devc-ser8250时,通过命令行参数设置。