2013-03-17 228 views
1

我的Python腳本有問題。它正在工作,但有些錯誤。我是Python新手,所以我找不到任何解決方案:(使用Arduino的Python腳本不會讀取正確的數據

我的腳本通過pySerial連接到Arduino板,並讀取溫度數據。它連接正常,但數據顯示在終端或保存在TXT文件中克龍)是錯誤的:

2013-03-16 13:40:01 166.8 
2013-03-16 13:41:02 1617. 

它應該是:

2013-03-16 13:40:01 16.68 
2013-03-16 13:41:02 16.17 

我的Python腳本:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# pytemp.py 

import serial 
import time 

ser = serial.Serial('/dev/ttyACM0',9600, timeout=10) 
read = ser.read(5) 
comp = read.split() 
ser.close(); 
print time.strftime("%Y-%m-%d %H:%M:%S"), comp[0] 

我使用Python3.3和pySerial 2.6。在oryginal版本有:

read = ser.readline(eol=/r) 

但據我所知在2.5+ EOL命令不工作了。我不知道如何編輯腳本來隨時打印數據。

+0

你可以從'/ dev/ttyACM0' _without_ Python讀取Arduino數據嗎? [這裏](http://stackoverflow.com/questions/15450419/java-rxtx-code-to-connect-to-rfcomm0-is-not-working)在Java中是一個類似的問題。 – angelatlarge 2013-03-17 08:11:29

+0

你可以給我們看看'read'的內容(分割之前)嗎? – 2013-03-17 10:24:58

+0

是的,我可以用屏幕/ dev/ttyACM0讀取Arduino數據。並且它顯示正常,正確的nubers,例如21.89。所以只有我的python腳本有問題。 – 2013-03-17 12:47:15

回答

1

根據documentation,當使用更高版本的Python 2.6版本時,eol參數確實不再受支持。

請忽略我以前的建議,使用FileLike。這不是在Python 2.6+中使用!

如何處理數據取決於數據的外觀如何。既然你沒有給我們一個原始數據的例子,我將以this page的格式爲例。

在上述例子中的數據的格式是:

t: 2012.11.18 19:39:03 50A93957 +024.50 0189 
t: 2012.11.18 19:39:13 50A93961 +024.50 0189 
t: 2012.11.18 19:39:23 50A9396B +024.50 0188 

的每一行都具有下列:

  • 日期和時間
  • 生日期和時間以十六進制
  • 以攝氏度爲單位的溫度值
  • 以十六進制表示的原始溫度值

您會注意到每個測量都以't:'開頭,並且有六個項目以空格分隔。因此,在這種情況下,我將運行一個循環,是這樣的:

import serial 
import time 

buffer = bytes() 
ser = serial.Serial('/dev/ttyACM0',9600, timeout=10) 
while buffer.count('t:') < 2: 
    buffer += ser.read(30) 
ser.close(); 
# Now we have at least one complete datum. Isolate it. 
start = buffer.index('t:') 
end = buffer.index('t:', start+1) 
items = buffer[start:end].strip().split() 
print items[1], items[2], items[4] 

一個例子。意識到你可能會開始閱讀一行數據。你不能假設你從一開始就開始閱讀。

In [23]: buffer = '39:03 50A9\r\nt: 2012.11.18 19:39:13 50A93961 +024.50 0189\r\nt: 2012.11.18 19:39:23 50A9396B +024.50 0188' 

讓我們來檢查我們可以找到多少't:'。 (你也可以搜索「\ r \ n」來代替。這要緊的是,你有什麼要定界符線含)

In [24]: buffer.count('t:') 
Out[24]: 2 

因爲我們有兩個分隔符,我們至少有一個數據點。讓我們隔離完整的數據點。

In [25]: buffer.index('t:') 
Out[25]: 12 

In [26]: buffer.index('t:', 12+1) 
Out[26]: 58 

這就是我們想看到的。完整的數據點:

In [27]: buffer[12:58+1].strip().split() 
Out[27]: ['t:', '2012.11.18', '19:39:13', '50A93961', '+024.50', '0189', 't'] 

In [28]: items = buffer[12:59].strip().split() 

In [29]: print items[1], items[2], items[4] 
2012.11.18 19:39:13 +024.50 
+0

有什麼不對。我的新代碼是:ser = serial.Filelike('/ dev/ttyACM0',9600,timeout = 10),並且出現錯誤:AttributeError:'module'object has no attribute'Filelike' – 2013-03-17 12:59:26

+0

您應該使用大寫L在FileLike中。 – 2013-03-17 14:41:20