2010-05-02 3 views
5

में सीरियल डेटा की लगातार निगरानी करने की आवश्यकता है अभी मैं COM4 पर एनालॉग सेंसर से डेटा भेजने के लिए एक Arduino का उपयोग कर रहा हूं। मैं एक पायथन स्क्रिप्ट बनाने की कोशिश कर रहा हूं जो लगातार उस डेटा पर नज़र रखता है और एक निश्चित पैरामीटर की तलाश करता है।पाइथन

मैं कुछ इस तरह की कोशिश की लेकिन यह मुझे सही ढंग से चेतावनी नहीं है

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

+1

वैसे मैं इसे विंग पायथन शेल में चला रहा हूं और यह सिर्फ "blaulah.py Evauluating" पर रहता है - यह वास्तव में किसी भी मान को आउटपुट नहीं करता है। फिर जब मैं arduino से यूएसबी अनप्लग करता हूं तो मूल्य आते हैं। जैसे कि मैंने तब तक पंजीकरण नहीं किया जब तक मैंने ऐसा नहीं किया। – jakke34

+0

मानते हैं कि ser.read() वास्तव में लौटाता है Tkinter Tkinter.Frame (... Tk() ...)। Mainloop() को तब तक कुछ भी दिखाने वाला नहीं है। – msw

उत्तर

3

serial पैकेज आप उपयोग कर रहे pySerial है, तो Serial.read() method की परिभाषा को ध्यान में रखना:

read(size=1)

पैरामीटर: आकार - पढ़ने के लिए बाइट्स की संख्या।

रिटर्न: बंदरगाह से बाइट पढ़ा जाता है।

धारावाहिक बंदरगाह से आकार बाइट पढ़ें। यदि एक टाइमआउट सेट किया गया है तो यह अनुरोध के अनुसार कम वर्ण वापस कर सकता है। बिना टाइमआउट के यह तब तक अवरुद्ध होगा जब तक कि बाइट्स की अनुरोधित संख्या पढ़ी न जाए।

संस्करण 2.5 में परिवर्तित: जब उपलब्ध (अजगर 2.6 और नवीन) और str अन्यथा बाइट्स का एक उदाहरण देता है।

यद्यपि आप byte वस्तुओं कार्रवाई करने के लिए कोशिश कर रहे हैं, तो आप (अजगर संस्करण के आधार पर) हो सकता है str या bytes (सरणी) वस्तुओं से निपटने जा। ये वस्तुएं आवश्यक रूप से पूर्णांक मानों के अनुरूप नहीं होती हैं।

यहां तक ​​कि जब read() से byte वस्तुओं को प्राप्त करने, सबसे बड़ा अहस्ताक्षरित पूर्णांक 255 400 के साथ value तुलना मतलब नहीं है हो जाएगा। एक सरल डीबगिंग आउटपुट के साथ लौटा वस्तुओं के प्रकार को खोजने का प्रयास करें।

print type(value) 

आप एक str वस्तु संभाल रूपांतरण के लिए ord() के उपयोग की जांच करने की जरूरत है।

(flush सुझाव मूल प्रश्न को संदर्भित करता है, जो print का उपयोग करता है, tkinter नहीं)।

how-to-flush-output-of-python-print देखें, और कमांड लाइन खोल का प्रयास करें, आईडीई नहीं जो आउटपुट बफरिंग को प्रभावित कर सकता है।

+0

जब मैं इसे प्रिंट नहीं करता हूं तो यह मेरे सशर्त को भी पकड़ नहीं रहा है :( – jakke34

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 
    } 

फिर अपने अजगर कोड सिर्फ इस तरह झंडा लिए देख सकते हैं:

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

मान लिया जाये कि आप उपयोग कर रहे है कि pySerial, serial.read() केवल एक बाइट पढ़ता है, जिसका अर्थ है 255 का अधिकतम मूल्य। यदि आपका Arduino स्ट्रिंग मान वापस भेज रहा है तो शायद उन्हें नए अक्षरों के साथ अलग करना और serial.readline() का उपयोग करना सबसे अच्छा है।

जब तक आपके पास Arduino से स्ट्रिंग्स को वापस भेजने की विशिष्ट प्रदर्शन आवश्यकताएं नहीं होती हैं, वैसे भी डीबगिंग को महत्वपूर्ण रूप से आसान बना दिया जाएगा।

इसके अलावा, अगर आप Arduino से तार प्राप्त कर रहे हैं वापस, अपने परीक्षण if int(value) > 400: