2016-11-26 26 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