string in int umwandeln?

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
Biertschi
User
Beiträge: 3
Registriert: Montag 4. Januar 2021, 14:19

Hey Leute

Ich komm gleich mal zur Sache.

Mein Problem liegt darin, Zahlen die ich über die Serielle Schnittstelle mit einem Arduino übergebe als String beim Raspberry ankommen, ich möchte aber am Raspberry gerne mit diesen Zahlen weiterarbeiten können.
Alle Daten bzw Zahlen kommen an, soweit so gut.

Wie bekomm ich es nun hin den String in eine "int" bzw "float" Variable umzuwandeln?

Ich bekomme es beim besten Willen nicht auf die Reihe.
Hab mich auch durch diverse Seiten gesucht und auch hier im Forum bisschen was gefunden, leider half mir kein Lösungsansatz.

Vielleicht stehe ich auch einfach nur gewaltig auf der Leitung :? Wenn dem so ist, verzeiht mir bitte schon im Voraus :D

Code hänge ich natürlich an.


Arduino Code:
Senden von einfachen Zahlen zu Testzwecken.

Code: Alles auswählen

int daten[3] = {0,0,0};

const int potipin = A3;


int taster = 1;
int poti = 125;
int poti2 = 300;


void setup(){

    Serial.begin(9600);
    pinMode(potipin, INPUT);  
}

void loop(){

poti = map(analogRead(potipin), 0, 1023, 1000, 3000);

daten[0] = taster;
daten[1] = poti;
daten[2] = poti2;

  
  for(int i = 0; i<3; i++){
        
          Serial.print(daten[i]);
          Serial.print(",");
          
          delay(100);
  }
  
  Serial.println();
}

Raspberry Code:
Empfang und Ausgabe via Terminal

Code: Alles auswählen


import serial
import time

verbindung = serial.Serial('/dev/ttyACM0', 9600)
verbindung.isOpen()

print('Verbindung wird aufgebaut...')
time.sleep(5)
x=1

try:
    while True:
       # antwort = verbindung.readline()
        #print(antwort)
        #time.sleep(1)

        while (verbindung.inWaiting() == 0):
            pass
        arduinoString = verbindung.readline()
        dataArray = arduinoString.split(b',')
        taster = (dataArray[0])
        poti = (dataArray[1])
        poti2 = (dataArray[2])


        print("Taster=*")
        print(taster)
        print("Poti=")
        print(poti)
        print('Poti2=')
        print(poti2)
except KeyboardInterrupt:
    verbindung.close()
    
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

float("1.234")

respektive

int("1234")

ist alles.

Dein Code ist im uebrigen sehr ineffizient. Durch das while zum warten auf Daten - mit unnoetigen extra Klammern drum - dreht die CPU so lange frei, Daten ankommen. Dabei kannst du einfach in readline() stehen bleiben, bis eben eine Zeile angekommen ist.

Auch danach die extra Klammern um dataArray[0] etc sind vollkommen ueberfluessig. Ausser du packst gleich die notwendigen int/float-Aufrufe davor.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Was soll das delay in mitten der Prints? Für drei Zahlen, würde ich die nicht erst in ein Array packen und dann per for ausgeben. Auch wenn Blöcke per Klammern definiert werden, sollte man eine einheitliche Einrückung einhalten, allen schon wegen der Lesbarkeit.

Code: Alles auswählen

const int potipin = A3;
int taster = 1;
int poti = 125;
int poti2 = 300;

void setup(){
    Serial.begin(9600);
    pinMode(potipin, INPUT);
}

void loop(){
    poti = map(analogRead(potipin), 0, 1023, 1000, 3000);
    Serial.print(taster);
    Serial.print(",");
    Serial.print(poti);
    Serial.print(",");
    Serial.print(poti2);
    Serial.println();
    delay(400);
}
Was soll denn der isOpen-Aufruf, mit dessen Ergebnis Du gar nichts machst? An der Stelle ist sowieso garantiert, dass die Schnittstelle geöffnet ist.
Und was soll dann das sleep? Warum muß man 5 Sekunden warten, obwohl gar nichts passiert, also die Ausgabe "Verbindung wird aufgebaut" eine Lüge ist.
`x` wird definiert aber gar nicht verwendet.
Damit die Verbindung auch sicher wieder geschlossen wird, benutzt man with.
Variablennamen schreibt man komplett kein, und der Datentyp hat im Namen nichts verloren, vor allem, wenn das auch noch nicht stimmt. dataArray ist eine Liste.

Code: Alles auswählen

import serial

def main():
    with serial.Serial('/dev/ttyACM0', 9600) as verbindung:
        for data in verbindung:
            taster, poti, poti2 = map(float, data.split(b','))
            print("Taster=*", taster)
            print("Poti=", poti)
            print('Poti2=', pot2)

if __name__ == "__name__":
    main()
Biertschi
User
Beiträge: 3
Registriert: Montag 4. Januar 2021, 14:19

Danke für die schnelle Antwort.

ja hatte ich probiert, bekomme dann leider einen Syntaxerror.

Vielen Dank für den Tipp.

Diese Variante hab ich auch schon getestet -> ValueError

deshalb auch noch die überflüssigen Klammern vom rumprobieren, sry etwas schlampig.

Terminal Antwort 1

Code: Alles auswählen

pi@raspberrypi:~/Desktop $ python rza.py
  File "rza.py", line 21
    int taster = dataArray[0]
             ^
SyntaxError: invalid syntax
pi@raspberrypi:~/Desktop $ 
Terminal Antwort 2

Code: Alles auswählen

pi@raspberrypi:~/Desktop $ python rza.py
Verbindung wird aufgebaut...
Traceback (most recent call last):
  File "rza.py", line 21, in <module>
    taster = int (dataArray[0])
ValueError: invalid literal for int() with base 10: ''
pi@raspberrypi:~/Desktop $ 
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Strichpunkte am Ende... brrrr.... Echt jetzt?
In specifications, Murphy's Law supersedes Ohm's.
Biertschi
User
Beiträge: 3
Registriert: Montag 4. Januar 2021, 14:19

Arduino IDE = ";"

stimmt x wird nicht verwendet, es ist einfach nur ein Übungssketch in dem ich manche Sachen ausprobiere, daher werden aus Faulheit manche nicht wirklich störrende Variablen etc. nicht gleich wieder gelöscht oder zu einen anderen Zeitpunkt auch gleich wieder verwendet, desweiteren macht man beim lernen Fehler...

5 sekunden etwa braucht der arduino bis er bereit ist.

hat aber alles nichts mit der Frage zu tun...
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Es geht hier um Sorgfalt. Wenn überall noch Code herumliegt, der nicht mehr gebraucht wird, dann ist es schwierig die wirklich wichtigen Teile zu erkennen. Unsinnige Pausen tragen auch nicht zum Verständnis bei. Daher hängt alles mit allem zusammen.
Um den Fehler bewerten zu können, braucht man auch den Input.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Code: Alles auswählen

    taster = int (dataArray[0])
ValueError: invalid literal for int() with base 10: ''
sagt doch alles aus. dataArray[0] kann nicht in eine Zahl konvertiert werden, da es ein leerer String ist.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten