2010-05-02 36 views
5

現在我正在使用Arduino從模擬傳感器向COM4發送數據。我正在嘗試製作一個連續監視數據並查找某個參數的python腳本。需要不斷監測Python中的串行數據

我想是這樣的,但它是不正確提醒我

import serial 
from Tkinter import * 
import tkMessageBox 

port = "COM4" 
ser = serial.Serial(port,9600) 
value = 0 

while 1: 
    value = ser.read() 
    if value > 400: 
     tkMessageBox.showwarning(
      "Open file",) 
    time.sleep(1) 
+0

我們可以有它在做什麼與你所期望的一個例子嗎? – James 2010-05-02 08:00:17

+1

那麼我在Wing Python Shell中運行它,它只是停留在「Evauluating blablah.py」 - 它從來沒有實際輸出任何值。然後,當我從arduino拔出USB時,數值出現了。就好像他們沒有註冊,直到我做到了。 – jakke34 2010-05-02 08:05:17

+0

假設ser.read()實際返回Tkinter不會顯示任何東西,除非Tkinter.Frame(... Tk()...)。mainloop()被調用。 – msw 2010-05-02 10:34:17

回答

3

如果您使用的是serialpySerial,採取Serial.read() method的定義注:

read(size=1)

參數:size - 要讀取的字節數。

返回:從端口讀取的字節數。

從串口讀取字節大小。如果設置超時,它可能會按要求返回更少的字符。在沒有超時的情況下,它將被阻塞,直到讀取所請求的字節數。

在2.5版本更改:返回字節實例可用時(Python的2.6和更新版本)和STR否則。

雖然你試圖處理byte對象,你可以(根據Python版本)來處理strbytes(陣列)對象。這些對象不一定對應整數值。

即使從read()接收byte對象時,最大的無符號整數爲255 比較value與400沒有任何意義。嘗試使用簡單的調試輸出來查找返回對象的類型。

print type(value) 

如果你需要處理的str對象,檢查皈依使用ord()

(該flush建議是指原來的問題,其中使用print,而不是tkinter)。

請參閱how-to-flush-output-of-python-print,並嘗試命令行shell,而不是可能影響輸出緩衝的IDE。

+0

它甚至沒有捕獲我的條件,當我不打印出來:( – jakke34 2010-05-02 08:35:37

0

而不是讓Arduino代碼將所有的模擬值都轉發給COM4,只有當你滿足條件時才讓它傳遞一個標誌。

所以Arduino的代碼可能是:

void loop() { 
    sensorValue = analogRead(sensorPin); 
    if (sensorValue >= 400){ 
    Serial.print("1"); // 1 will be the flag that will be sent to COM4 
    } 

然後Python代碼可以直接找這樣的標誌:

import serial 
from Tkinter import * 
import tkMessageBox 

port = "COM4" 
ser = serial.Serial(port,9600) 
value = 0 


while 1: 
    value = ser.read(); 
    print value 
    if value == "1": 
     tkMessageBox.showwarning("BLAH", "BLAH\n") 
     exit() 
    else: 
     continue 
0

假設你正在使用pySerialserial.read()只讀取一個字節,這意味着最大值爲255.如果你的Arduino發送字符串值,最好用新行字符分隔它們,並使用serial.readline()

除非您有特定的性能要求,否則從Arduino返回字符串將使調試變得非常容易。

此外,如果你是從Arduino的接收串回來,您的測試應該是if int(value) > 400:

相關問題