2013-07-09 8 views
15

मैं इस तरह धारावाहिक डेटा पढ़ रहा हूँ:PySerial गैर अवरुद्ध पढ़ पाश

connected = False 
port = 'COM4' 
baud = 9600 

ser = serial.Serial(port, baud, timeout=0) 

while not connected: 
    #serin = ser.read() 
    connected = True 

    while True: 
     print("test") 
     reading = ser.readline().decode() 

समस्या यह है कि यह बोतल py वेब रूपरेखा सहित क्रियान्वित करने से कुछ और रोकता है। sleep() जोड़ना मदद नहीं करेगा।

बदलना "जबकि यह सच है" "को" जबकि ser.readline(): "" परीक्षण "प्रिंट नहीं है, जो अजीब है, क्योंकि यह अजगर 2.7 में काम कोई भी विचार क्या गलत हो सकता है

आदर्श रूप में।? मैं केवल जब यह उपलब्ध है धारावाहिक डेटा को पढ़ने में सक्षम होना चाहिए डाटा हर 1,000 एमएस भेजा जा रहा है

+3

आप एक धागा बनाने नहीं चाहेंगे और इस इसे करने के लिए कोड को पढ़ने के लिए जोड़ सकता हूँ? –

+1

धारावाहिक संचार अवरुद्ध है ... आपको एक धागे का उपयोग करना चाहिए –

+0

क्या आप एक उदाहरण के साथ उत्तर पोस्ट कर सकते हैं? – DominicM

उत्तर

28

, एक अलग थ्रेड में यह रखो उदाहरण के लिए:।।

import threading 
import serial 

connected = False 
port = 'COM4' 
baud = 9600 

serial_port = serial.Serial(port, baud, timeout=0) 

def handle_data(data): 
    print(data) 

def read_from_port(ser): 
    while not connected: 
     #serin = ser.read() 
     connected = True 

     while True: 
      print("test") 
      reading = ser.readline().decode() 
      handle_data(reading) 

thread = threading.Thread(target=read_from_port, args=(serial_port,)) 
thread.start() 

http://docs.python.org/3/library/threading

21

एक अलग थ्रेड का उपयोग पूरी तरह से अनावश्यक है। बस अपने अनंत के लिए ऐसा करते हैं, जबकि पाश बजाय (अजगर 3.2.3 में परीक्षण किया गया):

while (True): 
    if (ser.inWaiting()>0): #if incoming bytes are waiting to be read from the serial input buffer 
     data_str = ser.read(ser.inWaiting()).decode('ascii') #read the bytes and convert from binary array to ASCII 
     print(data_str, end='') #print the incoming string without putting a new-line ('\n') automatically after every print() 
    #Put the rest of your code you want here 

इस तरह आप केवल पढ़ सकते हैं और प्रिंट अगर कुछ नहीं है। आपने कहा, "आदर्श रूप से मैं केवल उपलब्ध होने पर सीरियल डेटा को पढ़ने में सक्षम होना चाहिए।" यह वही है जो उपर्युक्त कोड करता है। यदि पढ़ने के लिए कुछ भी उपलब्ध नहीं है, तो यह आपके लूप के बाकी कोड पर छोड़ देता है। पूरी तरह से गैर-अवरुद्ध।

(इस उत्तर मूल रूप से तैनात & यहाँ डिबग: Python 3 non-blocking read with pySerial (Cannot get pySerial's "in_waiting" property to work))

pySerial प्रलेखन: http://pyserial.readthedocs.io/en/latest/pyserial_api.html

+1

धन्यवाद! इस समाधान ने मुझे आज एक कठिन जगह से बाहर कर दिया। मुझे सच में लगता है कि इस मामले में यह स्वीकार्य उत्तर होना चाहिए। –

+2

जबकि (सत्य) के बजाय मैं PySerial संस्करण> 3 के लिए (ser.isOpen()) – Johnny

+1

का उपयोग करने का सुझाव दूंगा> 3 आपको ser.is_open का उपयोग करने की आवश्यकता है – Johnny

संबंधित मुद्दे