对于这个错误,网上的回答大多千篇一律,我找到两种有代表性的回答。

第一种

linux串口长期工作时,出现提示:ttyS0: 1 input overrun(s)

说明串口已经输入溢出,这时候我们应该将串口的缓冲区进行清除。

在发送命令前,清除缓冲区

在接受数据后,清除缓冲区

清除命令:tcflush(fd, TCIOFLUSH);

当然fd是你串口open时返回的int,这个fd必须有意义(>0);

TCIOFLUSH的意思是清除输入输出缓存。

——————————————————
15.14 Overrun errors on serial port
This is an overrun of the hardware FIFO buffer and you can'tincrease its size. See

第二种

转载:http://blog.chinaunix.net/uid-20201831-id-1636118.html

内容提要:        这篇文档主要介绍了在错误日志里出现TTY_OVERRUN错误的原因及纠正的方法

说明:
在HACMP环境下的,操作系统的错误日志里经常出现类似如下的错误:

LABEL:                  TTY_OVERRUN
IDENTIFIER:         9D30B78E
Date/Time:       Tue Mar  9 04:18:39 BEIS
Sequence Number: 5593
Machine Id:      005A858A4C00
Node Id:         ibm001
Class:           S
Type:            TEMP
Resource Name:   tty0

Description
RECEIVER OVER-RUN ON INPUT

Failure Causes
EXCESSIVE LOAD ON PROCESSOR

       Recommended Actions
       REDUCE SYSTEM LOAD.
       REDUCE SERIAL PORT BAUD RATE


这篇文档将要详细解释一下产生TTY_OVERRUN错误的原因并提供一些纠正此种错误的方法。

[说明]
       进入一个串口的数据被设备驱动程序带进并存储到内核的一个缓冲器里,在一个用户程序来读取这些数据之前数据一直保存在缓冲器里。TTY_OVERRUN错误不是tty的联接有问题,而是进程发送和接受数据的结果,tty只不过是建立了两个进程之间通讯的联接。当一个进程发送数据太快而另一个进程读取的太慢,错误就会发生,在这种情况下,接受端数据堆积并且溢出缓冲器,在缓冲器里老数据被推出新数据代替进入,错误就被记录到错误日志里。


[原因]                                                  
       数据(噪音,真实的数据等)进入串口,但是没有用户进程来读取它,因此溢出缓冲器;如果实际上有一个进程读取数据,但是数据进来的比进程能够处理的速度快这种错误也会发生。这种溢出在集群环境里ttys用作HACMP的心跳联接的情况下比较常见。
       它是由某些事情(可能是系统里一些别的驱动程序)把持着tty的中断以致于他们不能得到足够快地预期防止数据丢失而引起的。


[ 解决方法]

    检查看是否有进程在这个tty上运行:

    #fuser /dev/ttyX  
    #ps -ef | grep ttyX


   如果没有进程正在这个TTY上运行:

   1.可能端口连接有一个不该连接在上面的设备 ,移出这个设备;

   2.设备可能损坏了,更换掉这个设备;

   3.电缆可能损坏了,更换掉电缆;

   4.线路中可能有电磁干扰,用一根屏蔽了的电缆更换现在的电缆或者是消除电磁干扰的因素。

   如果有一个进程正在这个tty上运行:

       使用 "lsattr -El ttyX" 或者使用 "smit tty" 命令进入smit菜单来显示tty的属性,在电缆允许的情况下更改流控制属性(flow control)到“RTS"(这个tty连接的另一端也需要把流控制设定为RTS);
       如果流控制设定为RTS后仍然有溢出错误,调低速率到9600(这需要在连接的两端都要做),你能够通过以下命令来tty正在运行的速率:
       # stty -a < /dev/ttyX
       如果tty被配置为9600,但是stty命令输出显示它正在运行一个更高的速率,那么运行在这个tty上的进程正在改变了速率,在HACMP环境里这个进程是hatsd.
       1. 使用 HACMP/RSCT 配置步骤来降低线路速率到9600:
#smitty clstop - forced (在所有的节点上执行)
#smitty hacmp - configure cluster - cluster topology - configure network modules - chg/show a network module                                                                   
       在速率的参数区域更改为9600,然后同步拓扑结构,在所有节点上启动HA;
                                                                           
       2. 使用TTY配置步骤来降低"RECEIVE trigger level"参数到1:      
# smitty tty                                                        
       Change / Show Characteristics of a TTY                            
       RECEIVE trigger level                              [1]

[附加信息]
  如果在检查和纠正了上面提到的所有内容还有TTY_OVERRUN错误发生,那么附加的推荐措施是:增加进程的优先权,升级或者增加处理器,减轻系统的负载。 

Logo

更多推荐