Seite 1 von 2

senden über Com port RS 232

Verfasst: Mittwoch 29. April 2020, 14:53
von Micha_1909
Hallo zusammen ich bin der Micha und bin ein absoluter Python Neuling.
Ich habe in QT eine Applikation erstellt und kann die aufrufen.
Ich kann die Buttons auch benutzen.
Mein Problem ist es jedoch, dass ich einen string über einen Com port zu senden.
Pyserial hab ich bereits installiert und mein Programm kann ich auch starten.
Aber sobald ich was senden möchte endet das Programm mit einem Fehler.
Ich hoffe ihr könnt mir da helfen, was ich übersehen habe.


import serial
import sys
from PyQt5 import QtWidgets, uic
class MeinDialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = uic.loadUi("sign.ui", self)

#slots einrichten
self.ui.sedbut.clicked.connect(self.senden_but)
self.ui.pushButton_3.clicked.connect(self.open_but)
self.ui.pushButton_2.clicked.connect(self.close_but)
#self.ui.comboBox.currentIndexChanged.connect(self.activ_com)
#self.ui.comboBox_2.currentIndexChanged.connect(self.activ_baud)
#self.ui.comboBox.activated[str].connect(self.activ_com)
#self.ui.comboBox_2.activated[str].connect(self.activ_baud)

#aufgaben der einzelnen buttons

def senden_but(self):


ser.write('1234')

#except ValueError:
# show_Dialog()
pass

def open_but(self):

#serial port defination

ser = serial.Serial(
baudrate = 1200,
port = 'COM1',
timeout = None)
try:
ser.isOpen()
self.pushButton_3.setStyleSheet("background-color: green")
self.pushButton_3.setText('close')

except ValueError:
show_Dialog()
pass

def show_Dialog(self):
msg = QMessageBox ()
msg.setIcon(QMessageBox.Critical)
msg.setText("senden nicht möglich")
msg.setStandardButtons(QMessageBox.Ok)
pass

def close_but(self):
self.destroy()
pass



app = QtWidgets.QApplication(sys.argv)
dialog = MeinDialog()
dialog.show()
sys.exit(app.exec_())

Re: senden über Com port RS 232

Verfasst: Mittwoch 29. April 2020, 15:10
von __deets__
Bitte die Code-Tags benutzen, um deinen Code zu setzen. Das ist der </>-Knopf im erweiterten Editor. Denn so kann man dein Programm nicht entziffern, weil die Einrueckungen kaputt gegangen sind.

Und wenn du einen Fehler bekommst, dann zeig bitte auch den.

Re: senden über Com port RS 232

Verfasst: Mittwoch 29. April 2020, 15:31
von __blackjack__
@Micha_1909: Ich würde empfehlen vor der GUI-Programmierung erst einmal Objektorientierung ohne GUI zu lernen, denn das braucht man für GUIs. Sonst muss man objektorientierte Programmierung und GUI-Programmierung zusammen lernen.

Die ``pass``-Anweisungen machen alle keinen Sinn. Falls Dein Editor oder Deine IDE die automatisch einfügt, solltest Du das dem Programm abgewöhnen.

Entweder man bindet den Rückgaberwert von `loadUi()` an ein Attribut oder man übergibst der Funktion `self`. Beides macht keinen Sinn, denn dann hat man zwei Wege um an die selben Attribute zu gelangen. Da die Klasse von `QDialog` erbt, sollte man das `ui`-Attribut weg lassen und `self` übergeben.

Vewende vernünftige, beschreibende, nicht abekürzte, und nicht nummerierte Namen. Wenn `sedbut` eigentlich `send_button` heissen soll, dann nenn das auch so.

Die Methoden sollten dagegen dann nicht wie Buttons heissen. `send_button` ist ein guter Name für einen Button, aber keiner für eine Methode. Methoden und Funktionen werden üblicherweise nach der Tätigkeit benannt, die sie ausführen. Und da wird ja kein Button gesendet, sondern irgendwelche Daten.

``ser.isOpen()`` als Ausdruck ohne irgendetwas zusätzliches macht keinen Sinn. Zudem verwendet man die alten, nicht der Konvention entsprechenden Schreibweisen nicht mehr. Es gibt eine `is_open()`-Methode auf `Serial`-Objekten. Aber der Aufruf macht grundsätzlich hier keinen Sinn, denn der ergibt immer `True`. Die Erstellung hätte eine Ausnahme ausgelöst wenn das öffnen nicht geklappt hätte.

Ich sehe nicht wo da im ``try``-Block ein `ValueError` auftreten sollte.

`QMessageBox` wird nirgends definiert.

Re: senden über Com port RS 232

Verfasst: Mittwoch 29. April 2020, 18:00
von Micha_1909
@_blackjack_
vielen Dank für deine Vorschläge die werde ich gleich mal verbessern. Hast du vielleicht noch ein kleines Beispiel für mich wie ich dann über den Com was senden kann, bzw. definiert wird.
Das wäre super.

Re: senden über Com port RS 232

Verfasst: Mittwoch 29. April 2020, 18:01
von Micha_1909
@_deets_
Vielen Dank für den Tipp beim nächsten mal werde ich die Buttons verwenden.

Re: senden über Com port RS 232

Verfasst: Mittwoch 29. April 2020, 18:39
von __deets__
Wo bitte ist denn der tatsaechliche Fehler? Und das Programm in voller Schoenheit, mit </>-Knopf-Nutzung?

Re: senden über Com port RS 232

Verfasst: Mittwoch 29. April 2020, 19:01
von Micha_1909
@_deets_

Code: Alles auswählen

import serial
import sys
from PyQt5 import QtWidgets, uic
class MeinDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi("sign.ui", self)

        #slots einrichten
        self.ui.sedbut.clicked.connect(self.senden_but)
        self.ui.pushButton_3.clicked.connect(self.open_but)
        self.ui.pushButton_2.clicked.connect(self.close_but)
        #self.ui.comboBox.currentIndexChanged.connect(self.activ_com)
        #self.ui.comboBox_2.currentIndexChanged.connect(self.activ_baud)
        #self.ui.comboBox.activated[str].connect(self.activ_com)
        #self.ui.comboBox_2.activated[str].connect(self.activ_baud)

        #aufgaben der einzelnen buttons

    def senden_but(self):


            ser.write('1234')

        #except ValueError:
           # show_Dialog()
            pass

    def open_but(self):

        #serial port defination

        ser = serial.Serial(
                baudrate = 1200,
                port = 'COM1',
                timeout = None)
    

        try:
            ser.isOpen()
            self.pushButton_3.setStyleSheet("background-color: green")
            self.pushButton_3.setText('close')

        except ValueError:
            show_Dialog()
        pass

    def show_Dialog(self):
        msg = QMessageBox ()
        msg.setIcon(QMessageBox.Critical)
        msg.setText("senden nicht möglich")
        msg.setStandardButtons(QMessageBox.Ok)
        pass

    def close_but(self):
        self.destroy()
        pass



app = QtWidgets.QApplication(sys.argv)
dialog = MeinDialog()
dialog.show()
sys.exit(app.exec_())
ich hoffe, dass es geklappt hat.

Re: senden über Com port RS 232

Verfasst: Mittwoch 29. April 2020, 19:19
von __deets__
Ja, schon besser. Wobei du nicht den Fehler zeigst. Aber den kann ich auch so erkennen. Wenn du die serielle Schnittestelle woanders benutzen willst, als nur im Konstruktor (__init__), dann musst du die an die Instanz binden, so wie du das auch mit allen moeglichen anderen Dingen wie pushButtons etc. machst. Also

Code: Alles auswählen

...
self.ser = ...
...
self.ser.write(...)
Das ist wirklich absolute Python Objektorientierte-Programmierungs-Grundlage, es empfiehlt sich wenigstens mal ein paar Tutorials durchzuarbeiten, damit dir sowas kein Bein stellt.

Re: senden über Com port RS 232

Verfasst: Mittwoch 29. April 2020, 19:23
von Micha_1909
@_deets_

Vielen Dank für deine Hilfe.
Ja das werde ich machen oder ein Buch durcharbeiten.

Re: senden über Com port RS 232

Verfasst: Sonntag 3. Mai 2020, 16:40
von Micha_1909
Hi

@ _deets_ vielen Dank für deinen Code den du mir als Vorschlag gesendet hast , aber leider kann ich immer noch nichts senden. Als ob da noch was fehlt.
Testweise am Terminal kommt leider nix an.
Vielleicht hat noch jemand ne Idee in welcher Richtung ich noch suchen kann.

Re: senden über Com port RS 232

Verfasst: Sonntag 3. Mai 2020, 16:50
von __deets__
Bitte den vollstaendigen Code zeigen.

Re: senden über Com port RS 232

Verfasst: Sonntag 3. Mai 2020, 17:45
von Micha_1909

Code: Alles auswählen

