Seriel Port Datentypen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
mr_n12345
User
Beiträge: 7
Registriert: Mittwoch 13. Oktober 2021, 12:07

Hallo an alle,

zuerst mal bin neu hier und falls ich etwas falsch mache, bitte um Nachsicht!

mein erste Frage ist, ob es eine Möglichekit gibt , um zu überprüfen ob per seriel port etwas gesendet wird?

also etwas wie:

Code: Alles auswählen

ser = serial.Serial('COM4', 115200)
cc=ser.readline()
if cc == NONE:
print("Error")
oder so???

Und meine andere Frage wäre, wie ich meine Empfangenen Daten vergleichen könnte?
Im unteren Code würde ich gerne die If:

Code: Alles auswählen

        
if a == "Hand sends:":
print("Reciving from Hand")
verwenden, aber der Code gibt nie was aus bzw. springt nie in die If schleife!?

Hier mein kompletter Code:

Code: Alles auswählen

import serial

ser = serial.Serial('COM4', 115200)
if (ser.isOpen()):
    while True:
        cc=ser.readline()
        #print(cc)
        a = cc.decode()
        #print(a)

        if a == "Hand sends:":
            print("Reciving Hand Quaternions")
else:
    print ("Port not open")
Der Output vom Code ist:
Hand sends:
1.00
-0.00
Danke schon mal an alle die Antworten!
Schönen Tag!!!
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt keine if-Schleife. Das ist eine if-Anweisung. Um Ausdruecke in if-Anweisungen gehoeren keine Klammern. Wenn man ein Serial-Objekt anlegt, ist das immer automatisch geoeffnet, oder es gibt einen Fehler, das muss man also nicht pruefen. Auf None prueft man mit dem is-Operator, also

Code: Alles auswählen

if wert is None:
Aber den Fall hast du nicht, denn laut https://pyserial.readthedocs.io/en/late ... ial.Serial ist das Verhalten fuer readline entweder zu warten, bis eine Zeile geliefert wird, oder du hast einen timeout gesetzt (was du nicht hast laut Code), dann wuerdest du einen leeren Byte-String b"" bekommen.

Und deine Frage lautet, ob "per Serial port etwas gesendet wird" - ich glaube du verwechselst das, du pruefst ja auf einkommende Daten, also willst du wissen, ob etwas *empfangen* wird. Mir ist nicht so ganz klar, was du genau willst. Wie gesagt, readline blockiert einfach bis etwas kommt. Ist das nicht das gewuenschte Verhalten?

Zu guter Letzt: der vermeintliche Output passt nicht zum Code. Da ist keine print-Anweisung.
mr_n12345
User
Beiträge: 7
Registriert: Mittwoch 13. Oktober 2021, 12:07

Hallo, als erstes danke für die Antwort.
Ja sorry ich meinte empfangen!
Ok wusste nicht das
readline
solange blockiert bis etwas kommt, der tip mit dem timeout ist super.

Meine andere Frage war, warum mein code die IF Anweiseung

Code: Alles auswählen

        if a == "Hand sends:":
            print("Reciving Hand Quaternions")
nicht ausführt?

Ich denke es muss an den Datentypen liegen.
Wie gesagt bin neu in Python.

Danke fpr die Hilfe!
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn es nicht klappt, dann ist es nicht dasselbe. Kann es sein, dass dir ein newline fehlt? Du liest ja bis zu einem Zeilenendezeichen ("\n"), da musst du auch mit vergleichen. Oder es vorher mit string.strip() entfernen.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mr_n12345: Die ``if``-Anweisung wird ausgeführt wenn `readline()` zurückkehrt. Vielleicht wird der Code im ``if``-Block dann nicht ausgeführt. Das passiert wenn `a` nicht gleich "Hand sends:" ist. Entweder weil der Datentyp vom Wert von `a` nicht `str` ist, oder falls es eine Zeichenkette ist, dann weil der Wert nicht übereinstimmt. Kann beispielsweise passieren wenn `a` noch etwas enthält an das Du nicht gedacht hast — beispielsweise ein Wagenrücklaufzeichen oder ein Zeilenendezeichen.

Typ und tatsächlichen Inhalt könntest Du beispielsweise durch ein ``print(type(a), repr(a))`` vor dem ``if`` mal anschauen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
mr_n12345
User
Beiträge: 7
Registriert: Mittwoch 13. Oktober 2021, 12:07

Danke für die Antwort.
Ok das die If Anweisung nicht ganz stimmt merke ich auch.
Soweit ich weis, liest readline bis
# read a '\n' terminated line
Du meinst also ich müsste das \n mitabfragen?

danke
mr_n12345
User
Beiträge: 7
Registriert: Mittwoch 13. Oktober 2021, 12:07

oh super, danke.
Der letzte tipp mit

Code: Alles auswählen

print(type(a), repr(a))
hat mir geholfen.
Es hat tatsächlich an \r\n gelegen.
<class 'str'> 'Hand sends: \r\n'
Danke an alle!!!!!!!
mr_n12345
User
Beiträge: 7
Registriert: Mittwoch 13. Oktober 2021, 12:07

aber die Frage ob es eine möglichekit gibt um zu Überprüfen ob seriel port überhautp zeichen sendet habe ich nich nicht ganz gelöst bzw die antworten verstanden.

Wie gesagt ich würde einfach gerne den port schlisen wenn ich merke, dass seit 10sec ncihts mehr gesendet wurde.

Vlt wäre jemand so nett mir da kurz tipps zu geben?

Wie gesagt bin am anfang von python.

Danke!!!!
mr_n12345
User
Beiträge: 7
Registriert: Mittwoch 13. Oktober 2021, 12:07

und noch eine fragen, kann ich mit serial.readline() eine abfrage machen, dass er nach 3 gelesenen zeilen aufhören soll?
Igrendeine if oder while?

vlt hätte jemand einen ansatz für mich

DANKE!!!!!!!!!!!
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gezählt wird weder mit if noch mit while. Sondern mit for.
mr_n12345
User
Beiträge: 7
Registriert: Mittwoch 13. Oktober 2021, 12:07

Code: Alles auswählen

c = ser.read()
cc = c.decode()
print(type(cc), repr(cc))
if cc == "\n"
            
Jemand eine Erklärung für mich warum die

Code: Alles auswählen

if cc == "\n"
nicht funktioniert?
Fehlermeldung:
if cc == "\n"
^
SyntaxError: invalid syntax
Danke
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da fehlt was am Ende der Zeile. Und ein bisschen mehr Einsatz, statt im Minutentakt sich die absoluten Grundlagen erklaeren zu lassen, schadet nicht.
Antworten