1

スクリプトを実行すると、データベースへのエントリが重複してしまい、何が間違っているのか疑問に思いました。

ハードウェア
115,200のシリアル通信を介してRaspberryPiに接続された機器を持っています。機器は毎秒データの行を出力し、このデータをデータベースに保存したいと思います。各行は\nで終了します。

ソフトウェア
Python2.7.3rc2PySerial PostgreSQL 9.1 Debian
Wheezy

データベースには、私が作成したwattsupというテーブルが1つあります。

CREATE TABLE wattsup (
    wattsuplocation text
    wattsuptime timestamp
    wattsupvalue numeric
);

私のPythonスクリプトは次のようになります。

import serial
import time
import psycopg2

ser = serial.Serial('/dev/ttyUSB0', 115200)
Location = 'A'

conn = psycopg2.connect("dbname='mydb' user='thotchi'")
cur = conn.cursor()

Insert = "INSERT INTO wattsup (wattsuplocation, wattsuptime, wattsupvalue) VALUES (%s, %s, %s)"

while 1:
    line = ser.readline()

    DataArray = line.split(',') #CSV output

    if len(DataArray) != 21:
        continue
    else:
        Time = time.strftime("%Y-%m-%d %H:%M:%S")
        Watts = float(DataArray[3]) / 10
        cur.execute(Insert, (Location, Time, Watts))
        conn.commit()

通常は機能しますが、理解できないデータの重複がいくつかあります。データベースにクエリを実行すると、次のようなデータを見つけることができます。

A, 2012-11-04 18:00:00, 5.0
A, 2012-11-04 18:00:01, 5.1
A, 2012-11-04 18:00:02, 5.0
A, 2012-11-04 18:00:03, 4.9
A, 2012-11-04 18:00:04, 5.0
A, 2012-11-04 18:00:05, 5.0
A, 2012-11-04 18:00:05, 5.0
A, 2012-11-04 18:00:05, 5.0
A, 2012-11-04 18:00:05, 5.0
A, 2012-11-04 18:00:06, 5.1

重複するデータがあることに注意してください(A、2012-11-04 18:00:05、5.0)。計器は1秒でしかデータを出力しないことを知っているので、それは計器ではないと確信しています。状況を改善するように思われる10エントリごとにコミットが発生するように、コードをいくつか変更してみました。

何が起こっているのか考えてみませんか?私は困惑しています。

ありがとう!

4

1 に答える 1

1

いくつかのアイデア 1) while ループにいくつかの待機ステートメントを追加できます。現在、ループが実行され、すべてのプロセッサ時間が使用されています。3) オンボード UART もデータをバッファリングします 4) Readline を実行するときは、終了文字として使用されるものによって異なります: Cr、LF または CrLF最初のターミネーターに。

于 2012-11-17T09:40:40.567 に答える