2016-11-26 29 views
0

我有一個Arduino報告時間(以秒爲單位),電壓,電流和焦耳歷時60秒。在這樣的串行監控:使用PySerial從Ardunio獲取更新只需每2分鐘而不是1分鐘

time,voltage,current,joules 
60,1.45,0.39,0.57 
120,1.45,0.39,1.13 
180,1.45,0.39,1.70 
240,1.45,0.39,2.26 
... 

但是下面的Python腳本我沒有得到這樣的結果:

import serial 
ser = serial.Serial('COM5', 9600) 
logfile = open("batterytest.log", 'w') 
while True: 
    if ser.readline() == b'Test Complete!': 
     logfile.close() 
     exit() 
    logfile.write(ser.readline().decode("utf-8")) 
    logfile.flush() 

相反,我看到的結果每120秒:

time,voltage,current,joules 
120,1.13,0.02,0.05 
240,1.13,0.02,0.09 
360,1.13,0.02,0.14 
480,1.13,0.02,0.19 
.... 
+3

您正在閱讀的兩倍,因此每次迭代都會消耗兩行。 –

+1

是的,如@KlausD。表示,第一次讀取在'if ser.readline()== b'Test Complete!':'中,第二次讀取在'logfile.write(ser.readline()。decode(「utf-8」))''處。將讀取的行存儲在一個臨時字符串中。 –

+0

Everyon是對的。我不知道爲什麼我在查看代碼時沒有遇到這種情況。我建議修改。 – Russ960

回答

1

外貌因爲某些時間問題,它可能會錯過中間數據點。您可以嘗試使用putty來查看您的arduino是否輸出了正確的數據點。

對於您的PySerial程序,我會添加一個變量「data」來存儲您的串行readline,然後在其上執行您的邏輯。

import serial 
ser = serial.Serial('COM5', 9600) 
logfile = open("batterytest.log", 'w') 
while True: 
    data = ser.readline() 
    if data == b'Test Complete!': 
     logfile.close() 
     exit() 
    logfile.write(data.decode("utf-8")) 
    logfile.flush() 

另外,根據您的Arduino的輸出時機,可以考慮通過增加閱讀您的串行超時值:

ser = serial.Serial('COM5', 9600, timeout = 1) 
# Here the time out is 1 second