2012-11-05 30 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,然后读入您自己的字符串缓冲区并查找第一个终结符。