2016-08-23 141 views
0

Python 2.7Python Pyserial - 線程

這是我的代碼。你能告訴我什麼是錯的。這是連續研究線索兩天後我可以想到的野獸。

當我不使用線程時,串行通信工作。

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() 

回答

1

您沒有正確地同步線程。我建議將ser對象放入全局名稱空間,並使用鎖定,互斥鎖或信號量來防止兩個線程同時訪問單個對象ser

本週Python模塊解釋它最好here

+0

我看着你建議的鎖。假設t1獲得鎖定,它將永遠保留它,因爲它是一個while循環 - 無法解鎖它。有關如何解決它的任何想法? t1 - 是一個很長的處理事件,同時像t2這樣的其他事件發生。 –

+0

鎖可以被獲取並釋放。如果在使用ser之前獲得鎖定並釋放它,它會讓大量時間(例如,在任務1的睡眠期間)到其他任務使用ser。 – Julien

+0

@Julien這是我得到的錯誤: 回溯(最近通話最後一個): 文件 「C:\ Python27 \ LIB \ threading.py」,線路801,在__bootstrap_inner self.run() 文件「C :\ Python27 \ lib \ threading.py「,行754,正在運行 self .__ target(* self .__ args,** self .__ kwargs) 文件」C:/ Users/kundemj/Desktop/Production GUI/Trial python Codes /test19.py「,第15行,在Task1中 b = ser.read(7) 文件」C:\ Python27 \ lib \ site-packages \ serial \ serialwin32.py「,第252行,在讀 raise SerialException '調用ClearCommError失敗') SerialException:調用ClearCommError失敗 –

0

示例使用鎖

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

這是我得到的錯誤:Traceback(最近的ca在__bootstrap_inner self.run()文件「C:\ Python27 \ lib \ threading.py」,第754行,在自我運行.__目標文件「C:\ Python27 \ lib \ threading.py」 (* self .__ args,** self .__ kwargs)文件「C:/ Users/kundemj/Desktop/Production GUI/Trial python Codes/test19.py」,第15行,在Task1中b = ser.read(7) C:\ Python27 \ lib \ site-packages \ serial \ serialwin32.py「,第252行,讀取時拋出SerialException('調用ClearCommError失敗')SerialException:調用ClearCommError失敗 –