Logo Mon Club Elec

PyQt Lab’ : Port Série : en réception : Recevoir de façon asynchrone des paramètres numériques par réception de chaines spécifiques avec paramètre numérique reçue sur le port série (= décodage de « fonctions » différentes avec un seul paramètre numérique reçues sur le port série – affichage dans lcdNumber)

PyQt Lab’ : Port Série : en réception : Recevoir de façon asynchrone des paramètres numériques par réception de chaines spécifiques avec paramètre numérique reçue sur le port série (= décodage de « fonctions » différentes avec un seul paramètre numérique reçues sur le port série – affichage dans lcdNumber)

Par X. HINAULT – Juin 2013

PyQt Lab’ : Port Série : en réception : Recevoir de façon asynchrone des paramètres numériques par réception de chaines spécifiques avec paramètre numérique reçue sur le port série (= décodage de « fonctions » différentes avec un seul paramètre numérique reçues sur le port série – affichage dans lcdNumber)

Ce que l’on va faire ici

  • Dans ce code PyQt, je montre comment recevoir de façon asynchrone des paramètres numériques par réception de chaines spécifiques avec paramètre numérique reçue sur le port série (= décodage de « fonctions » différentes avec un seul paramètre numérique reçues sur le port série – affichage dans lcdNumber)

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: Sat Feb  9 17:19:53 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(653, 353)
        self.comboBoxPort = QtGui.QComboBox(Form)
        self.comboBoxPort.setGeometry(QtCore.QRect(10, 20, 121, 24))
        self.comboBoxPort.setEditable(True)
        self.comboBoxPort.setObjectName(_fromUtf8(« comboBoxPort »))
        self.comboBoxPort.addItem(_fromUtf8(«  »))
        self.comboBoxPort.addItem(_fromUtf8(«  »))
        self.comboBoxPort.addItem(_fromUtf8(«  »))
        self.comboBoxPort.addItem(_fromUtf8(«  »))
        self.labelPort = QtGui.QLabel(Form)
        self.labelPort.setGeometry(QtCore.QRect(10, 5, 101, 16))
        self.labelPort.setObjectName(_fromUtf8(« labelPort »))
        self.comboBoxDebit = QtGui.QComboBox(Form)
        self.comboBoxDebit.setGeometry(QtCore.QRect(10, 65, 121, 24))
        self.comboBoxDebit.setObjectName(_fromUtf8(« comboBoxDebit »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.labelDebit = QtGui.QLabel(Form)
        self.labelDebit.setGeometry(QtCore.QRect(10, 50, 111, 16))
        self.labelDebit.setObjectName(_fromUtf8(« labelDebit »))
        self.pushButtonInitSerial = QtGui.QPushButton(Form)
        self.pushButtonInitSerial.setGeometry(QtCore.QRect(135, 5, 41, 51))
        self.pushButtonInitSerial.setObjectName(_fromUtf8(« pushButtonInitSerial »))
        self.textEditReception = QtGui.QTextEdit(Form)
        self.textEditReception.setGeometry(QtCore.QRect(10, 215, 171, 136))
        self.textEditReception.setStyleSheet(_fromUtf8(« background-color: rgb(244, 255, 190); »))
        self.textEditReception.setObjectName(_fromUtf8(« textEditReception »))
        self.labelReception = QtGui.QLabel(Form)
        self.labelReception.setGeometry(QtCore.QRect(10, 195, 191, 16))
        self.labelReception.setObjectName(_fromUtf8(« labelReception »))
        self.line = QtGui.QFrame(Form)
        self.line.setGeometry(QtCore.QRect(10, 90, 166, 16))
        self.line.setFrameShape(QtGui.QFrame.HLine)
        self.line.setFrameShadow(QtGui.QFrame.Sunken)
        self.line.setObjectName(_fromUtf8(« line »))
        self.line_2 = QtGui.QFrame(Form)
        self.line_2.setGeometry(QtCore.QRect(10, 185, 166, 16))
        self.line_2.setFrameShape(QtGui.QFrame.HLine)
        self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
        self.line_2.setObjectName(_fromUtf8(« line_2 »))
        self.labelChaineEnvoi = QtGui.QLabel(Form)
        self.labelChaineEnvoi.setGeometry(QtCore.QRect(10, 105, 121, 16))
        self.labelChaineEnvoi.setObjectName(_fromUtf8(« labelChaineEnvoi »))
        self.lineEditChaineEnvoi = QtGui.QLineEdit(Form)
        self.lineEditChaineEnvoi.setGeometry(QtCore.QRect(10, 120, 166, 23))
        self.lineEditChaineEnvoi.setObjectName(_fromUtf8(« lineEditChaineEnvoi »))
        self.comboBoxFinLigne = QtGui.QComboBox(Form)
        self.comboBoxFinLigne.setGeometry(QtCore.QRect(10, 160, 121, 24))
        self.comboBoxFinLigne.setObjectName(_fromUtf8(« comboBoxFinLigne »))
        self.comboBoxFinLigne.addItem(_fromUtf8(«  »))
        self.comboBoxFinLigne.addItem(_fromUtf8(«  »))
        self.comboBoxFinLigne.addItem(_fromUtf8(«  »))
        self.comboBoxFinLigne.addItem(_fromUtf8(«  »))
        self.labelFinLigne = QtGui.QLabel(Form)
        self.labelFinLigne.setGeometry(QtCore.QRect(10, 145, 71, 16))
        self.labelFinLigne.setObjectName(_fromUtf8(« labelFinLigne »))
        self.pushButtonEnvoi = QtGui.QPushButton(Form)
        self.pushButtonEnvoi.setGeometry(QtCore.QRect(135, 145, 41, 41))
        self.pushButtonEnvoi.setObjectName(_fromUtf8(« pushButtonEnvoi »))
        self.line_3 = QtGui.QFrame(Form)
        self.line_3.setGeometry(QtCore.QRect(185, 5, 10, 331))
        self.line_3.setFrameShape(QtGui.QFrame.VLine)
        self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
        self.line_3.setObjectName(_fromUtf8(« line_3 »))
        self.line_4 = QtGui.QFrame(Form)
        self.line_4.setGeometry(QtCore.QRect(195, 215, 171, 16))
        self.line_4.setFrameShape(QtGui.QFrame.HLine)
        self.line_4.setFrameShadow(QtGui.QFrame.Sunken)
        self.line_4.setObjectName(_fromUtf8(« line_4 »))
        self.labelTraceEnvoiSerie = QtGui.QLabel(Form)
        self.labelTraceEnvoiSerie.setGeometry(QtCore.QRect(195, 225, 191, 16))
        self.labelTraceEnvoiSerie.setObjectName(_fromUtf8(« labelTraceEnvoiSerie »))
        self.textEditTraceEnvoiSerie = QtGui.QTextEdit(Form)
        self.textEditTraceEnvoiSerie.setGeometry(QtCore.QRect(195, 240, 171, 111))
        self.textEditTraceEnvoiSerie.setStyleSheet(_fromUtf8(« color: rgb(0, 0, 255);\n« 
« background-color: rgb(170, 255, 255); »))
        self.textEditTraceEnvoiSerie.setLineWrapMode(QtGui.QTextEdit.NoWrap)
        self.textEditTraceEnvoiSerie.setObjectName(_fromUtf8(« textEditTraceEnvoiSerie »))
        self.labelTraceAnalyseChaine = QtGui.QLabel(Form)
        self.labelTraceAnalyseChaine.setGeometry(QtCore.QRect(195, 5, 166, 16))
        self.labelTraceAnalyseChaine.setObjectName(_fromUtf8(« labelTraceAnalyseChaine »))
        self.textEditTraceAnalyseChaine = QtGui.QTextEdit(Form)
        self.textEditTraceAnalyseChaine.setGeometry(QtCore.QRect(195, 20, 171, 196))
        self.textEditTraceAnalyseChaine.setStyleSheet(_fromUtf8(« color: rgb(0, 170, 0);\n« 
« background-color: rgb(188, 255, 193);\n« 
«  »))
        self.textEditTraceAnalyseChaine.setLineWrapMode(QtGui.QTextEdit.NoWrap)
        self.textEditTraceAnalyseChaine.setObjectName(_fromUtf8(« textEditTraceAnalyseChaine »))
        self.lineEditRacine_1 = QtGui.QLineEdit(Form)
        self.lineEditRacine_1.setGeometry(QtCore.QRect(380, 40, 136, 23))
        self.lineEditRacine_1.setObjectName(_fromUtf8(« lineEditRacine_1 »))
        self.labelRacineChaine = QtGui.QLabel(Form)
        self.labelRacineChaine.setGeometry(QtCore.QRect(385, 5, 316, 16))
        self.labelRacineChaine.setObjectName(_fromUtf8(« labelRacineChaine »))
        self.line_6 = QtGui.QFrame(Form)
        self.line_6.setGeometry(QtCore.QRect(365, 20, 16, 316))
        self.line_6.setFrameShape(QtGui.QFrame.VLine)
        self.line_6.setFrameShadow(QtGui.QFrame.Sunken)
        self.line_6.setObjectName(_fromUtf8(« line_6 »))
        self.lcdNumber_1 = QtGui.QLCDNumber(Form)
        self.lcdNumber_1.setGeometry(QtCore.QRect(535, 35, 106, 40))
        self.lcdNumber_1.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_1.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_1.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_1.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_1.setObjectName(_fromUtf8(« lcdNumber_1 »))
        self.label_1 = QtGui.QLabel(Form)
        self.label_1.setGeometry(QtCore.QRect(535, 20, 121, 16))
        self.label_1.setObjectName(_fromUtf8(« label_1 »))
        self.label_2 = QtGui.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(535, 75, 121, 16))
        self.label_2.setObjectName(_fromUtf8(« label_2 »))
        self.lcdNumber_2 = QtGui.QLCDNumber(Form)
        self.lcdNumber_2.setGeometry(QtCore.QRect(535, 90, 106, 40))
        self.lcdNumber_2.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_2.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_2.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_2.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_2.setObjectName(_fromUtf8(« lcdNumber_2 »))
        self.label_3 = QtGui.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(535, 130, 121, 16))
        self.label_3.setObjectName(_fromUtf8(« label_3 »))
        self.lcdNumber_3 = QtGui.QLCDNumber(Form)
        self.lcdNumber_3.setGeometry(QtCore.QRect(535, 145, 106, 40))
        self.lcdNumber_3.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_3.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_3.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_3.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_3.setObjectName(_fromUtf8(« lcdNumber_3 »))
        self.label_4 = QtGui.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(535, 185, 121, 16))
        self.label_4.setObjectName(_fromUtf8(« label_4 »))
        self.lcdNumber_4 = QtGui.QLCDNumber(Form)
        self.lcdNumber_4.setGeometry(QtCore.QRect(535, 200, 106, 40))
        self.lcdNumber_4.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_4.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_4.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_4.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_4.setObjectName(_fromUtf8(« lcdNumber_4 »))
        self.lcdNumber_5 = QtGui.QLCDNumber(Form)
        self.lcdNumber_5.setGeometry(QtCore.QRect(535, 255, 106, 40))
        self.lcdNumber_5.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_5.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_5.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_5.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_5.setObjectName(_fromUtf8(« lcdNumber_5 »))
        self.label_5 = QtGui.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(535, 240, 121, 16))
        self.label_5.setObjectName(_fromUtf8(« label_5 »))
        self.lcdNumber_6 = QtGui.QLCDNumber(Form)
        self.lcdNumber_6.setGeometry(QtCore.QRect(535, 310, 106, 40))
        self.lcdNumber_6.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_6.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_6.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_6.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_6.setObjectName(_fromUtf8(« lcdNumber_6 »))
        self.label_6 = QtGui.QLabel(Form)
        self.label_6.setGeometry(QtCore.QRect(535, 295, 121, 16))
        self.label_6.setObjectName(_fromUtf8(« label_6 »))
        self.pushButtonStop = QtGui.QPushButton(Form)
        self.pushButtonStop.setGeometry(QtCore.QRect(135, 60, 41, 31))
        self.pushButtonStop.setObjectName(_fromUtf8(« pushButtonStop »))
        self.labelRacine_1 = QtGui.QLabel(Form)
        self.labelRacine_1.setGeometry(QtCore.QRect(385, 25, 121, 16))
        self.labelRacine_1.setObjectName(_fromUtf8(« labelRacine_1 »))
        self.labelRacine_2 = QtGui.QLabel(Form)
        self.labelRacine_2.setGeometry(QtCore.QRect(385, 80, 121, 16))
        self.labelRacine_2.setObjectName(_fromUtf8(« labelRacine_2 »))
        self.lineEditRacine_2 = QtGui.QLineEdit(Form)
        self.lineEditRacine_2.setGeometry(QtCore.QRect(380, 95, 136, 23))
        self.lineEditRacine_2.setObjectName(_fromUtf8(« lineEditRacine_2 »))
        self.labelRacine_3 = QtGui.QLabel(Form)
        self.labelRacine_3.setGeometry(QtCore.QRect(385, 135, 121, 16))
        self.labelRacine_3.setObjectName(_fromUtf8(« labelRacine_3 »))
        self.lineEditRacine_3 = QtGui.QLineEdit(Form)
        self.lineEditRacine_3.setGeometry(QtCore.QRect(380, 150, 136, 23))
        self.lineEditRacine_3.setObjectName(_fromUtf8(« lineEditRacine_3 »))
        self.labelRacine_4 = QtGui.QLabel(Form)
        self.labelRacine_4.setGeometry(QtCore.QRect(380, 190, 121, 16))
        self.labelRacine_4.setObjectName(_fromUtf8(« labelRacine_4 »))
        self.lineEditRacine_4 = QtGui.QLineEdit(Form)
        self.lineEditRacine_4.setGeometry(QtCore.QRect(380, 205, 136, 23))
        self.lineEditRacine_4.setObjectName(_fromUtf8(« lineEditRacine_4 »))
        self.labelRacine_5 = QtGui.QLabel(Form)
        self.labelRacine_5.setGeometry(QtCore.QRect(385, 245, 121, 16))
        self.labelRacine_5.setObjectName(_fromUtf8(« labelRacine_5 »))
        self.lineEditRacine_5 = QtGui.QLineEdit(Form)
        self.lineEditRacine_5.setGeometry(QtCore.QRect(380, 260, 136, 23))
        self.lineEditRacine_5.setObjectName(_fromUtf8(« lineEditRacine_5 »))
        self.labelRacine_6 = QtGui.QLabel(Form)
        self.labelRacine_6.setGeometry(QtCore.QRect(385, 300, 121, 16))
        self.labelRacine_6.setObjectName(_fromUtf8(« labelRacine_6 »))
        self.lineEditRacine_6 = QtGui.QLineEdit(Form)
        self.lineEditRacine_6.setGeometry(QtCore.QRect(380, 315, 136, 23))
        self.lineEditRacine_6.setObjectName(_fromUtf8(« lineEditRacine_6 »))

        self.retranslateUi(Form)
        self.comboBoxFinLigne.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate(« Form », « PyQt + PySerial : Terminal Série : Affiche valeurs reçues dans LCD Number x6 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxPort.setItemText(0, QtGui.QApplication.translate(« Form », « /dev/ttyACM0 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxPort.setItemText(1, QtGui.QApplication.translate(« Form », « /dev/ttyACM1 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxPort.setItemText(2, QtGui.QApplication.translate(« Form », « /dev/ttyUSB0 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxPort.setItemText(3, QtGui.QApplication.translate(« Form », « /dev/ttyUSB1 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelPort.setText(QtGui.QApplication.translate(« Form », « Port Série : », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(0, QtGui.QApplication.translate(« Form », « 115200 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(1, QtGui.QApplication.translate(« Form », « 57600 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(2, QtGui.QApplication.translate(« Form », « 38400 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(3, QtGui.QApplication.translate(« Form », « 28800 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(4, QtGui.QApplication.translate(« Form », « 19200 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(5, QtGui.QApplication.translate(« Form », « 14400 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(6, QtGui.QApplication.translate(« Form », « 9600 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(7, QtGui.QApplication.translate(« Form », « 4800 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelDebit.setText(QtGui.QApplication.translate(« Form », « Débit Série (bauds) : », None, QtGui.QApplication.UnicodeUTF8))
        self.pushButtonInitSerial.setText(QtGui.QApplication.translate(« Form », « Init », None, QtGui.QApplication.UnicodeUTF8))
        self.labelReception.setText(QtGui.QApplication.translate(« Form », « Réception sur le port série : « , None, QtGui.QApplication.UnicodeUTF8))
        self.labelChaineEnvoi.setText(QtGui.QApplication.translate(« Form », « Chaîne à envoyer : », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditChaineEnvoi.setText(QtGui.QApplication.translate(« Form », « CAN(12,23,45) », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxFinLigne.setItemText(0, QtGui.QApplication.translate(« Form », « Rien », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxFinLigne.setItemText(1, QtGui.QApplication.translate(« Form », « Saut de ligne (\\n = LF) », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxFinLigne.setItemText(2, QtGui.QApplication.translate(« Form », « Retour Chariot (\\r = CR) », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxFinLigne.setItemText(3, QtGui.QApplication.translate(« Form », « Les 2 (LF + CR) », None, QtGui.QApplication.UnicodeUTF8))
        self.labelFinLigne.setText(QtGui.QApplication.translate(« Form », « Fin de ligne : », None, QtGui.QApplication.UnicodeUTF8))
        self.pushButtonEnvoi.setText(QtGui.QApplication.translate(« Form », « Envoi », None, QtGui.QApplication.UnicodeUTF8))
        self.labelTraceEnvoiSerie.setText(QtGui.QApplication.translate(« Form », « Envoi sur le port série : « , None, QtGui.QApplication.UnicodeUTF8))
        self.labelTraceAnalyseChaine.setText(QtGui.QApplication.translate(« Form », « Analyse de la chaine recue : « , None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditRacine_1.setText(QtGui.QApplication.translate(« Form », « chaine1 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelRacineChaine.setText(QtGui.QApplication.translate(« Form », « Reco de la forme racine(**) : », None, QtGui.QApplication.UnicodeUTF8))
        self.label_1.setText(QtGui.QApplication.translate(« Form », « Valeur 1 », None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setText(QtGui.QApplication.translate(« Form », « Valeur 2 », None, QtGui.QApplication.UnicodeUTF8))
        self.label_3.setText(QtGui.QApplication.translate(« Form », « Valeur 3 », None, QtGui.QApplication.UnicodeUTF8))
        self.label_4.setText(QtGui.QApplication.translate(« Form », « Valeur 4 », None, QtGui.QApplication.UnicodeUTF8))
        self.label_5.setText(QtGui.QApplication.translate(« Form », « Valeur 5 », None, QtGui.QApplication.UnicodeUTF8))
        self.label_6.setText(QtGui.QApplication.translate(« Form », « Valeur 6 », None, QtGui.QApplication.UnicodeUTF8))
        self.pushButtonStop.setText(QtGui.QApplication.translate(« Form », « Stop », None, QtGui.QApplication.UnicodeUTF8))
        self.labelRacine_1.setText(QtGui.QApplication.translate(« Form », « Racine 1 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelRacine_2.setText(QtGui.QApplication.translate(« Form », « Racine 2 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditRacine_2.setText(QtGui.QApplication.translate(« Form », « chaine2 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelRacine_3.setText(QtGui.QApplication.translate(« Form », « Racine 3 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditRacine_3.setText(QtGui.QApplication.translate(« Form », « chaine3 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelRacine_4.setText(QtGui.QApplication.translate(« Form », « Racine 4 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditRacine_4.setText(QtGui.QApplication.translate(« Form », « chaine4 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelRacine_5.setText(QtGui.QApplication.translate(« Form », « Racine 5 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditRacine_5.setText(QtGui.QApplication.translate(« Form », « chaine5 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelRacine_6.setText(QtGui.QApplication.translate(« Form », « Racine 6 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditRacine_6.setText(QtGui.QApplication.translate(« Form », « chaine6 », 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 – Février 2013 – 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
import re # module pour analyse de chaîne avec expressions régulières
from numpy import interp # pour équivalent map

from tuto_pyqt_pyserial_terminal_chaine_param_num_widget_lcd_x6 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.pushButtonInitSerial, SIGNAL(« clicked() »), self.pushButtonInitSerialClicked)
                self.connect(self.pushButtonEnvoi, SIGNAL(« clicked() »), self.pushButtonEnvoiClicked)
                self.connect(self.pushButtonStop, SIGNAL(« clicked() »), self.pushButtonStopClicked)

                #initialisation Timer
                self.timer=QTimer() # déclare un timer Qt
                self.connect(self.timer, SIGNAL(« timeout() »), self.timerEvent) # connecte le signal timeOut de l’objet timer à l’appel de la fonction voulue

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

        # les fonctions appelées, utilisées par les signaux

        #—– les fonctions des signaux des boutons du Terminal série —-                            
        def pushButtonInitSerialClicked(self): # lors appui bouton initialisation série
                print(« Bouton Init cliqué »)
                if self.serialPort: # si le port existe déjà
                        self.serialPort.close() # ferme le port si existe

                # — initialise paramètres initialisation
                if self.comboBoxPort.currentText()==«  » : # si le champ d’initialisation Port est vide = initialisation par défaut
                        strPortInit=« /dev/ttyACM0 » # port par défaut
                else :
                        strPortInit=str(self.comboBoxPort.currentText()) #sinon utilise paramètre champ texte pour le port

                strDebitInit=str(self.comboBoxDebit.currentText()) # paramètre champ texte pour debit

                #— initialisation série avec gestion erreur —                      
                try: # essaie d’exécuter les instructions
                        # initialise port serie avec délai attente en réception en ms
                        self.serialPort=serial.Serial(strPortInit, strDebitInit, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, 0.100)                     
                        #self.serialPort=serial.Serial(strPortInit, strDebitInit) # initialise port serie forme réduite
                        self.serialPort.flushInput() # vide la file d’attente série
                        print(« Initialisation Port Série : «  + strPortInit + » @ «  + strDebitInit + » = OK « ) # affiche debug

                        #– change aspect bouton init
                        self.pushButtonInitSerial.setStyleSheet(QString.fromUtf8(« background-color: rgb(0, 255, 0); »)) # bouton en vert
                        self.pushButtonInitSerial.setText(« OK »)  # change titre bouton

                except: # si erreur initialisation
                        print(« Erreur initialisation Série »)           

                        #– change aspect bouton init
                        self.pushButtonInitSerial.setStyleSheet(QString.fromUtf8(« background-color: rgb(255, 127, 0); »)) # bouton en orange
                        self.pushButtonInitSerial.setText(QString.fromUtf8(« PB »))  # change titre bouton

                self.timer.start(10) # lance le timer avec délai en ms – 10 pour réception rapide

        def pushButtonEnvoiClicked(self): # lors appui bouton envoi série du champ du Terminal Série
                print(« Bouton ENVOI appuyé »)
                self.envoiChaineSerie(str(self.lineEditChaineEnvoi.text())) # envoi le contenu du champ texte sur le port série

        #—– fonction de classe commune d’envoi d’une chaîne sur le port série —-
        def envoiChaineSerie(self, chaineIn): # la fonction reçoit un objet chaîne Str

                if self.serialPort: # seulement si le port série existe – n’existe pas (=None) tant que pas initialisé

                        self.timer.stop() # stoppe le timer le temps d’envoyer message sur le port série               

                        # combobox avec index 0 = rien, 1=saut de ligne (LF), 2=retour chariot (CR), 3= les 2 LF+CR
                        if self.comboBoxFinLigne.currentIndex()==0: # si rien sélectionné
                                # self.serialPort.write(str(self.lineEditChaineEnvoi.text())+’\n’  ) # envoie la chaine sur le port serie              
                                self.serialPort.write(chaineIn)  # envoie la chaine sur le port serie   – variante ascii       
                                print(« Envoi Série : «  + chaineIn )
                                self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation

                        if self.comboBoxFinLigne.currentIndex()==1: # si saut de ligne sélectionné
                                self.serialPort.write(chaineIn +chr(10) ) # envoie la chaine sur le port serie  – variante ascii       
                                print(« Envoi Série : «  + chaineIn + \n)
                                self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation

                        if self.comboBoxFinLigne.currentIndex()==2: # si retour chariot sélectionné
                                self.serialPort.write(chaineIn+chr(13)  ) # envoie la chaine sur le port serie  – variante ascii       
                                print(« Envoi Série : «  + chaineIn + \r)
                                self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation

                        if self.comboBoxFinLigne.currentIndex()==3: # si saut de ligne + retour chariot sélectionné
                                self.serialPort.write(chaineIn+chr(10)+chr(13)  ) # envoie la chaine sur le port serie  – variante ascii
                                print(« Envoi Série : «  + chaineIn + \n+\r)
                                self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation

                        self.timer.start() # redémarre le timer – laisse délai pour réception en réinitialisation Timer à 0
                        # car sinon l’appui survient n’importe quand et si survient peu de temps avant fin délai
                        # la réception est hachée

        #— fin envoiChaineSerie

        #– fonction gestion clicked pushButton Stop
        def pushButtonStopClicked(self):
                print(« Bouton Stop cliqué »)

                #– stoppe la réception série —
                if self.serialPort: # si le port existe déjà
                        self.serialPort.close() # ferme le port si existe
                        self.timer.stop() # stoppe le timer

                #– change aspect bouton init
                self.pushButtonInitSerial.setStyleSheet(QString.fromUtf8(« background-color: rgb(255, 127, 0); »)) # bouton en orange
                self.pushButtonInitSerial.setText(QString.fromUtf8(« Off »))  # change titre bouton

        #– fin fonction gestion clicked pushButton Stop

        #—– fonction de gestion du signal timeout du QTimer
        def timerEvent(self): # fonction appelée lors de la survenue d’un évènement Timer – nom fonction indiférrent
                #– variables de réception —
                self.chaineIn=«  »;
                self.char=«  »;

                # lecture des données reçues           
                if self.serialPort: # seulement si le port série existe
                        self.timer.stop() # stoppe le timer le temps de lire les caractères et éviter « réentrée »

                        while (self.serialPort.inWaiting()): # tant que au moins un caractère en réception
                                self.char=self.serialPort.read() # on lit le caractère
                                #self.chaineIn=self.chaineIn+self.char          # forme minimale…

                                if self.char==\n: # si saut de ligne, on sort du while
                                        print(« saut ligne reçu ») # debug
                                        break # sort du while
                                else: #tant que c’est pas le saut de ligne, on l’ajoute à la chaine
                                        self.chaineIn=self.chaineIn+self.char                                  

                        flagDetect=False

                        if len(self.chaineIn)>0: # … pour ne pas avoir d’affichage si «  »     
                                print(self.chaineIn) # affiche la chaîne
                                self.textEditReception.append(self.chaineIn[:-1]) # ajoute le texte au textEdit en enlevant le dernier caractère (saut de ligne)

                                valeur1=self.analyseChaine(self.chaineIn[:-1], str(self.lineEditRacine_1.text())) # appelle la fonction d’analyse de chaine – renvoie liste Arguments
                                # l’utilisation de :-1 couplé à l’utilisation de )$ ci-dessous impose une fin de chaîne par ) une fois le saut de ligne enlevé                         
                                if valeur1!=None:
                                        if len(valeur1)==1: # si 1 paramètre reçu
                                                self.lcdNumber_1.display(int(valeur1[0]))
                                                flagDetect=True

                                if flagDetect!=True :
                                        valeur2=self.analyseChaine(self.chaineIn[:-1], str(self.lineEditRacine_2.text())) # appelle la fonction d’analyse de chaine – renvoie liste Arguments
                                        if valeur2!=None:
                                                if len(valeur2)==1: # si 1 paramètre reçu
                                                        self.lcdNumber_2.display(int(valeur2[0]))
                                                        flagDetect=True

                                if flagDetect!=True :
                                        valeur3=self.analyseChaine(self.chaineIn[:-1], str(self.lineEditRacine_3.text())) # appelle la fonction d’analyse de chaine – renvoie liste Arguments
                                        if valeur3!=None:
                                                if len(valeur3)==1: # si 1 paramètre reçu
                                                        self.lcdNumber_3.display(int(valeur3[0]))
                                                        flagDetect=True

                                if flagDetect!=True :
                                        valeur4=self.analyseChaine(self.chaineIn[:-1], str(self.lineEditRacine_4.text())) # appelle la fonction d’analyse de chaine – renvoie liste Arguments
                                        if valeur4!=None :
                                                if len(valeur4)==1: # si 1 paramètre reçu
                                                        self.lcdNumber_4.display(int(valeur4[0]))
                                                        flagDetect=True

                                if flagDetect!=True :                                          
                                        valeur5=self.analyseChaine(self.chaineIn[:-1], str(self.lineEditRacine_5.text())) # appelle la fonction d’analyse de chaine – renvoie liste Arguments
                                        if valeur5!=None :
                                                if len(valeur5)==1: # si 1 paramètre reçu
                                                        self.lcdNumber_5.display(int(valeur5[0]))
                                                        flagDetect=True

                                if flagDetect!=True :
                                        valeur6=self.analyseChaine(self.chaineIn[:-1], str(self.lineEditRacine_6.text())) # appelle la fonction d’analyse de chaine – renvoie liste Arguments
                                        if valeur6!=None:
                                                if len(valeur6)==1: # si 1 paramètre reçu
                                                        self.lcdNumber_6.display(int(valeur6[0]))

                        self.timer.start() # redémarre le timer

        #—- fin timerEvent

        #—- fonction analyse de chaine —
        def analyseChaine(self, chaineIn, chaineRacineIn): # fonction reçoit chaine à analyser et la racine à utiliser – reconnaît fonction racine(**)

                args=None # valeur par défaut de args
                flagRacine=False # drapeau racine OK

                self.textEditTraceAnalyseChaine.setText(QString.fromUtf8(« Chaine à analyser : «  + chaineIn)) # trace analyse chaine

                #result=re.findall(r’^.*\((.*)\).*$’,chaineIn) # extrait ** de la chaine au format –(**) si la chaîne est au format valide  
                result=re.findall(r‘^.*\((.*)\)$’,chaineIn) # extrait ** de la chaine au format –(**) si la chaîne est au format valide  
                self.textEditTraceAnalyseChaine.append(str(len(result)) + QString.fromUtf8( » chaine valide »)) # trace analyse chaine

                #racine=re.findall(r’^(.*)\(.*\).*$’,chaineIn) # extrait ** de la chaine au format **(–) si la chaîne est au format valide  
                racine=re.findall(r‘^(.*)\(.*\),chaineIn) # extrait ** de la chaine au format **(–) si la chaîne est au format valide  
                self.textEditTraceAnalyseChaine.append(str(len(racine)) + QString.fromUtf8( » racine valide »)) # trace analyse chaine

                #– analyse racine —          
                if len(racine)==1:
                        self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Racine reçue : « )+ racine[0]) # trace analyse chaine

                        if racine[0] == str(chaineRacineIn):
                                self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Racine reçue conforme »))# trace analyse chaine
                                flagRacine=True # flag racine OK
                        else:
                                self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Racine reçue non conforme »))# trace analyse chaine
                        # fin else

                # fin if

                if len(result)==1 and flagRacine: # si une seule chaine valide détectée et que la racine OK
                        #self.textEditTraceAnalyseChaine.append(QString.fromUtf8(result[0])) # trace analyse chaine : affiche la chaine des arguments
                        self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Paramètres reçus : »)) # trace analyse chaine : affiche la chaine des arguments
                        args=result[0].split(‘,’) # récupère la liste des arguments séparés par une parenthèse
                        self.textEditTraceAnalyseChaine.append(QString.fromUtf8(str(args))) # trace analyse chaine : affiche la liste des arguments

                        # boucle sans l’indice
                        #for valeur in args: # défile les arguments de la liste
                                #self.textEditTraceAnalyseChaine.append(QString.fromUtf8(str(valeur))) # trace analyse chaine : affiche la liste des arguments

                        # boucle avec indice
                        for i in range(0,len(args)): # défile indice args – attention range c’est valeur de départ, nombre de valeur donc range(0,3) défile de 0 à 2 !
                                valeur=int(args[i])
                                self.textEditTraceAnalyseChaine.append(QString.fromUtf8(str(valeur))) # trace analyse chaine : affiche la liste des valeurs int des arguments

                return args # renvoie la liste des arguments – None si pas d’arguments

                # pour tester en Terminal Python
                # analyse de la chaine
                        #chaine= »CAN(123,122,121) »
                        # result=re.findall(r’^.*\((.*)\)’,chaine) # extrait –(**)
                        # result=re.findall(r’^.*\((.*,.*,.*)\)’,chaine) # extrait –(*,*,*) = 3 paramètres
                        # sub=result[0].split(‘,’)
                        # print sub
                        # => 123, 122, 121
                        # print len(sub)
                        # => 3
                        # print int(sub[0])
                        # => 123

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

 

Code Arduino d’exemple

// Miroir Série : renvoie la chaine recue sur le port série
// par X. HINAULT – www.mon-club-elec.fr

// — Déclaration des variables globales —

 int octetReception=0; // variable de stockage des valeurs reçues sur le port Série
 String chaineReception=«  »; // déclare un objet String vide pour reception chaine

// ////////////////////////// 2. FONCTION SETUP = Code d’initialisation //////////////////////////
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission

} // fin de la fonction setup()
// ********************************************************************************

////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme //////////////////
// la fonction loop() s’exécute sans fin en boucle aussi longtemps que l’Arduino est sous tension

void loop(){ // debut de la fonction loop()

//—- code type réception chaine sur le port série —
while (Serial.available()>0) { // tant qu’un octet en réception
        octetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable

        if (octetReception==10) { // si Octet reçu est le saut de ligne
                Serial.println (chaineReception); // affiche la chaine recue
                chaineReception=«  »; //RAZ le String de réception
                break; // sort de la boucle while
        }
        else { // si le caractère reçu n’est pas un saut de ligne
                chaineReception=chaineReception+char(octetReception); // ajoute le caratère au String
                //Serial.print(char(octetReception)); // affiche la chaine recue
        }

} // fin tant que  octet réception

//—– une fois que le saut de ligne est reçu, on sort du While et on se positionne ici

} // fin de la fonction loop() – le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

 

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
  • Envoyer vers le port série une chaîne au format racine(valeur) avec racine étant le contenu de l’un des champs texte : le lcdNumber correspondant va se mettre à jour.
Noter cet article

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Archive Mon Club Elec

Articles populaires

Newsletter

Inscrivez-vous maintenant et bénéficiez d'un soutien continu pour réaliser vos travaux électriques en toute sécurité.