View  Edit  Attributes  History  Attach  Print  Search

PYQTLAB

PyQt Lab' : Port Série : réception : Initialiser le port série à l'aide d'un pushButton

Par X. HINAULT - Juin 2013

Ce que l'on va faire ici

  • Dans ce code PyQt, je montre comment initialiser le port série à l'aide d'un pushButton.

Pré-requis

  • python 2.7
  • pyqt4.x
  • modules :
    • python-serial

Téléchargement :

  • Ces codes sont disponibles ici :

Le fichier d'interface *.py

  • Fichier obtenu automatiquement avec l'utilitaire pyuic4 à partir du fichier *.ui créé avec QtDesigner :

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file
# Created: Thu Jan  3 15:58:46 2013
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(298, 65)
        self.pushButtonInit = QtGui.QPushButton(Form)
        self.pushButtonInit.setGeometry(QtCore.QRect(10, 15, 136, 31))
        self.pushButtonInit.setObjectName(_fromUtf8("pushButtonInit"))
        self.lineEditPort = QtGui.QLineEdit(Form)
        self.lineEditPort.setGeometry(QtCore.QRect(150, 20, 136, 23))
        self.lineEditPort.setObjectName(_fromUtf8("lineEditPort"))

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "PyQt + PySerial : Init Serial", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButtonInit.setText(QtGui.QApplication.translate("Form", "Initialiser Port Série", None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditPort.setText(QtGui.QApplication.translate("Form", "/dev/ttyACM0", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
 

Le fichier d'application *Main.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

# par X. HINAULT - Déc 2012 - Tous droits réservés
# GPLv3 - www.mon-club-elec.fr

# modules a importer
from PyQt4.QtGui import *
from PyQt4.QtCore import *  # inclut QTimer..
import os,sys

import serial # communication serie


from tuto_pyqt_pyserial_init_pushbutton import * # fichier obtenu à partir QtDesigner et pyuic4

class myApp(QWidget, Ui_Form): # la classe reçoit le Qwidget principal ET la classe définie dans test.py obtenu avec pyuic4
        def __init__(self, parent=None):
                QWidget.__init__(self) # initialise le Qwidget principal
                self.setupUi(parent) # Obligatoire

                #Ici, personnalisez vos widgets si nécessaire

                #Réalisez les connexions supplémentaires entre signaux et slots
                # connecte le signal Clicked de l'objet bouton à l'appel de la fonction voulue
                self.connect(self.pushButtonInit, SIGNAL("clicked()"), self.pushButtonInitClicked)

                #--- déclaration utiles ---
                self.serialPort=None # déclaration initiale


        # les fonctions appelées, utilisées par les signaux
        def pushButtonInitClicked(self):
                print("Bouton Init cliqué")
                if self.serialPort: # si le port existe déjà
                        self.serialPort.close() # ferme le port si existe

                # -- initialise paramètre initialisation
                if self.lineEditPort.text()=="" : # si le champ d'initialisation est vide = initialisation par défaut
                        chaineInit="/dev/ttyACM0" # par défaut
                else :
                        chaineInit=str(self.lineEditPort.text()) #avec paramètre champ texte

                #--- initialisation série avec gestion erreur ---                      
                try:
                        self.serialPort=serial.Serial(chaineInit, 115200) # initialise port serie
                        self.serialPort.flushInput() # vide la file d'attente série
                        print("Initialisation Port Série : /dev/ttyACM0 @ 115200 = OK ")
                        #-- change aspect bouton init
                        self.pushButtonInit.setStyleSheet(QString.fromUtf8("background-color: rgb(0, 255, 0);")) # bouton en vert
                        self.pushButtonInit.setText("Connexion OK")  # change titre bouton
                except: # si erreur initialisation
                        print("Erreur initialisation Série")                   
                        #-- change aspect bouton init
                        self.pushButtonInit.setStyleSheet(QString.fromUtf8("background-color: rgb(255, 127, 0);")) # bouton en orange
                        self.pushButtonInit.setText(QString.fromUtf8("Non connecté"))  # change titre bouton



def main(args):
        a=QApplication(args) # crée l'objet application
        f=QWidget() # crée le QWidget racine
        c=myApp(f) # appelle la classe contenant le code de l'application
        f.show() # affiche la fenêtre QWidget
        r=a.exec_() # lance l'exécution de l'application
        return r

if __name__=="__main__": # pour rendre le code exécutable
        main(sys.argv) # appelle la fonction main

 

Utilisation

  • Les 2 fichiers suivants sont à enregistrer dans un même répertoire, l'un en nom.py et l'autre en nomMain.py.
  • Puis lancer l'application depuis Geany ou équivalent, en exécutant le fichier nomMain.py
  • Connecter la carte Arduino et appuyer sur Init : le port série doit s'initialiser.