Milan
Offline
Newbie
Karma: 0
Posts: 44
|
 |
« on: April 04, 2011, 10:48:42 am » |
Salve! Mi chiedevo, se uno sketch usa la comunicazione seriale per mandare dati e alla fine non flusha.. cosa succede?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16470
Don't know what I do
|
 |
« Reply #1 on: April 04, 2011, 10:53:44 am » |
Il flush serve a svuotare il buffer di ricezione in modo da togliere di mezzo eventuali dati accumulati nello stesso, ricevuti quando la comunicazione non era monitorata o richiesta. Secondo me andrebbe eseguito PRIMA di iniziare una comunicazione e non dopo, proprio per evitare di leggere dati che erano già presenti nel buffer.
|
|
|
|
|
Logged
|
|
|
|
|
Milan
Offline
Newbie
Karma: 0
Posts: 44
|
 |
« Reply #2 on: April 04, 2011, 12:45:59 pm » |
E' possibile che se alla fine di uno sketch non svuoto il buffer con la flush, questo si sovraccarichi non consentendomi di uploadare altri sketch su arduino a causa del buffer pieno?
|
|
|
|
|
Logged
|
|
|
|
|
0
Online
Tesla Member
Karma: 82
Posts: 8232
:(){:|:&};:
|
 |
« Reply #3 on: April 04, 2011, 02:01:21 pm » |
no, l'arduino si resetta quando carichi il codice, al massimo il tuo arduino prova a scrivere subito sulla seriale incasinando il boot-loader.... metti una delay prima di scrivere sulla seriale nel setup()
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16470
Don't know what I do
|
 |
« Reply #4 on: April 04, 2011, 03:18:55 pm » |
Come ti ha consigliato lesto, metti SEMPRE un delay(3000) (minimo) in setup() per darti il tempo di aprire la seriale sul PC altrimenti l'Arduino ti apre subito la comunicazione non appena avviato bloccando la porta.
P.S.: uno sketch non termina mai di essere eseguito. La funzione loop() viene eseguita (come dice il nome stesso) in ciclo infinito. L'unico modo per terminare un programma è quello di spengere fisicamente l'Arduino.
|
|
|
|
|
Logged
|
|
|
|
|
Milan
Offline
Newbie
Karma: 0
Posts: 44
|
 |
« Reply #5 on: April 04, 2011, 03:34:36 pm » |
Come ti ha consigliato lesto, metti SEMPRE un delay(3000) (minimo) in setup() per darti il tempo di aprire la seriale sul PC altrimenti l'Arduino ti apre subito la comunicazione non appena avviato bloccando la porta.
P.S.: uno sketch non termina mai di essere eseguito. La funzione loop() viene eseguita (come dice il nome stesso) in ciclo infinito. L'unico modo per terminare un programma è quello di spengere fisicamente l'Arduino.
Esatto, la storia del loop mi era chiara. Allora mi è anche chiaro perchè quando attaccavo Arduino mi si impastava sempre! Non avevo messo il delay... E quindi mi dava sempre la seriale occupata e non mi faceva uploadare gli sketch! Diagnosi esatta? 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16470
Don't know what I do
|
 |
« Reply #6 on: April 04, 2011, 03:37:54 pm » |
Sì
|
|
|
|
|
Logged
|
|
|
|
|
Milan
Offline
Newbie
Karma: 0
Posts: 44
|
 |
« Reply #7 on: April 04, 2011, 03:39:16 pm » |
Quindi la struttura di base per uno sketch che cominica in seriale quale sarebbe? (Giusto per evitare ulteriori casini... E se per purissimo caso (  ) dovesse ricapitare cosa faccio?)
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16470
Don't know what I do
|
 |
« Reply #8 on: April 04, 2011, 03:52:57 pm » |
Quindi la struttura di base per uno sketch che cominica in seriale quale sarebbe? (Giusto per evitare ulteriori casini...
Nulla di particolare. Ricordati solo di mettere un delay(3000) proprio prima del Serial.begin, così che tu abbia circa 3 secondi per poter aprire il terminale. E se per purissimo caso (  ) dovesse ricapitare cosa faccio?) La "manovra di emergenza" descritta qui (circa a metà pagina).
|
|
|
|
|
Logged
|
|
|
|
|
Milan
Offline
Newbie
Karma: 0
Posts: 44
|
 |
« Reply #9 on: April 04, 2011, 04:01:04 pm » |
Grazie mille. Quindi la flush() in sostanza, quando va usata?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16470
Don't know what I do
|
 |
« Reply #10 on: April 04, 2011, 04:18:53 pm » |
Prima di leggere dalla seriale, se sai che il dispositivo trasmittente può inviare dati anche quando tu non li richiedi e tieni la connessione sempre aperta. In questo caso ciò che ricevi ma non leggi materialmente con Serial.read resta nel buffer e ti viene restituito non appena fai una lettura.
|
|
|
|
|
Logged
|
|
|
|
|
0
Online
Tesla Member
Karma: 82
Posts: 8232
:(){:|:&};:
|
 |
« Reply #11 on: April 04, 2011, 05:14:14 pm » |
diciamo che in linea di massima non dovresti mai usare la flush(), che comunque lavora solo sul buffer dei dati in ingresso
|
|
|
|
|
Logged
|
|
|
|
|
|