Advertisement
thorium90

ThreadSerialOutput.py

Nov 3rd, 2011
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.36 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. ##########################################################################
  3. ##                          PYTHON SOURCES                              ##
  4. ##########################################################################
  5.  
  6. #   ___|  _)  | _)       _)                         ___|                    
  7. # \___ \   |  |  |   __|  |  |   |  __ `__ \       |       _ \    __|  __ \  
  8. #       |  |  |  |  (     |  |   |  |   |   |      |      (   |  |     |   |
  9. # _____/  _| _| _| \___| _| \__,_| _|  _|  _|     \____| \___/  _|     .__/  
  10. #                                                                     _|  
  11. #Code source libre de droit. Si vous utilisez mon code, merci à vous d'en préciser la source.
  12.  
  13. #@Date : 03/11/2011
  14. #@Auteur : Silicium Corp
  15.  
  16. import serial          
  17. import time
  18. from threading import Thread
  19. import Queue
  20.  
  21. class ThreadSerialOutput(Thread):                                       #Class de gestion d'un thread de reception de données sur le port série
  22.     isActif = False                                                     #permet de savoir si le thread est actif
  23.     protocoleSerie = 0                                                  #initialise la variable qui va contenir le protocole serie     
  24.     shareStack = 0
  25. #===============================================================
  26.     def __init__(self, stackToShare, serialProtocol) :                  #Constructeur du thread : attend un objet de type Queue() et un autre de type serial.Seial()
  27.         try :
  28.             self.shareStack = stackToShare                              #Récupération de l'instance de la stack (Output Serial Stack)
  29.             self.protocoleSerie = serialProtocol                        #Récupération de l'instance de la session Serial
  30.             Thread.__init__(self)                                       #Appel du construsteur propre à l'objet Thread
  31.         except BaseException as err :                                  
  32.             print("Erreur lors de la creation du thread :\n!!! %s !!!"%err)    
  33. #===============================================================
  34.     def run (self):                                                     #méthode principale de l'objet Thread() Contenu executer lors de l'appel à thread.start()    
  35.         self.isActif = True                                             #On définie le boolean isActif à true
  36.         actualByte = 0
  37.         while self.isActif :                                            #Tans que le boolean isActif est à true
  38.             actualByte = self.protocoleSerie.read()                     #Si vous oubliez de definir le timeOut de lecture du protocole série, cette fonction sera blocante
  39.             try :
  40.                 if actualByte != "" :
  41.                     self.shareStack.put(actualByte,True,5)              #On enregistre l'octet reçu si celui ci différent de "rien"...
  42.                                                                         #...si une donnée est reçue mais que le thread ne parvient pas a en faire la saisi pendant + de 5 secondes, la stack est considérée pleine
  43.                     self.shareStack.task_done()                         #Chaque fin de timeOut précédent on indique au systeme que la tache de saisi dans la stack et pour l'instant terminée
  44.                 time.sleep(0.001)                                       #Si vous définissez le timeOut du protocole série à 0, permet au thread de ne pas prendre 100% d'un cpu
  45.             except :
  46.                 print("Stack pleine")                                                  
  47.                 pass
  48. #===============================================================
  49.     def kill (self):                                                    #Permet d'eteindre le thread
  50.         self.isActif = False                                            #Grace au timeout de la fonction self.shareStack.get(True, 5) on s'assure une vérification de l'etat self.isActif toutes les 5 secondes
  51. #===============================================================
  52.     def getIsActif (self):
  53.         return (self.isActif)                                           #Renvoie l'etat de l'activité du thread
  54. #===============================================================
  55.     def __del__(self) :
  56.         print ("- Thread Killed -")                                     #Indique juste que le thread est en fin de vie et que son destructeur a bien été appelé
  57. #===================================================================
  58. #====================    MAIN PRINCIPAL ============================
  59. #===================================================================
  60. if __name__ == "__main__":                                                 
  61.     print ("== Main ThreadSerialOutput==\n")                            #Début du programme (permet de savoir qui à lancé le programme) joue le role de Main par defaut.
  62.     protocoleSerie = serial.Serial()                                    #Initialisation du protocole Série
  63.     protocoleSerie.baudrate = 9600                                      #Initialisation de la vitesse du protocole 9600 BPS (Bauds per seconds)
  64.     protocoleSerie.port = 2                                             #Initialisation du port usb/serie utilisé (2 = COM3)
  65.     protocoleSerie.timeout = 0                                          #Permet de rendre non bloquante la lecture du port série.
  66.     stack = Queue.LifoQueue(32)                                         #Initialisation de la pile de reception, (Output Serial Stack) en mode LIFO (Last In, First Out) pour garder les elements dans l'ordre
  67.    
  68.     thrd = ThreadSerialOutput(stack, protocoleSerie)                    #On envoie la stack et le protocole série à la déclaration du thread
  69.  
  70.     try :
  71.         protocoleSerie.open()                                           #Ouverture du dialogue série
  72.         thrd.start()                                                    #On active le thread
  73.         for i in range(15) :                                            #Micro test : On attend à 15 reprises pendant 10 secondes la lecture de donnée dans notre stack (Output Serial Stack)
  74.             try :                                                          
  75.                 print("Data =>%s<="%stack.get(True,10))                 #Si un delai de 10 secondes s'ecoule sans recevoir de data, on le signal
  76.             except :
  77.                 print("no data")
  78.                 pass
  79.         thrd.kill()                                                     #Pour mettre fin au thread
  80.         stack.join()                                                    #On s'assure que la stack n'a pas encore quelques actions à finir
  81.        
  82.     except BaseException as err:
  83.         print("*** Erreur lors de la connexion serie :\n!!! %s !!!"%err)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement