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.