如何抑制输入溢出消息

如何抑制输入溢出消息

我有一个运行 Raspbian 的 Raspberry Pi(Debian 风格:)。Linux version 3.12-1-rpi ([email protected]) (gcc version 4.7.2 (Debian 4.7.2-5+rpi1) ) #1 Debian 3.12.9-1+rpi1 (2014-05-19)

我有一个通过 USB 连接的串行输出设备(电表)。每分钟用 Python 脚本读取串行端口。

编辑:我期望的数据符合此标准:DSMR v3.0 每十秒提供一次数据电报。 Python 脚本每分钟启动一次cron以读取一个数据电报。

我的dmesg,var/log/messages/var/log/syslog正被这些淹没:

Nov  2 10:32:07 electron kernel: [151762.159243] ttyUSB0: 2 input overrun(s)

我已经调整好了/etc/rsyslog.conf。通过删除,*.=kern;我成功地抑制了这些消息进入/var/log/messages.不幸的是,dmesg/var/log/syslog继续显示这些消息。

/var/log/syslog中没有提到/etc/rsyslog.conf。它是由不同的机制提供的吗?如何抑制这些消息从 ttyUSB0 进入dmesg/var/log/syslog

对于那些担心可能在 Python 脚本中找到原因的人(任何改进都值得赞赏)。这是我使用的脚本(省略数据后处理):

#! /usr/bin/python

import sys, serial, re

port = serial.Serial()
port.baudrate = 9600
port.bytesize = serial.SEVENBITS
port.parity = serial.PARITY_EVEN
port.stopbits = serial.STOPBITS_ONE
port.xonxoff = 1
port.rtscts = 0
port.dsrdtr = 0
port.timeout = 0
port.port = "/dev/ttyUSB0"

def gettelegram():
  # flag used to exit the while-loop
  abort = 0
  # countdown counter used to prevent infinite loops
  loops2go = 40
  # storage space for the telegram
  telegram = []
  # end of line delimiter
  delim = "\x0a"

  try:
    port.open()
    serial.XON
  except:
    abort == 4
    # open error terminates immediately
    return telegram, abort

  while abort == 0:
    try:
      # this doesn't seem to work
      #line = str(port.readline()).strip()
      line = "".join(iter(lambda:port.read(1),delim)).strip()
    except:
      # read error, terminate prematurely
      abort = 2
    if line == "!":
      abort = 1
    if line != "":
      telegram.append(line)
    loops2go = loops2go - 1
    if loops2go < 0:
      abort = 3

  # test for correct start of telegram
  if telegram[0][0] != "/":
    abort = 2

  try:
    serial.XOFF
    port.close()
  except:
    abort == 5

  # Return codes:
  # abort == 1 indicates a successful read
  # abort == 2 means that no valid data was read from the serial port
  # abort == 3 indicates a data overrun. More lines were received than expected.
  # abort == 4 indicates a serial port open error.
  # abort == 5 indicates a serial port close error.
  return (telegram, abort)

if __name__ == "__main__":
  telegram, status = gettelegram()

编辑:我做了一些额外的测试。恰好在上述程序完成后发生输入溢出错误。我尝试port.XOFF()在 之前添加port.close(),但这没有帮助。

EDIT2:我尝试在命令周围插入serial.XONand 。但是,这没有帮助。serial.XOFFport.read(1)

答案1

由于我不再遇到这个问题,我想分享我的解决方案:

我已经对 Python 脚本进行了守护进程。这使我能够在脚本启动时打开串行连接,然后每十秒读取一次串行端口数据。

从此不再超支。

脚本的代码是在 GitHub 上

答案2

http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/

IT 帮助了我,我立即得到了解决方案。

相关内容