Serial.print"ln" con python

quello che devo fare è far comunicare arduino più variabili a python
con arduino stampo sulla seriale un numero

void setup() {    
  Serial.begin(9600);
}

void loop() {
  x=287 //es.
  Serial.println(x);
  delay(1000);
}

il codice che uso per python è:

import serial
sr=serial.Serial("/dev/tty.usbmodemfd121", 9600)
while True:
    print sr.readline()

non capisco perché se uso Serial.print(x); (senza ln) python stà fermo senza stampare niente.
quello che serve a me è che arduino mi stampa 3 variabili senza andare a capo poi alla terza si.
nel senso

void loop() {
  x=287 //es.
  y=267
  z=379
  Serial.print(x);
  Serial.print(y);
  Serial.println(z);
  delay(1000);
}

ma così python non mi stampa niente sta' fermo ad aspettare non so cosa.
c'è qualcuno che mi può aiutare?

la butto lì, ma probabilmente il readline di python aspetta di ricevere un invio a capo,prima di restituire la stringa..oppure potresti settargli un timeout,se il readline di python lo prevede

anche io sono d'accordo con mi_ri...se tu gli chiedi di leggere una riga lui per forza aspetta i caratteri di fine riga per leggere l'informazione (volevo scrivere "riga" ma l'ho usato troppe volte in una frase XD).

giusto per capire tu vuoi che il pyton ti visualizzi a schermo 287 267 379 e poi vada a capo per ricevere il gruppo successivo di dati, potresti fare una modifica del genere

while True:
     x = sr.readline()
     print x
     println()  //non so come si scriva in pyton ma è per far capire

e nel codice arduino metti tutte println.
quello che sto pensando è questo...tu metti quello che leggi dal arduino in una variabile intera eliminando così qualunque traccia di \n\r che l'arduino possa aver inviato poi stampi tutti i valori interi sulla riga e poi quando non ci sono più valori da leggere (in questo caso dopo il terzo) metti un println manuale nel pyton...nella mia testa funziona però non ho idea se possa funzionare anche nella pratica

facci sapere :slight_smile:

risolto grazie.
avevo fatto uno sbaglio da principianti credevo di aver messo sulla variabile z (Serial.println(z):wink: la ln ma non l'avevo messa -.- mi dovrei sparare, ora ho fatto va tutto.
comunque non serve scrivere println() (che si scrive print senza niente) perché va automaticamente a capo a ogni stampo

c'è solo un piccolo problema
dato che con python posso leggere il singolo comando ma solo la riga mi ritrovo i numeri
x=287
y=267
z=379
stampati ovviamente in un unica riga. 287267379
(si deve ripetere trope volte riga :))
come posso aggiungere la virgola?
Serial.print(x","); //lo so che è sbagliato ma come devo fare?

puoi fare così

Serial.print(x);
Serial.print(,);
  Serial.print(y);
  Serial.print(,);
  Serial.println(z);

e poi sul pyton sono sicuro che c'è o un comando tipo string.split così ti dividi la stringa in 3 variabili a secondo di un carattere (,) oppure se non ti interessa salvare nelle variabili ma solo stampare a video ci deve essere un comando tipo string.replace dove sostituisci la virgola con uno spazio

si si c'è era quello che volevo fare.
variabile.split(",")