import serial
import sys

from PyQt5 import QtWidgets, uic
class MeinDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi("sign.ui", self)

            #slots einrichten
        self.ui.sedbut.clicked.connect(self.senden_but)
        self.ui.pushButton_3.clicked.connect(self.open_but)
        self.ui.pushButton_2.clicked.connect(self.close_but)
        #self.ui.comboBox.currentIndexChanged.connect(self.activ_com)
        #self.ui.comboBox_2.currentIndexChanged.connect(self.activ_baud)
        #self.ui.comboBox.activated[str].connect(self.activ_com)
        #self.ui.comboBox_2.activated[str].connect(self.activ_baud)


        

    def open_but (self):

        self.port = serial.Serial(
            port='COM1',
            baudrate = 9600,
            timeout = 5)
        self.pushButton_3.setStyleSheet("background-color: green")
        self.pushButton_3.setText('close')

    def senden_but (self):
        self.port.write('1234')

    def close_but(self):
        self.destroy()





app = QtWidgets.QApplication(sys.argv)
dialog = MeinDialog()
dialog.show()
sys.exit(app.exec_())
@ _deets_

oben der geänderte Code.

Re: senden über Com port RS 232

Verfasst: Sonntag 3. Mai 2020, 17:59
von Micha_1909
Leider finde ich dazu nix, was mir helfen könnte.

Re: senden über Com port RS 232

Verfasst: Sonntag 3. Mai 2020, 18:13
von __deets__
Du schreibst keine Zeilenende-Zeichen. Das ist meistens bei seriellen Protokollen notwendig. Also statt '1234' musst du '1234\r\n' schreiben.

Re: senden über Com port RS 232

Verfasst: Sonntag 3. Mai 2020, 18:15
von __blackjack__
@Micha_1909: Starte das mal in einem Terminal. Da sollte dann die Ausnahme samt Traceback ausgegeben werden wenn Du auf den Senden-Button klickst. Da ist neben dem was __deets__ anmerkt nämlich noch ein Fehler drin.

Re: senden über Com port RS 232

Verfasst: Montag 4. Mai 2020, 04:39
von Micha_1909
@_blackjack_
@_deets_
ihr habt recht da ist noch ein AttributeError: ' MeinDialog' object has no attribute 'ser'
line 32 senden_but
self.ser.write('1234\r\n')

Re: senden über Com port RS 232

Verfasst: Montag 4. Mai 2020, 08:30
von __blackjack__
@Micha_1909: Ähm im letzten Code gab es kein `self.ser` da hiess das `self.port`. Aber nein das ist auch nicht der Fehler. Und falls Du keinen Fehler bekommst hast Du trotzdem einen, denn dann verwendest Du noch Python 2, was ein Fehler ist. 😎

Re: senden über Com port RS 232

Verfasst: Montag 4. Mai 2020, 08:50
von __deets__
“open_but” ist übrigens der beste Grund seit langem, auf Abkürzungen zu verzichten...

Re: senden über Com port RS 232

Verfasst: Montag 4. Mai 2020, 10:09
von Micha_1909
@_blackjack_
@_deets_

ja ich habe noch ein wenig probiert, ob ich den Fehler finde
und habe aus port -> ser gemacht.

Code: Alles auswählen

import serial
import sys

from PyQt5 import QtWidgets, uic
class MeinDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi("sign.ui", self)

            #slots einrichten
        self.ui.sedbut.clicked.connect(self.senden)
        self.ui.pushButton_3.clicked.connect(self.open)
        self.ui.pushButton_2.clicked.connect(self.close)
        #self.ui.comboBox.currentIndexChanged.connect(self.activ_com)
        #self.ui.comboBox_2.currentIndexChanged.connect(self.activ_baud)
        #self.ui.comboBox.activated[str].connect(self.activ_com)
        #self.ui.comboBox_2.activated[str].connect(self.activ_baud)

    def open (self):

        self.ser = serial.Serial(
            port='COM1',
            baudrate = 9600,
            timeout = 5)

        self.pushButton_3.setStyleSheet("background-color: green")
        self.pushButton_3.setText('close')

    def senden (self):
        self.ser.write('1234\r\n')

    def close(self):
        self.destroy()

app = QtWidgets.QApplication(sys.argv)
dialog = MeinDialog()
dialog.show()
sys.exit(app.exec_())

Re: senden über Com port RS 232

Verfasst: Montag 4. Mai 2020, 10:10
von Micha_1909
so sieht der Code jetzt aus