serial.readline Python

Salve a tutti ! Da poco mi sto cimentando nel liguaggio python e riesco ad inviare stringhe e a riceverle sul seriale di arduino. Sia in python che in vb.net però ho lo stesso problema: La lettura dei dati e la loro successiva elaborazione Mi interessa il python più che altro perchè lo uso da poco; comunque il codice è questo:

import serial
from time import sleep

arduino = serial.Serial("COM3", 9600)
x=0
while x != 100:  
   print arduino.readline()
   sleep(0.1)
   ser.close()

Il problema è che i valori li legge, li printa con un "quadrato" accanto, ma non variano come dovrebbero. Ho una fotocellula e sul serial monitor di arduino i valori variano correttamente, leggendoli da qui invece no

Ciao, vedendo il codice posso dire che di python sei a diggiuno, quindi studia le basi di python.

Brevemente:

crei un oggetto di nome "arduino" istanza di classe Serial contenuta nel file serial aggiunto tramite import serial. Il baudrate deve essere impostato correttamente, altrimenti l'ogetto arduino interpreta i dati in modo errato. Il while non esce mai perchè "x" è sempre diverso da 100.

Il ciclo while comprenede tutte le istruzione che sono identate rispetto alla parola while, quindi in questo caso anche ser.close() viene chiamato ripetutamente. L'oggetto "ser" non esiste e quindi il codice corretto è arduino.close().

while x != 100:
     print arduino.readline
     sleep(0.1)

arduino.close()

Ciao.

Cosa vuol dire che non variano correttamente? Se chiami l'oggetto serial.Serial "arduino", poi non puoi riferirti alle sue funzioni chiamandolo "ser" ;)

Io modificherei il codice come segue:

import serial
from time import sleep

arduino = serial.Serial("COM3", 9600)

x=0 #Te la lascio dichiarata: non so se ti serve ;)

while True:  
   print arduino.readline()
   sleep(0.1)
   arduino.close()

Fammi sapere se risolvi ;)

EDIT: Wooops: ci ho messo tantissimo a postare (oggi Infostrada è lenta assai...) e vedo che MauroTec ti ha già risposto ;) Comunque facci sapere :D

NeXTWay:

MauroTec:

Non ne ho mai "mangiato" di python perchè l'ho iniziato 3 giorni fa :D Comunque quel while ci sta solo per fare un ciclo continuo (100 è indicativo). Lo scopo è quello di avere praticamente un serial monitor in una form python, come quello dell'ide di arduino. Quindi se io faccio una lettura ogni 0.1 secondi perchè non cambiano i valori ? Lato arduino c'è semplicemente un Serial.println(analogRead(0)) dentro al void loop()

sciorty: Non ne ho mai "mangiato" di python perchè l'ho iniziato 3 giorni fa smiley-grin Comunque quel while ci sta solo per fare un ciclo continuo (100 è indicativo). Lo scopo è quello di avere praticamente un serial monitor in una form python, come quello dell'ide di arduino. Quindi se io faccio una lettura ogni 0.1 secondi perchè non cambiano i valori ? Lato arduino c'è semplicemente un Serial.println(analogRead(0)) dentro al void loop()

Definire una variabile x occupa un po' di memoria (è stupido preoccuparsene quando si usa un linguaggio interpretato, ma tant'è... =D) e rende il codice più difficile da leggere: un "while 1" o "while True" invece evita un passaggio e rende chiaro che si intende eseguire quel ciclo finché gira il programma.

Adesso non ho un kernel con i driver USB to Serial, quindi non posso provare... tu però prova a dare:

Serial.println(analogRead(0), DEC)

Vediamo cosa succede.

Altra idea: non ho mai usato pyserial, ma credo che tu non debba chiudere la connessione ogni volta... prova questo ^^

import serial
from time import sleep

arduino = serial.Serial("COM3", 9600)

while True:  
   print arduino.readline()
   sleep(0.1)

Ultima cosa: se vuoi sviluppare per Arduino (e ricevere aiuto), continua ad usare Python. VB.Net produce programmi compatibili solo con Windows e tanti qui usano OSX o Linux ;)

@NeXTWay:

ci ho messo tantissimo a postare (oggi Infostrada è lenta assai...)

No, è il server su cui è appoggiato questo forum che è lento o, forse, a corto di banda. Perché anche a me ci sta una vita a postare, mediamente 5 secondi per inviare un commento (quando va bene).

tanti qui usano OSX o Linux

Meno male che si può ancora scegliere ]:D

OT: ma... NeXT.... per i computer?

Quindi se io faccio una lettura ogni 0.1 secondi perchè non cambiano i valori ?

NeXTWay ti ha già risposto, e cioè chiudi la seriale fuori dal loop while identandola come ti ho mostrato altrimenti rientra nel loop. Dovresti cercare tra i metodi della classe serial l'equivalente di available() ricordo ci sia qualcosa che ritorna un valore se c'è un nuovo dato, se c'è un nuovo dato allora leggi e stampi. Tuttavia non usando da tempo python ho un ricordo vago della classe Serial, mi pare che readline legge una linea, quanto è lunga credo dipenda dal carattere di fine riga "\n" sempre che da arduino tu lo spedisca. Ricordo che si può leggere anche un carattere per volta.

Python è potente studialo bene ora che ti rimarra per sempre poi unisci python con il framework pyside per usare le librerie Qt in python così da fare applicazioni GUI.

Ciao.

@sciorty, se può essere utile prova a dare una lettura a questo articoletto: http://zuccala.blogspot.com/2010/03/arduino-e-seriale-python.html

scusatemi,il ser.close mi dev'essere scappato nella formattazione del codice, nel codice originale è fuori dall'iterazione. In ogni caso anche passando i valori in decimale non mi cambia niente.

NeXTWay: Ultima cosa: se vuoi sviluppare per Arduino (e ricevere aiuto), continua ad usare Python. VB.Net produce programmi compatibili solo con Windows e tanti qui usano OSX o Linux ;)

Esatto, visto che ho una live di macubuntu che voglio installare definitivamente mi era sorto questo problema :D

Se scrive come un quadrato o un accento potrebbe anche essere solo un errore sul settaggio delle velocita' tra la parte che scrive e quella che legge. Se non risolvi nel pomeriggio questa sera ti posso passare un po' di codice che uso di solito io

Federico: Se scrive come un quadrato o un accento potrebbe anche essere solo un errore sul settaggio delle velocita' tra la parte che scrive e quella che legge. Se non risolvi nel pomeriggio questa sera ti posso passare un po' di codice che uso di solito io

Aspetto te allora, grazie in anticipo :D

MauroTec: Tuttavia non usando da tempo python ho un ricordo vago della classe Serial, mi pare che readline legge una linea, quanto è lunga credo dipenda dal carattere di fine riga "\n" sempre che da arduino tu lo spedisca.

E infatti non lo spedivo, abituato con il vb non ho pensato a questi caratteri di escape(si chiamano così ?). Effettivamente adesso i valori sono "puliti" cioè senza quadrati accanto :D Ho una fotocellula sul A0 con dovuta resisteza tra gnd e pin e usando questo codice il problema rimane comunque lo stesso..è come se non aggiornasse.

void setup(){
  Serial.begin(9600);
}
void loop(){
   Serial.print(analogRead(A0));
   Serial.print("\n");
}

In poche parole metto il dito sulla fotocellula prima che il python printi i valori sulla shell e,una volta partita, i valori sono intorno al 100 come dovrebbero. ma quando lo tolgo il dito i valori sono comunque quelli, variano di 2-3 numeri in più o in meno a caso..

Una cosa che ho notato è che il led tx dopo un po' si spegne durante la trasmissione..

Non potresti fare:

Serial.println(analogRead(A0));

? Così \n te lo mette in automatico.

leo72: Non potresti fare:

Serial.println(analogRead(A0));

? Così \n te lo mette in automatico.

E' quello che facevo ma mi leggeva anche un carattere sconosciuto indicato con un "quadrato"