我使用2.6.32基于OMAP的linux内核。我观察到,在高速数据速率(串口设置为460800波特率)串行端口HW fifo溢出发生。
串口配置为在rx和tx两个方向上每8字节产生中断(即当串口HW fifo为8字节时,产生一次从串口读取数据的全串行中断)。
我正在连续传输114字节的数据包(串行驱动程序对数据包模式没有任何线索,它以原始模式接收数据)。根据计算,
460800位/秒=> 460800/10 = 46080字节/秒(其中1个停止位和1个开始位),所以在1秒内,我可以在最坏的情况下传输46080/114 => 404.21个数据包,没有任何问题。
但是,我希望串行端口每秒至少处理1000个数据包,因此我已配置串行驱动程序每8字节生成中断。
我用windows XP试了同样的方法,我可以每秒读取600个数据包。
在上述情况下,您认为在linux上这样做可行吗?还是我遗漏了什么?让我知道你的意见。
可以有人也,发送一些重要的配置设置,需要配置在。config文件。我无法附加.config文件,否则,我可以共享它。
有两种类型的溢出可能发生在串行端口上。第一个是你正在谈论的,驱动程序没有响应中断足够快,以清空FIFO。它们通常约为16字节深,因此获得fifo溢出需要中断处理程序在1/(46080/16)= 347微秒内无响应。那是一段非常非常长的时间。你必须有一个非常糟糕的驱动程序,具有更高优先级的中断来触发它。
第二种是你没有考虑到的,并且提供了更多的逻辑解释的希望。驱动程序将字节从fifo复制到接收缓冲区。直到用户模式程序调用read()来读取它们。当不与设备配置任何类型的握手并且用户模式程序没有经常调用read()时,会发生缓冲区溢出。它看起来完全像一个fifo缓冲区溢出,字节只是消失。对这些问题有一些状态警告,但不检查它们是一种常见的疏忽。你也没提过那件事。
所以从改进诊断开始,做检查溢出状态位以了解发生了什么。然后做考虑启用握手,如果你发现它实际上是一个缓冲区溢出问题。增加缓冲区大小是可能的,但如果这是一个消防软管问题,则不是解决方案。让用户模式程序更频繁地调用read()是一个修复方法,但并不容易。只是降低波特率,是的,这总是有效的