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.XOFF
port.read(1)
ベストアンサー1
この問題はもう発生しないので、私のソリューションを共有したいと思います。
Pythonスクリプトをデーモン化しました。これにより、スクリプトの起動時にシリアル接続を開き、10秒ごとにシリアルポートデータを読み取ることができます。
もう過剰な支出はありません。
スクリプトのコードは次のとおりです。GitHubから