PyQt Lab est un outil puissant et intuitif qui permet aux utilisateurs de contrôler et de surveiller leurs systèmes à l’aide d’un port série. Il permet aux utilisateurs de recevoir et d’afficher jusqu’à 12 valeurs numériques sur des widgets d’affichage LCD, et de les convertir en unités. Cet article expliquera en détail comment configurer et utiliser PyQt Lab pour afficher des données reçues sur le port série.
PyQt Lab’ : Port Série : en réception : Affichage dans 12 widgets d’affichage LCD de 6 valeurs numériques reçues sur le port série et converties en unités.
Par X. HINAULT – Juin 2013

Ce que l’on va faire ici
- Dans ce code PyQt, une interface d’affichage dans 12 widgets d’affichage LCD de 6 valeurs numériques reçues sur le port série et converties en unités.
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 :
# Form implementation generated from reading ui file
#
# Created: Fri Feb 1 14:39:51 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(735, 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, 55, 166, 16))
self.labelTraceAnalyseChaine.setObjectName(_fromUtf8(« labelTraceAnalyseChaine »))
self.textEditTraceAnalyseChaine = QtGui.QTextEdit(Form)
self.textEditTraceAnalyseChaine.setGeometry(QtCore.QRect(195, 70, 171, 146))
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.lineEditRacineChaine = QtGui.QLineEdit(Form)
self.lineEditRacineChaine.setGeometry(QtCore.QRect(195, 20, 136, 23))
self.lineEditRacineChaine.setObjectName(_fromUtf8(« lineEditRacineChaine »))
self.labelRacineChaine = QtGui.QLabel(Form)
self.labelRacineChaine.setGeometry(QtCore.QRect(195, 5, 421, 16))
self.labelRacineChaine.setObjectName(_fromUtf8(« labelRacineChaine »))
self.line_5 = QtGui.QFrame(Form)
self.line_5.setGeometry(QtCore.QRect(195, 40, 166, 16))
self.line_5.setFrameShape(QtGui.QFrame.HLine)
self.line_5.setFrameShadow(QtGui.QFrame.Sunken)
self.line_5.setObjectName(_fromUtf8(« line_5 »))
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_A0 = QtGui.QLCDNumber(Form)
self.lcdNumber_A0.setGeometry(QtCore.QRect(380, 35, 106, 40))
self.lcdNumber_A0.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A0.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A0.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A0.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A0.setObjectName(_fromUtf8(« lcdNumber_A0 »))
self.labelVoie_A0 = QtGui.QLabel(Form)
self.labelVoie_A0.setGeometry(QtCore.QRect(380, 20, 121, 16))
self.labelVoie_A0.setObjectName(_fromUtf8(« labelVoie_A0 »))
self.labelVoie_A1 = QtGui.QLabel(Form)
self.labelVoie_A1.setGeometry(QtCore.QRect(380, 75, 121, 16))
self.labelVoie_A1.setObjectName(_fromUtf8(« labelVoie_A1 »))
self.lcdNumber_A1 = QtGui.QLCDNumber(Form)
self.lcdNumber_A1.setGeometry(QtCore.QRect(380, 90, 106, 40))
self.lcdNumber_A1.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A1.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A1.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A1.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A1.setObjectName(_fromUtf8(« lcdNumber_A1 »))
self.labelVoie_A2 = QtGui.QLabel(Form)
self.labelVoie_A2.setGeometry(QtCore.QRect(380, 130, 121, 16))
self.labelVoie_A2.setObjectName(_fromUtf8(« labelVoie_A2 »))
self.lcdNumber_A2 = QtGui.QLCDNumber(Form)
self.lcdNumber_A2.setGeometry(QtCore.QRect(380, 145, 106, 40))
self.lcdNumber_A2.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A2.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A2.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A2.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A2.setObjectName(_fromUtf8(« lcdNumber_A2 »))
self.labelVoie_A3 = QtGui.QLabel(Form)
self.labelVoie_A3.setGeometry(QtCore.QRect(380, 185, 121, 16))
self.labelVoie_A3.setObjectName(_fromUtf8(« labelVoie_A3 »))
self.lcdNumber_A3 = QtGui.QLCDNumber(Form)
self.lcdNumber_A3.setGeometry(QtCore.QRect(380, 200, 106, 40))
self.lcdNumber_A3.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A3.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A3.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A3.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A3.setObjectName(_fromUtf8(« lcdNumber_A3 »))
self.lcdNumber_A4 = QtGui.QLCDNumber(Form)
self.lcdNumber_A4.setGeometry(QtCore.QRect(380, 255, 106, 40))
self.lcdNumber_A4.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A4.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A4.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A4.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A4.setObjectName(_fromUtf8(« lcdNumber_A4 »))
self.labelVoie_A4 = QtGui.QLabel(Form)
self.labelVoie_A4.setGeometry(QtCore.QRect(380, 240, 121, 16))
self.labelVoie_A4.setObjectName(_fromUtf8(« labelVoie_A4 »))
self.lcdNumber_A5 = QtGui.QLCDNumber(Form)
self.lcdNumber_A5.setGeometry(QtCore.QRect(380, 310, 106, 40))
self.lcdNumber_A5.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n«
« color: rgb(85, 170, 0); »))
self.lcdNumber_A5.setFrameShape(QtGui.QFrame.Box)
self.lcdNumber_A5.setFrameShadow(QtGui.QFrame.Sunken)
self.lcdNumber_A5.setSegmentStyle(QtGui.QLCDNumber.Filled)
self.lcdNumber_A5.setObjectName(_fromUtf8(« lcdNumber_A5 »))
self.labelVoie_A5 = QtGui.QLabel(Form)
self.labelVoie_A5.setGeometry(QtCore.QRect(380, 295, 121, 16))
self.labelVoie_A5.setObjectName(_fromUtf8(« labelVoie_A5 »))
self.lineEditValeurMax_A0 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A0.setGeometry(QtCore.QRect(490, 40, 66, 16))
self.lineEditValeurMax_A0.setObjectName(_fromUtf8(« lineEditValeurMax_A0 »))
self.lineEditUnite_A0 = QtGui.QLineEdit(Form)
self.lineEditUnite_A0.setGeometry(QtCore.QRect(685, 45, 41, 23))
self.lineEditUnite_A0.setObjectName(_fromUtf8(« lineEditUnite_A0 »))
self.labelValeurMaxMin_A0 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A0.setGeometry(QtCore.QRect(490, 25, 71, 16))
self.labelValeurMaxMin_A0.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A0.setObjectName(_fromUtf8(« labelValeurMaxMin_A0 »))
self.lineEditValeurMin_A0 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A0.setGeometry(QtCore.QRect(490, 60, 66, 16))
self.lineEditValeurMin_A0.setObjectName(_fromUtf8(« lineEditValeurMin_A0 »))
self.labelUnite_A0 = QtGui.QLabel(Form)
self.labelUnite_A0.setGeometry(QtCore.QRect(685, 30, 51, 13))
self.labelUnite_A0.setObjectName(_fromUtf8(« labelUnite_A0 »))
self.lcdNumberValeurCalc_A0 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A0.setGeometry(QtCore.QRect(560, 25, 121, 51))
self.lcdNumberValeurCalc_A0.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A0.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A0.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A0.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A0 »))
self.lineEditUnite_A1 = QtGui.QLineEdit(Form)
self.lineEditUnite_A1.setGeometry(QtCore.QRect(685, 100, 41, 23))
self.lineEditUnite_A1.setObjectName(_fromUtf8(« lineEditUnite_A1 »))
self.labelValeurMaxMin_A1 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A1.setGeometry(QtCore.QRect(490, 80, 71, 16))
self.labelValeurMaxMin_A1.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A1.setObjectName(_fromUtf8(« labelValeurMaxMin_A1 »))
self.lineEditValeurMax_A1 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A1.setGeometry(QtCore.QRect(490, 95, 66, 16))
self.lineEditValeurMax_A1.setObjectName(_fromUtf8(« lineEditValeurMax_A1 »))
self.lcdNumberValeurCalc_A1 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A1.setGeometry(QtCore.QRect(560, 80, 121, 51))
self.lcdNumberValeurCalc_A1.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A1.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A1.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A1.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A1 »))
self.labelUnite_A1 = QtGui.QLabel(Form)
self.labelUnite_A1.setGeometry(QtCore.QRect(685, 85, 51, 13))
self.labelUnite_A1.setObjectName(_fromUtf8(« labelUnite_A1 »))
self.lineEditValeurMin_A1 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A1.setGeometry(QtCore.QRect(490, 115, 66, 16))
self.lineEditValeurMin_A1.setObjectName(_fromUtf8(« lineEditValeurMin_A1 »))
self.lineEditUnite_A2 = QtGui.QLineEdit(Form)
self.lineEditUnite_A2.setGeometry(QtCore.QRect(685, 155, 41, 23))
self.lineEditUnite_A2.setObjectName(_fromUtf8(« lineEditUnite_A2 »))
self.labelValeurMaxMin_A2 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A2.setGeometry(QtCore.QRect(490, 135, 71, 16))
self.labelValeurMaxMin_A2.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A2.setObjectName(_fromUtf8(« labelValeurMaxMin_A2 »))
self.lineEditValeurMax_A2 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A2.setGeometry(QtCore.QRect(490, 150, 66, 16))
self.lineEditValeurMax_A2.setObjectName(_fromUtf8(« lineEditValeurMax_A2 »))
self.lcdNumberValeurCalc_A2 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A2.setGeometry(QtCore.QRect(560, 135, 121, 51))
self.lcdNumberValeurCalc_A2.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A2.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A2.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A2.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A2 »))
self.labelUnite_A2 = QtGui.QLabel(Form)
self.labelUnite_A2.setGeometry(QtCore.QRect(685, 140, 51, 13))
self.labelUnite_A2.setObjectName(_fromUtf8(« labelUnite_A2 »))
self.lineEditValeurMin_A2 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A2.setGeometry(QtCore.QRect(490, 170, 66, 16))
self.lineEditValeurMin_A2.setObjectName(_fromUtf8(« lineEditValeurMin_A2 »))
self.lineEditUnite_A3 = QtGui.QLineEdit(Form)
self.lineEditUnite_A3.setGeometry(QtCore.QRect(685, 210, 41, 23))
self.lineEditUnite_A3.setObjectName(_fromUtf8(« lineEditUnite_A3 »))
self.labelValeurMaxMin_A3 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A3.setGeometry(QtCore.QRect(490, 190, 71, 16))
self.labelValeurMaxMin_A3.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A3.setObjectName(_fromUtf8(« labelValeurMaxMin_A3 »))
self.lineEditValeurMax_A3 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A3.setGeometry(QtCore.QRect(490, 205, 66, 16))
self.lineEditValeurMax_A3.setObjectName(_fromUtf8(« lineEditValeurMax_A3 »))
self.lcdNumberValeurCalc_A3 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A3.setGeometry(QtCore.QRect(560, 190, 121, 51))
self.lcdNumberValeurCalc_A3.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A3.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A3.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A3.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A3 »))
self.labelUnite_A3 = QtGui.QLabel(Form)
self.labelUnite_A3.setGeometry(QtCore.QRect(685, 195, 51, 13))
self.labelUnite_A3.setObjectName(_fromUtf8(« labelUnite_A3 »))
self.lineEditValeurMin_A3 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A3.setGeometry(QtCore.QRect(490, 225, 66, 16))
self.lineEditValeurMin_A3.setObjectName(_fromUtf8(« lineEditValeurMin_A3 »))
self.lineEditUnite_A4 = QtGui.QLineEdit(Form)
self.lineEditUnite_A4.setGeometry(QtCore.QRect(685, 265, 41, 23))
self.lineEditUnite_A4.setObjectName(_fromUtf8(« lineEditUnite_A4 »))
self.labelValeurMaxMin_A4 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A4.setGeometry(QtCore.QRect(490, 245, 71, 16))
self.labelValeurMaxMin_A4.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A4.setObjectName(_fromUtf8(« labelValeurMaxMin_A4 »))
self.lineEditValeurMax_A4 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A4.setGeometry(QtCore.QRect(490, 260, 66, 16))
self.lineEditValeurMax_A4.setObjectName(_fromUtf8(« lineEditValeurMax_A4 »))
self.lcdNumberValeurCalc_A4 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A4.setGeometry(QtCore.QRect(560, 245, 121, 51))
self.lcdNumberValeurCalc_A4.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A4.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A4.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A4.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A4 »))
self.labelUnite_A4 = QtGui.QLabel(Form)
self.labelUnite_A4.setGeometry(QtCore.QRect(685, 250, 51, 13))
self.labelUnite_A4.setObjectName(_fromUtf8(« labelUnite_A4 »))
self.lineEditValeurMin_A4 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A4.setGeometry(QtCore.QRect(490, 280, 66, 16))
self.lineEditValeurMin_A4.setObjectName(_fromUtf8(« lineEditValeurMin_A4 »))
self.lineEditUnite_A5 = QtGui.QLineEdit(Form)
self.lineEditUnite_A5.setGeometry(QtCore.QRect(685, 320, 41, 23))
self.lineEditUnite_A5.setObjectName(_fromUtf8(« lineEditUnite_A5 »))
self.labelValeurMaxMin_A5 = QtGui.QLabel(Form)
self.labelValeurMaxMin_A5.setGeometry(QtCore.QRect(490, 300, 71, 16))
self.labelValeurMaxMin_A5.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
self.labelValeurMaxMin_A5.setObjectName(_fromUtf8(« labelValeurMaxMin_A5 »))
self.lineEditValeurMax_A5 = QtGui.QLineEdit(Form)
self.lineEditValeurMax_A5.setGeometry(QtCore.QRect(490, 315, 66, 16))
self.lineEditValeurMax_A5.setObjectName(_fromUtf8(« lineEditValeurMax_A5 »))
self.lcdNumberValeurCalc_A5 = QtGui.QLCDNumber(Form)
self.lcdNumberValeurCalc_A5.setGeometry(QtCore.QRect(560, 300, 121, 51))
self.lcdNumberValeurCalc_A5.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n«
« color: rgb(255, 0, 0); »))
self.lcdNumberValeurCalc_A5.setSmallDecimalPoint(True)
self.lcdNumberValeurCalc_A5.setMode(QtGui.QLCDNumber.Dec)
self.lcdNumberValeurCalc_A5.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A5 »))
self.labelUnite_A5 = QtGui.QLabel(Form)
self.labelUnite_A5.setGeometry(QtCore.QRect(685, 305, 51, 13))
self.labelUnite_A5.setObjectName(_fromUtf8(« labelUnite_A5 »))
self.lineEditValeurMin_A5 = QtGui.QLineEdit(Form)
self.lineEditValeurMin_A5.setGeometry(QtCore.QRect(490, 335, 66, 16))
self.lineEditValeurMin_A5.setObjectName(_fromUtf8(« lineEditValeurMin_A5 »))
self.pushButtonStop = QtGui.QPushButton(Form)
self.pushButtonStop.setGeometry(QtCore.QRect(135, 60, 41, 31))
self.pushButtonStop.setObjectName(_fromUtf8(« pushButtonStop »))
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 brutes et conversion unités 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.lineEditRacineChaine.setText(QtGui.QApplication.translate(« Form », « CAN », None, QtGui.QApplication.UnicodeUTF8))
self.labelRacineChaine.setText(QtGui.QApplication.translate(« Form », « Racine à utiliser (reco de la forme racine(**,**,…,**,**) ) : », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A0.setText(QtGui.QApplication.translate(« Form », « Voie analogique A0 : », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A1.setText(QtGui.QApplication.translate(« Form », « Voie analogique A1 : », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A2.setText(QtGui.QApplication.translate(« Form », « Voie analogique A2 : », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A3.setText(QtGui.QApplication.translate(« Form », « Voie analogique A3 : », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A4.setText(QtGui.QApplication.translate(« Form », « Voie analogique A4 : », None, QtGui.QApplication.UnicodeUTF8))
self.labelVoie_A5.setText(QtGui.QApplication.translate(« Form », « Voie analogique A5 : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A0.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A0.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A0.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A0.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A0.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A1.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A1.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A1.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A1.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A1.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A2.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A2.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A2.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A2.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A2.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A3.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A3.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A3.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A3.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A3.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A4.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A4.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A4.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A4.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A4.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditUnite_A5.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
self.labelValeurMaxMin_A5.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMax_A5.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
self.labelUnite_A5.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
self.lineEditValeurMin_A5.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
self.pushButtonStop.setText(QtGui.QApplication.translate(« Form », « Stop », 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
# -*- coding: utf-8 -*-
# par X. HINAULT – Janv 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_can_widget_lcd_lineedit_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
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)
valeursCan=self.analyseChaine(self.chaineIn[:-1], str(self.lineEditRacineChaine.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é
# — affiche les valeurs dans les LCDNumbers —
if valeursCan!=None: # si la liste des arguments n’est pas vide
for i in range(0,len(valeursCan)): # 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(valeursCan[i])
if i==0 :
self.lcdNumber_A0.display(valeur) # affiche la valeur dans le LCDNumber voulu
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A0.text()),float(self.lineEditValeurMax_A0.text())]) # équiv map
self.lcdNumberValeurCalc_A0.display(valeurCalc)
if i==1 :
self.lcdNumber_A1.display(valeur) # affiche la valeur dans le LCDNumber voulu
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A1.text()),float(self.lineEditValeurMax_A1.text())]) # équiv map
self.lcdNumberValeurCalc_A1.display(valeurCalc)
if i==2 :
self.lcdNumber_A2.display(valeur) # affiche la valeur dans le LCDNumber voulu
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A2.text()),float(self.lineEditValeurMax_A2.text())]) # équiv map
self.lcdNumberValeurCalc_A2.display(valeurCalc)
if i==3 :
self.lcdNumber_A3.display(valeur) # affiche la valeur dans le LCDNumber voulu
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A3.text()),float(self.lineEditValeurMax_A3.text())]) # équiv map
self.lcdNumberValeurCalc_A3.display(valeurCalc)
if i==4 :
self.lcdNumber_A4.display(valeur) # affiche la valeur dans le LCDNumber voulu
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A4.text()),float(self.lineEditValeurMax_A4.text())]) # équiv map
self.lcdNumberValeurCalc_A4.display(valeurCalc)
if i==5 :
self.lcdNumber_A5.display(valeur) # affiche la valeur dans le LCDNumber voulu
# équiv map : interp(256,[1,512],[5,10]) (package numpy)
valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A5.text()),float(self.lineEditValeurMax_A5.text())]) # équiv map
self.lcdNumberValeurCalc_A5.display(valeurCalc)
# fin for
# fin if valeursCan!= None
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
// 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
- Saisir une chaine au format racine(val1, val2, val3? val4, val5, val6) : les valeurs doivent s’afficher dans les lcdNumber et les valeurs calculées également.
Articles Liés
- PyQt Lab' : Port Série : en réception : Réception de 6 valeurs numériques sur le port série, dans 6 QwtThermo, le widget d'affichage analogique « vu-mètre », conversion mesure/unité et affichage dans 12 widgets LCD.
PyQt Lab' : Port Série : en réception : Réception de 6 valeurs numériques sur…
- PyQt Lab' : Port Série : en réception : Réception de 6 valeurs numériques sur le port série, dans 6 QwtDial, le widget d'affichage analogique « à aiguille », conversion mesure/unité et affichage dans 12 widgets LCD.
PyQt Lab est un outil puissant qui permet aux utilisateurs de créer des applications graphiques…
- PyQt Lab' : Graphiques Math : Pyqtgraph + Pyserial : Afficher une courbe à partir de valeurs reçues sur le port série, avec widgets de paramétrage des axes
PyQt Lab est un outil puissant qui permet aux utilisateurs de créer des graphiques mathématiques…