入力オーバーフローメッセージを抑制する方法

入力オーバーフローメッセージを抑制する方法

Raspbian(Debianバージョン:)を実行するRaspberry Piがあります。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 データテレグラムは10秒ごとに提供されます。 Pythonスクリプトは1分ごとに起動し、1つの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.XON。しかし、これは役に立ちません。serial.XOFFport.read(1)

ベストアンサー1

この問題はもう発生しないので、私のソリューションを共有したいと思います。

Pythonスクリプトをデーモン化しました。これにより、スクリプトの起動時にシリアル接続を開き、10秒ごとにシリアルポートデータを読み取ることができます。

もう過剰な支出はありません。

スクリプトのコードは次のとおりです。GitHubから

おすすめ記事