2016-08-23 44 views
0

Python 2.7Python Pyserial - Threading

Dies ist der Code, den ich habe. Kannst du mir bitte sagen was falsch ist? Das ist das Biest, das ich mir vorstellen konnte, nachdem ich mehr als zwei Tage lang kontinuierlich Threading studiert hatte.

Die serielle Kommunikation funktioniert, wenn ich Threading nicht verwende.

import threading 
import time 
import sys 
import serial 
import os 
import time 

    def Task1(ser): 

    while 1: 

     print "Inside Thread 1" 
     ser.write('\x5A\x03\x02\x02\x02\x09') # Byte ArrayTo Control a MicroProcessing Unit 
     b = ser.read(7) 
     print b.encode('hex') 
     print "Thread 1 still going on" 
     time.sleep(1) 


def Task2(ser): 

    print "Inside Thread 2" 
    print "I stopped Task 1 to start and execute Thread 2" 
    ser.write('x5A\x03\x02\x08\x02\x0F') 
    c = ser.read(7) 
    print c.encode('hex') 
    print "Thread 2 complete" 


def Main(): 
    ser = serial.Serial(3, 11520) 
    t1 = threading.Thread(target = Task1, args=[ser]) 
    t2 = threading.Thread(target = Task2, args=[ser]) 
    print "Starting Thread 1" 
    t1.start() 
    print "Starting Thread 2" 
    t2.start() 

    print "=== exiting ===" 

    ser.close() 

if __name__ == '__main__': 

    Main() 

Antwort

1

Sie synchronisieren die Threads nicht ordnungsgemäß. Ich schlage vor, das Objekt ser in den globalen Namespace zu setzen und eine Sperre, Mutex oder Semaphor zu verwenden, um zu verhindern, dass die beiden Threads gleichzeitig auf das einzelne Objekt ser zugreifen.

Python-Modul der Woche erklärt es am besten here

+0

ich am Schloss sah man vorgeschlagen. Wenn t1 eine Sperre erwirbt, hat sie diese für immer, da es sich um eine While-Schleife handelt - es gibt keine Möglichkeit, sie zu entsperren. Irgendwelche Ideen, wie man es umgehen kann? t1 - ist ein langes Verarbeitungsereignis, während gleichzeitig andere Ereignisse wie t2 passieren –

+0

Eine Sperre kann erworben und freigegeben werden. Wenn Sie die Sperre vor der Verwendung von ser erhalten und sie danach wieder freigeben, lässt sie viel Zeit (z. B. während des Schlafs von Aufgabe 1) für andere Aufgaben, um ser zu verwenden. – Julien

+0

@Julien Dies ist der Fehler, den ich bekam: Traceback (jüngste Aufforderung zuletzt): Datei "C: \ Python27 \ lib \ threading.py", Linie 801, in __bootstrap_inner self.run() Datei „C : \ Python27 \ lib \ threading.py ", Zeile 754, im Lauf self .__ target (* selbst .__ args, ** self .__ kwargs) Datei" C:/Benutzer/kundemj/Desktop/Produktion GUI/Test python Codes /test19.py ", Zeile 15, in Task1 b = ser.read (7) Datei" C: \ Python27 \ lib \ Site-Pakete \ seriell \ serialwin32.py ", Zeile 252, in lesen auslösen SerialException ('call to ClearCommError fehlgeschlagen') SerialException: Aufruf von ClearCommError fehlgeschlagen –

0

Beispiel für Schloss

import threading 
import time 
import sys 
import serial 
import os 
import time 

def Task1(lck,ser): 

    while 1: 

     print "Inside Thread 1" 
     lck.acquire() 
     ser.write('\x5A\x03\x02\x02\x02\x09') # Byte ArrayTo Control a MicroProcessing Unit 
     b = ser.read(7) 
     lck.release() 
     print b.encode('hex') 
     print "Thread 1 still going on" 
     time.sleep(1) 


def Task2(lck,ser): 

    print "Inside Thread 2" 
    print "I stopped Task 1 to start and execute Thread 2" 
    lck.acquire() 
    ser.write('x5A\x03\x02\x08\x02\x0F') 
    c = ser.read(7) 
    lck.release() 
    print c.encode('hex') 
    print "Thread 2 complete" 


def Main(): 
    ser = serial.Serial(3, 11520) 
    lck = threading.Lock() 
    t1 = threading.Thread(target = Task1, args=[ser,lck]) 
    t2 = threading.Thread(target = Task2, args=[ser,lck]) 
    print "Starting Thread 1" 
    t1.start() 
    print "Starting Thread 2" 
    t2.start() 

    print "=== exiting ===" 

    ser.close() 

if __name__ == '__main__': 

    Main() 
+0

Dies ist der Fehler, den ich bekommen habe: Traceback (neueste ca lll): Datei "C: \ Python27 \ lib \ threading.py", Zeile 801, in __bootstrap_inner self.run() Datei "C: \ Python27 \ lib \ threading.py", Zeile 754, in run self .__ target (* self .__ args, ** self .__ kwargs) Datei "C:/Benutzer/kundemj/Desktop/Produktion GUI/Test python Codes/test19.py", Zeile 15, in Task1 b = ser.read (7) Datei " C: \ Python27 \ lib \ Site-Pakete \ serial \ serialwin32.py ", Zeile 252, in Leseerweiterung SerialException ('Aufruf von ClearCommError fehlgeschlagen') SerialException: Aufruf von ClearCommError fehlgeschlagen –