2012-11-05 92 views
1

當我運行我的腳本時,我正在將重複條目清理到數據庫中,並且我在想我可能會做錯什麼。將重複的數據存儲到數據庫中

硬件
我有115,200通過串行通信連接到我的樹莓派的工具。儀器每秒輸出一行數據,我想將這些數據存儲到數據庫中。每行都以\ n結尾。

軟件
的Python 2.7.3rc2
PySerial
的PostgreSQL 9.1
Debian的喘息

的數據庫一個表叫我創建wattsup:

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個條目發生一次似乎改善情況的提交。

任何想法可能會發生什麼?我很難過。

謝謝!

+0

該pi沒有「真正的」時鐘,所以這是一種可能性。你超頻了嗎? (不知道它是否重要,但可能是計時問題的另一個來源)記錄毫秒以查看記錄是否仍然重複 – shaun5

+0

表中表示該表具有禁止行重複的主鍵的部分在哪裏? – hughdbrown

+0

嗨shaun5和hubrbrown:有趣的想法,謝謝!所以我根據你的建議嘗試了幾件事。 1.完全擺脫了數據庫部分,因爲我不知道我在那裏做了什麼,並用打印語句取而代之。 2.我打印了datetime.datetime.now(),實際上,時間戳差別大約爲0.05秒。 3.我在'ser'中添加了一個'timeout = None'選項,因爲我真的很想把這個東西掛起來,直到我得到一整行。仍然沒有決議。我確實注意到,當我得到複製品時,它會在暫停一段時間後連續打印它們。 –

回答

1

一些想法 1)您可以添加一些等待語句到while循環。現在它正在運行循環並使用所有處理器時間。 2)您正在使用串口轉USB轉換器,這些設備有時會緩衝數據。 3)板載UART也緩衝數據 4)執行Readline時,取決於用作終止字符的內容:Cr,LF或CrLF 5)您可以嘗試使用Read,然後讀入您自己的字符串緩衝區並查找第一個終結符。