return Rückgabe falsch



  • Hallochen allerseits, eine Frage vom völligen Anfänger:
    Zeile aus RFSniffer:

              printf ("%i\n", mySwitch.getReceivedValue());
              return (mySwitch.getReceivedValue());
    

    die Funktion wird von Python aufgerufen.
    printf gibt den Wert 1321 aus - was korrekt ist.

    #!/usr/bin/python3
    import os
    import time
    while True:
        dataReceive = os.system("sudo /home/pi/433Utils/RPi_utils/./RFSniffer")
        print("empfangen: ", dataReceive)
        print(type(dataReceive))
        relaisNr = int(dataReceive/1000)
        triggerWert = dataReceive - relaisNr * 1000
        print( "RelaisNr: ", relaisNr, " Wert: ", triggerWert)
        time.sleep(100)
    

    In Python kommt ein Integer mit dem Wert von 10496 an, wie ist das zu erklären? Wie kann das geändert werden???

    Danke für jede Hilfe....



  • was macht denn getReceivedValue()?

    Holt das evtl. einen Wert aus einer Art Puffer oder Eingabestrom?

    Dann wird beim return der nächste Wert geholt.



  • Ich habe mal die man page zu os.system durchgelesen.
    Das verweist für den Rückgabewert auf os.wait() und da steht: „ Wait for completion of a child process, and return a tuple containing its pid and exit status indication: a 16-bit number, whose low byte is the signal number that killed the process, and whose high byte is the exit status (if the signal number is zero); the high bit of the low byte is set if a core file was produced.“

    wegen „ and whose high byte is the exit status“ geht also nur ein Byte (0-255)

    Nebenbei 1321 ist 0x0529
    10496 ist 0x2900
    Das Low-Byte vom return-Wert ist die 0x29 das zum High-Byte wird.



  • Wenn man schon Systemcalls macht, dann würde ich nicht mehr mit os.system machen, sondern mit subprocess, siehe https://docs.python.org/3.9/library/subprocess.html (das soll laut Python-Doku os.system ersetzen). Dann bekommst du Ausgabe und Exitcode auch in ordentlicher Form zurück.



  • @wob sagte in return Rückgabe falsch:

    Wenn man schon Systemcalls macht, dann würde ich nicht mehr mit os.system machen, sondern mit subprocess

    Genau das war der Fehler. Ich hatte dann folgenden Python-Code bekommen:

    import subprocess
    import shlex
    cmd = "/home/pi/433Utils/RPi_utils/./RFSniffer"
    args = shlex.split(cmd)
    
    #def arduino():
    while True:
        process = subprocess.run(args, stdout=subprocess.PIPE)
        output = process.stdout
        wert = int(str(output)[2:6])
        relais = int(wert/1000)
        print("Relais: ",relais)
        bodenfeucht = wert - relais*1000
        print("Feuchte: ", bodenfeucht)
    

    erhalten. So funzt es. Mich irritiert aber noch leicht das

             // printf ("%i\n", mySwitch.getReceivedValue());
              return (mySwitch.getReceivedValue());
    

    in der C++ keine Rückgabe liefert... aber ich passe mich dem an 🙂

    Danke



  • Dein Python-Code sieht so aus, als ob Du auswertest, was Dein C-Programm ausgegeben hat, und ohne printf gibt das nun mal nichts aus ...



  • Subprocess.run gibt dir einen CompletedProcess zurück, den du nach dem returncode fragen kannst.


Log in to reply