2014-09-22 85 views
-1

我正在使用python 2.7 。 我從UART獲取串行數據。使用python將數組值存儲在文本文件中

我試圖保存串行數據值以及數據收到時的實時。

從UART接收

數據的形式爲:

2.1862745098X 2.42156862745X 2.42156862745X 0.401960784314X 0.0X 0.637254901961X 1.49019607843X ............等等等等

我正在與時間一起使用下面的代碼保存的值:我面臨

f1 = open('accelerometer sensor1.txt','w') 
while 1: 
# Read from serial port, blocking 
data =ser.read(1) 
data1=(data) 


# If there is more than 1 byte, read the rest 
n = ser.inWaiting() 
data1 = (data1 + ser.read(n)) 
l = data1.split() 

#t1 = datetime.datetime.now() 



x = [d.strip("X") for d in l if d[len(d)-1] == "X"] 
for i in range(0,len(x)): 
    f1.write(str(datetime.datetime.now())) 
    f1.write("\t") 
    f1.write(str(x[i])) 
    f1.write("\n") 

問題是我在特定時間接收大數目的值。所以,當我保存數據,它的形式是:

2014-09-22 11:30:40.980000 2.1862745098 
2014-09-22 11:30:40.980000 2.42156862745 
2014-09-22 11:30:40.980000 1.71568627451 
2014-09-22 11:30:40.980000 0.401960784314 
2014-09-22 11:30:40.980000 0.0 
2014-09-22 11:30:40.980000 0.637254901961 
2014-09-22 11:30:40.980000 1.49019607843 
2014-09-22 11:30:40.980000 2.42156862745 
2014-09-22 11:30:40.980000 2.5 
2014-09-22 11:30:40.980000 1.58823529412 
2014-09-22 11:30:40.980000 0.78431372549 
2014-09-22 11:30:40.980000 0.0 
2014-09-22 11:30:40.980000 0.196078431373 
2014-09-22 11:30:40.980000 1.17647058824 
2014-09-22 11:30:40.980000 1.74509803922 
2014-09-22 11:30:40.980000 2.49019607843 
2014-09-22 11:30:40.980000 2.44117647059 
2014-09-22 11:30:40.980000 1.33333333333 
2014-09-22 11:30:40.980000 0.558823529412 
2014-09-22 11:30:40.980000 0.0 
2014-09-22 11:30:40.980000 0.205882352941 
2014-09-22 11:30:40.980000 1.43137254902 
2014-09-22 11:30:40.980000 2.08823529412 

我不想以這種形式,我想收到的每個樣本的實時寧可實時的收到一組樣本點。

我想文本文件顯示是這樣的:

2014-09-22 11:30:40.980000 2.1862745098 
2014-09-22 11:30:40.980010 2.42156862745 
2014-09-22 11:30:40.980020 1.71568627451 
2014-09-22 11:30:40.980030 0.401960784314 
2014-09-22 11:30:40.980040 0.0 

我該怎麼辦呢?請提出一些建議。

Thanks`

編輯

我想每個採樣點有不同的時間戳。這應該是可能的,因爲每個採樣點都是單獨通過串行端口而不是組中的。我認爲如何閱讀這些樣本點可能存在問題,如果我能夠以某種方式單獨閱讀它們,那麼我的目的就會得到解決。

我試着單獨獲取每個採樣點。我能夠這樣做,但代碼變得非常慢。 我只是做了

data =ser.readline(5) 
    data1=(data) 

價值觀通過UART來是類型: 127X 154X 100X 158X 0X 20X .............

有沒有辦法閱讀價值單獨和也不會影響速度。

+0

你知道你想要的格式嗎?如果是這樣,請添加它。如果不是,請描述更多你的需求。你似乎不需要有歷史數據,對嗎? – mrcrgl 2014-09-22 09:09:36

+0

請再次檢查問題。我添加了所需的格式。 – yuvraj 2014-09-22 09:20:45

回答

0

我想你想有一個時間戳內的數字的平均值。請查看此代碼,它彙總了給定的值,並且 - 如果時間戳不同 - 將其寫入文件。

緩存變量應該在循環;-)

cache = ('', 0, 0.0) 

def aggregate(value): 
    now = str(datetime.datetime.now()) 

    c_date, c_count, c_avg = cache 
    if now != c_date: 
     # write c_avg and c_date to file 
     f1.write(c_date) 
     f1.write("\t") 
     f1.write(str(c_avg)) 
     f1.write("\n") 

     # after that, clear c_count and c_avg 
     c_count = 0 
     c_avg = 0.0 

    if c_count is 0: 
     c_count = 1 
     c_avg = float(value) 
    else: 
     c_avg = ((c_avg * c_count) + float(value))/(c_count + 1) 
     c_count += 1 

    cache = (now, c_count, c_avg) 


for i in range(0,len(x)): 
    aggregate(x[i]) 

我希望這填補你的需求之外進行初始化。

Cheers

+0

這個答案不符合我的需要。我不想取平均的樣本點數。我希望每個樣本點具有不同的時間戳,而不需要考慮它們的平均值。這應該是可能的,因爲每個採樣點都是單獨通過串行端口而不是組中的。我認爲如何閱讀這些樣本點可能存在問題,如果我可以單獨閱讀它們,那麼我的目的將被解決,但現在我無法做到這一點。 – yuvraj 2014-09-23 04:15:59

+0

你在開玩笑嗎?你不能告訴這個嗎?我對你的環境毫無頭緒。這不是我的工作,我只是想幫忙。自己嘗試,我出去了。 – mrcrgl 2014-09-23 07:22:40

+0

對不起,我的意思不是粗魯..... – yuvraj 2014-09-23 07:26:21

相關問題