Python liesst nur für paar Sekunden den Port aus

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Peter54
User
Beiträge: 4
Registriert: Sonntag 3. Dezember 2017, 10:23

Sonntag 3. Dezember 2017, 10:29

Code: Alles auswählen

import serial


ser = serial.Serial(port="/dev/rfcomm0",baudrate=9600,timeout=1)

try:
    ser.isOpen()
    print("Serial ist open")
except:
    print("Serial is not open")
    exit()


if (ser.isOpen()):
    try:
        while(1):
            print(ser.readline())

    except Exception:
        print("fehler")

else:
    print("joo")





Die Daten werden von einen Hc05 an den Raspi geschickt und von Python aus wird der Port ausgelesen.
Nur auf einmal funktioniert es nicht mehr mit den Port auslesen,wenn es mal klappt :K hört er nach paar Sekunden wieder auf



Hier ist ein Bild:
[img]
https://picload.org/view/dridloiw/bilds ... -.png.html
[/img]
__deets__
User
Beiträge: 2704
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 3. Dezember 2017, 12:22

Deine selbstgebaute Fehlerbehandlung verhindert leider, das man da etwas substantielles sagen kann. Nimm die mal raus, damit man die eigentliche Fehlermeldung sieht. Und poste die hier natürlich.
Sirius3
User
Beiträge: 7615
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 3. Dezember 2017, 13:14

@Peter54: um da etwas sagen zu können, muß ersteinmal die „Fehlerbehandlung" weg, das ist nämlich nur eine Fehlerverschleierung. Die unsinnige Prüfung, ob eine Port, den man eben geöffnet hat, auch wirklich offen ist, findet man überall ist aber unnötig. `if` und `while` brauchen keine Klammern.

Code: Alles auswählen

import serial

with serial.Serial(port="/dev/rfcomm0", baudrate=9600, timeout=1) as ser:
    for line in ser:
        print(line.strip())
Welche Fehlermeldung kommt dann hier?
Peter54
User
Beiträge: 4
Registriert: Sonntag 3. Dezember 2017, 10:23

Sonntag 3. Dezember 2017, 15:33

Code: Alles auswählen

 'device reports readiness to read but returned no data '
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
__deets__
User
Beiträge: 2704
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 3. Dezember 2017, 15:50

Na die Fehlermeldung ist doch recht eindeutig. Entweder ein anderer Prozess greift ebenfalls auf die Schnittstelle zu, oder das BT Gerät ist unzuverlässig verbunden. Welche von den Möglichkeiten musst du rausfinden, das können wir nicht.
Peter54
User
Beiträge: 4
Registriert: Sonntag 3. Dezember 2017, 10:23

Sonntag 3. Dezember 2017, 19:59

Wenn ich das Skript starte zeigt er mir nur für paar Sekunden die Sensoren-daten an bis er wieder abbricht.

Ich möchte nur die Daten die per Bluetooth versendet werden, einfach mit den Raspberry empfangen.
__deets__
User
Beiträge: 2704
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 3. Dezember 2017, 20:25

Das habe ich schon verstanden. Aber das Problem hat nichts mit Python bzw. deiner Programmierung zu tun. Sondern entweder hast du noch irgendwen/irgendetwas anderes, das dieses Bluetooth Geraet ansprechen will (zB ueber cron dein Skript mehrfach gestartet, oder irgend etwas anderes), oder du hast ein Problem mit der Verbindungsqualitaet. Wenn letzteres der Fall ist, musst du die entweder verbessern, oder dein Programm so umschreiben, das es mit gelegentlichen Verbindungsabbruechen zurecht kommt.
Peter54
User
Beiträge: 4
Registriert: Sonntag 3. Dezember 2017, 10:23

Sonntag 3. Dezember 2017, 22:06

Ich danke für deine Hilfe.....


Hiermit kommt auch meine letzte Frage.

Kannst du mir Beispiel schreiben, wie ich das mache das Python die Unterbrechung ignoriert?

Also damit ich mir ein Bild machen könnte.


Vg Peter
__deets__
User
Beiträge: 2704
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 3. Dezember 2017, 22:10

Du musst nur eine while-Schleife um das Ganze legen, in welcher du die Ausnahme "serial.serialutil.SerialException" abfaengst, und danach wird dann wieder alles neu aufgemacht

Code: Alles auswählen

import serial
 
while True:
     try:
          with serial.Serial(port="/dev/rfcomm0", baudrate=9600, timeout=1) as ser:
              for line in ser:
                  print(line.strip())
     except serial.serialutil.SerialException:
           print("retry")
 
Antworten