Script überprüfen IndentationError: expected an indented block

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
winniwinkel
User
Beiträge: 2
Registriert: Samstag 14. Juli 2018, 11:00

Hallo
Ich versuche einen DYP-ME007Y Ultraschall Sensor mit meinem Raspberry 3 zu verbinden.
Da ich leider die Serial Ausführung bekommen habe musste ich lange suchen bis ich was dazu gefunden habe,
Nun habe ich Diese Programm gefunden aber leider wird es beim Ausführen auf dem Pi mit Fehlermeldungen
beendet.
Ich habe jetzt auch schon raus gefunden das das was mit dem " Einrücken " zu tun hat.
Da ich aber absolut keine Ahnung davon habe wollte ich mal auf Diesen weg fragen
ob einer von Euch da schnell mal rüber schauen kann.
Danke im Vorraus

Code: Alles auswählen

#Bibliotheken einbinden
import time
import serial



#seriellen Port einstellen
ser = serial.Serial("/dev/ttyAMA0")
ser.baudrate = 9600



#Funktionen
def distanze():
startbyte = ord(ser.read(1))
while startbyte <> 255:
startbyte = ord(ser.read(1))
                
hbyte = ord(ser.read(1))
lbyte = ord(ser.read(1))
sbyte = ord(ser.read(1))
        
distanz = hbyte * 256 + lbyte



summe = startbyte + hbyte + lbyte
summe = summe - (int(summe/256) * 256)
if summe <> sbyte:
distanz = 0
print(startbyte, hbyte, lbyte, sbyte, distanz)
                
return distanz



#Hauptprogramm
if __name__ == '__main__':
try:
while True:
abstanda = distanze()
abstandb = distanze()
vergleiche = 3
while vergleiche > 0:
vergleiche = vergleiche - 1
if abstanda == abstandb:
gleich = True
abstandb = abstanda
abstanda = distanze()
else:
gleich = False
break




if gleich == True:
print ("Gemessene Entfernung = " + str(abstandb) + " mm")
time.sleep(1)



# Beim Abbruch durch STRG+C resetten
except KeyboardInterrupt:
print(" Messung vom User gestoppt ")
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Kann es sein, dass du einen Fehler beim Kopieren oder Herunterladen gemacht hast? Denn die Einrückungen, die in Python Teil der Syntax sind, sind alle verschollen. Schau doch mal, ob du das Skript in der Originalversion (die in jedem Fall zur irgendeinem Zeitpunkt mal die Einrückungen enthalten haben muss) bekommen kannst. Ohne genaue Analyse der beabsichtigen Funktionsweise kann man es auch nicht so einfach rekonstruieren, da es an einigen Stellen mehrere mögliche Varianten, wie es mal ausgesehen haben könnte, gibt.
Zuletzt geändert von nezzcarth am Samstag 14. Juli 2018, 11:51, insgesamt 2-mal geändert.
winniwinkel
User
Beiträge: 2
Registriert: Samstag 14. Juli 2018, 11:00

Leider wurde es nicht anders Angezeigt.
Siehe https://forum-raspberrypi.de/forum/thre ... /?pageNo=1 beitrag 19
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Ich könnte mir vorstellen, dass es vielleicht mal so ausgesehen hat:

Code: Alles auswählen

#!/usr/bin/env python2
#Bibliotheken einbinden
import time
import serial

#seriellen Port einstellen
ser = serial.Serial("/dev/ttyAMA0")
ser.baudrate = 9600

#Funktionen
def distanze():
    startbyte = ord(ser.read(1))
    while startbyte <> 255:
        startbyte = ord(ser.read(1))
        hbyte = ord(ser.read(1))
        lbyte = ord(ser.read(1))
        sbyte = ord(ser.read(1))
        
        distanz = hbyte * 256 + lbyte
        summe = startbyte + hbyte + lbyte
        summe = summe - (int(summe/256) * 256)
        if summe <> sbyte:
            distanz = 0
            print(startbyte, hbyte, lbyte, sbyte, distanz)
                        
    return distanz


#Hauptprogramm
if __name__ == '__main__':
    try:
        while True:
            abstanda = distanze()
            abstandb = distanze()
            vergleiche = 3
            while vergleiche > 0:
                vergleiche = vergleiche - 1
                if abstanda == abstandb:
                    gleich = True
                    abstandb = abstanda
                    abstanda = distanze()
                else:
                    gleich = False
                    break

            if gleich == True:
                print ("Gemessene Entfernung = " + str(abstandb) + " mm")
                time.sleep(1)
        # Beim Abbruch durch STRG+C resetten
    except KeyboardInterrupt:
        print(" Messung vom User gestoppt ")
Ob das wirklich funktioniert, kann ich nicht sagen, da ich es nicht richtig testen kann (ich habe provisorisch die 'distanze'-Funktion so geändert, dass sie Zufallszahlen erzeugt). Bei den verschachtelten Einrückungen gibt es oft mehrere Möglichkeiten. Wenn es nicht funktioniert, bleibt dir wohl nichts anderes übrig, als Python (z.B. mit dem offiziellen Tutorial) soweit zu lernen, dass du es selbstständig ausprobieren und reparieren kannst. (Im Übrigen ist die Qualität des Skripts leider auch RaspberryPI üblich eher durchwachsen. Ich glaube, wenn du selbst ein bisschen Python lernst, bekommst du das schnell besser hin :) )
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@nezzcarth: die Einrückung war noch nicht ganz korrekt, da bin ich etwa verwirrt worden.

Code: Alles auswählen

import time
import serial

def distance():
    while True:
        if ser.read(1) == b"\xff":
            break
    hbyte = ord(ser.read(1))
    lbyte = ord(ser.read(1))
    sbyte = ord(ser.read(1))
    
    summe = (0xff + hbyte + lbyte) & 0xff
    if summe != sbyte:
        print(startbyte, hbyte, lbyte, sbyte)
        return 0
    return hbyte * 256 + lbyte


def main():
    try:
        with serial.Serial("/dev/ttyAMA0", baudrate=9600) as ser:
            while True:
                abstanda = distance()
                abstandb = distance()
                for trys in range(3):
                    if abstanda == abstandb:
                        abstanda = distance()
                    else:
                        break
                else:
                    print("Gemessene Entfernung = {} mm".format(abstandb))
                    time.sleep(1)
    except KeyboardInterrupt:
        print(" Messung vom User gestoppt ")

#Hauptprogramm
if __name__ == '__main__':
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: `startbyte` in `distance` ist undefiniert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@__blackjack__: stimmt, in wahrscheinlich will man aber sowieso etwas, das nicht uralte Werte ausspuckt, weil die sich noch im Inputbuffer tummeln:

Code: Alles auswählen

import time
from serial import Serial
from collections import deque

def read_distance(ser):
    ser.reset_input_buffer()
    buf = deque([0]*4, 4)
    while True:
        buf.append(ord(ser.read(1)))
        if buf[0] == 0xff and sum(buf[:3]) & 0xff == buf[4]:
            break
    return buf[1] * 256 + buf[2]

def main():
    try:
        with Serial("/dev/ttyAMA0", baudrate=9600) as ser:
            dist = deque(maxlen=3)
            while True:
                distances.append(read_distance(ser))
                if len(distances) == 3 and len(set(distances)) == 1:
                    distance = distances.pop()
                    print("Gemessene Entfernung = {} mm".format(distance))
                    time.sleep(1)
    except KeyboardInterrupt:
        print(" Messung vom User gestoppt ")

#Hauptprogramm
if __name__ == '__main__':
    main()
Antworten