Arduino Input Werte auf Raspberry Pi ausgeben

Hallo Zusammen,

ich möchte Arduino Input Werte (float) auf meinem Raspberry Pi einlesen können. Sprich ich möchte die Werte auf meinem Linux-Terminal des Raspberry Pi ausgeben.

Zur Info: Der Arduino ist über einen USB-Kabel mit dem Raspberry Pi verbunden.

Das ist mein Arduino-Programm, mit dem ich Daten von meiner Schaltung auf meinen Serial Monitor übertrage:

int readPin = A2;
int v2 = 0;
int wait = 500;

void setup () {
pinMode(readPin,INPUT);
Serial.beginn (9600);
}

void loop () {
v2 = analogRead(readPin);
Serial.println(v2);
delay(wait);
}

Das ist mein Python-Programm auf dem Raspberry Programm, mit dem ich die Arduino Serial Daten auf Python ausgeben kann:

import serial

arduinoSerialData = serial.Serial('/dev/ttyUSB0',9600)

while (1==1):
     if (arduinoSerialData.inWaiting()>0):
          myData = float(arduinoSerialData.readline().decode('ascii'))
          print (myData)

Du kannst sehen, dass ich die Arduino-Werte in Python zu 'float' umwandele. Das Problem ist, dass ich MANCHMAL ein Error auf meinem Linux-Terminal bekomme. Wenn ich nach dem Error das Programm allerdings nocheinmal ausführe, kann Python die Werte aus meinem Arduino problemlos ausgeben.

Das ist die Fehlermeldung auf meinem Linux-Terminal:

Traceback (most recent call last):
   File "xyz.py", line 7, in <module>
      myData = float(arduinoSerialData.readLine().decode('ascii'))
Value Error: could not convert string to float: '\x00\n'

Das Problem ist, dass Python MANCHMAL versucht den Wert 'x00' in einen float umzuwandeln, was so nicht gehen kann. Manchmal will er dies gar nicht umwandeln, und ich kann problemlos die Arduino Werte auf dem Linux-Terminal ausgeben.

Ich wäre jeden Rat dankbar, wie man dieses Programm zu HUNDERT PROZENT funktionsfähig machen kann. Wie bringe ich Python dazu diesen einen Wert nicht umzuwandeln??

Lieben Dank.

Welchen Sinn soll es überhaupt haben, einen int-Wert (=Ganzzahl) in float zu wandeln?
Kann Python keinen Integer oder was versprichst Du Dir davon?

Gruß Tommy

(deleted)

kkeni:
ich möchte Arduino Input Werte (float) auf meinem Raspberry Pi einlesen können. Sprich ich möchte die Werte auf meinem Linux-Terminal des Raspberry Pi ausgeben.
Zur Info: Der Arduino ist über einen USB-Kabel mit dem Raspberry Pi verbunden.

Wenn Du den Arduino anstöpselst, wird ein Gerät in /dev erzeugt. Wie es erzeugt wird und heißt, siehst Du z. B., wenn Du beim Stöpseln /var/log/messages verfolgst (tail -f /var/log/messages). Das gibst Du an, wenn Du ein Terminalprogramm startest - ich verwende minicom. Dort sieht der Aufruf dann z. B. So aus:

minicom -D /dev/ttyUSB0 -b 9600

Und dort erscheinen dann die Meldungen, die Du auf dem Arduino mit Serial.print() und Co. erzeugst.

Gruß

Gregor

Hi

Wie immer: User-Eingaben NIE DIREKT benutzen - IMMER VERARBEITEN.
Also eingehende Daten prüfen, wenn Da was Sinnvolles drin steht, übernehmen, sonst verwerfen.
Denke, beim Empfang von 0x00 verhaspelt sich irgend etwas - ist ja auch egal - etwas mehr Fehler-Tolerant sollte Deine Funktion schon werden.

MfG

@Tommy56: Auf meinem Arduino-Programm hätte auch float stehen können. Trotzdem müsste ich auf Python den float-Wert aus dem Arduino-Programm in float umwandeln. Willst du wissen warum? Weil mein Python-Programm die Werte aus dem Serial Monitor direkt in bytes umwandelt. Und: Diese Bytes muss ich dann erstmal in floats umpacken.

@Peter-CAD-HST: Also ich sende nur integer-Werte von 0 bis 1023 an meinen Python-Programm. Mit diesem Zahlenbereich sollte Python umgehen und diesen in float umwandeln können. Dies tut er aber manchmal nicht. JA, das erwartet er. Ohne 'decoding (ascii)' würde ich hinter den Werten aus dem Arduino Serial Monitor komische Zeichen haben, womit Python nicht umgehen kann, weil er die komischen Zeichen nicht in float umwandeln kann.

@gregorss: Ja, aber ich muss doch in der Lage sein, wenn ich im Dateiordner im Linux-Terminal bin, meinen Programm mit dem Befehl 'sudo python3 xyz.py' ausführen zu können. Immer ins Wurzelverzeichnis auszuweichen, kann doch nicht die Lösung sein.

@postmaster-info: Vielen Dank für den Ratschlag. Das hilft mir weiter. In der Tat: Ich muss in meinen Python-Programm einen if-Statement implemetieren, der sagt, dass nur Bytes, die ausschließlich aus Zahlen bestehen, in float umgewandelt werden dürfen. Bei anderen Datentypen (string) soll er dies überspringen. Ich werde mich in diversen python-Foren schlau machen, wie ich solch eine Bedingung in meinen Code implementieren kann.

Wenn Du nur Integer-Werte von 0 bis 1023 an den Pi sendest, ist deren Umwandlung in Float völlig unsinnig, auch wenn Du es nicht begreifen willst/kannst.

Gruß Tommy

kkeni:
Immer ins Wurzelverzeichnis auszuweichen, kann doch nicht die Lösung sein.

Wo schreibe ich etwas von Wurzelverzeichnis?

Du kannst minicom ausführen, wo auch immer Du Dich befindest.

Gruß

Gregor

@tommy: Ja, es ist unsinnig. Hast recht. Aber testen schadet nie.

@gregorss: Habe davon nie was gehört. Ich werde das mal ausprobieren. Danke für den Rat.

Hallo,

Noch mal eine Anmerkung , ich glaube das ist Dir nicht ganz klar. Mit Serial.println(wert) sendest Du mehrer Ascii Zeichen als Text. Das hat zunächst mal nichts mit Integer oder Float zu tun. Da könnte ebenso abcd drin stehen, aber eben auch 1234 Du willst also auf der Pi Seite aus einer Zeichenkette einen float Wert machen. In C++ ging das mit atof.

Heinz

ich denke, das CR + LF im string gefällt float() nicht.
du könntest .strip() mal testen.
wobei es tatsächlich wenig sinn macht ganzzahl strings in float zu wandeln. das kannst auch später aus dem integer machen.

edit:
grad gesehen CR + LF ist es nicht, das 0 char gefällt ihm nicht.

harryberlin:
...
grad gesehen CR + LF ist es nicht, das 0 char gefällt ihm nicht.

Gerade solchen Kleinigkeiten kommt man mit einem Terminalprogramm (@OP: wie minicom :slight_smile: auf die Spur. Man loggt mit, was übertragen wird und guckt sich das dann mit einem geeigneten Programm an, was genau (an Bytes/chars ...) übertragen wurde.

Gruß

Gregor