Pages: [1] 2   Go Down
Author Topic: i serial.print nello sketch "che influenza hanno"  (Read 2497 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

volevo sapere se in uno sketch  es: con molti serial.print   si possono considerare come se non esistessero se la porta usb viene scollegata,
oppure in qualche modo influenzano  le "prestazioni" anche se non c'e nessun usb collegata,
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22936
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'Arduino utilizza un chip accessorio per comunicare con il PC o comunque via USB (il famoso Atmega8U2 o 16U2 a seconda dei modelli). Questo chip ha un buffer, che il chip svuota comunicando con il computer.
Se spedisci a raffica dati sulla seriale senza che l'Arduino sia connesso al PC, quel buffer si satura e la schedina si pianta. E' la classica situazione in cui si accende la lucina gialla RX fissa e la scheda, se la spedizione avviene fin dall'avvio dello sketch, va "in palla" arrivando a richiedere la famosa manovra d'emergenza per sbloccarla.

Ergo, consiglio di non spedire sulla seriale se non usi la seriale  smiley-wink
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sicuramente ti influenzano le prestazioni...ogni istruzione ha un suo tempo di esecuzione quindi il codice sarà piu lento...considerà anche che ogni stringa di cui fai il print occupa spazio in RAM secondo me...

tempo fa avevo visto una cosa del genere:

Code:
#define DEBUG 1

#if DEBUG
    Serial.println("Debug version");
#endif

EDIT: Vedo che leo e' stato molto piu esaustivo di me smiley-razz ...cmq puoi usare quel pezzo di codice che ti ho dato per evitare di commentare tutte le volte i print su seriale...devi modificare solo la variabile DEBUG
« Last Edit: June 20, 2012, 01:50:15 pm by paolo_fiorini3 » Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L'Arduino utilizza un chip accessorio per comunicare con il PC o comunque via USB (il famoso Atmega8U2 o 16U2 a seconda dei modelli). Questo chip ha un buffer, che il chip svuota comunicando con il computer.
Se spedisci a raffica dati sulla seriale senza che l'Arduino sia connesso al PC, quel buffer si satura e la schedina si pianta. E' la classica situazione in cui si accende la lucina gialla RX fissa e la scheda, se la spedizione avviene fin dall'avvio dello sketch, va "in palla" arrivando a richiedere la famosa manovra d'emergenza per sbloccarla.

Ergo, consiglio di non spedire sulla seriale se non usi la seriale  smiley-wink

quindi anche se non è collegata l'usb tenta lo stesso di spedire, buono a sapersi,
allora d'avanti ai serial.print che "non servono nel progetto definivo " mettiamo due // davanti cosi lavorera meglio
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22936
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

quindi anche se non è collegata l'usb tenta lo stesso di spedire, buono a sapersi,
allora d'avanti ai serial.print che "non servono nel progetto definivo " mettiamo due // davanti cosi lavorera meglio
Sì, o commenti le righe, se sono poche, oppure adotti il metodo di Paolo, si tratta di una direttiva al compilatore.
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3428
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"che influenza hanno" in termini tecnici .... un botto!! smiley  io li uso come debug e sono molto importanti, ma la memoria occupata da queste righe è spaventosa, il rallentamento altrettanto, quando le levo mi torna il sorriso  smiley-grin
Logged

no comment

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"che influenza hanno" in termini tecnici .... un botto!! smiley  io li uso come debug e sono molto importanti, ma la memoria occupata da queste righe è spaventosa, il rallentamento altrettanto, quando le levo mi torna il sorriso  smiley-grin


infatti trovo che siano molto utili per quello  (assieme  a i delay lunghi messi apposta per leggere bene)
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sicuramente ti influenzano le prestazioni...ogni istruzione ha un suo tempo di esecuzione quindi il codice sarà piu lento...considerà anche che ogni stringa di cui fai il print occupa spazio in RAM secondo me...

tempo fa avevo visto una cosa del genere:

Code:
#define DEBUG 1

#if DEBUG
    Serial.println("Debug version");
#endif

EDIT: Vedo che leo e' stato molto piu esaustivo di me smiley-razz ...cmq puoi usare quel pezzo di codice che ti ho dato per evitare di commentare tutte le volte i print su seriale...devi modificare solo la variabile DEBUG

ma di preciso cosa fa e come si usa il codice che hai postato?
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22936
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Istruisce il compilatore a compilare oppure no determinate porzioni di codice.
Code:
#define DEBUG 1

#if DEBUG
    Serial.println("Debug version");
#endif
Crei una direttiva in cui dici al compilatore di sostituire tutte le istanze di DEBUG presente nel codice con il valore 1.
Poi dici: "se DEBUG (è vero)" quindi "se 1 (è vero)", compila anche il blocco seguente (fino all'endif). Siccome 1 è vero, viene compilato. Se tu mettevi #define DEBUG 0, tale controllo risultava falso e quel codice non veniva incluso nel tuo sketch.
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3428
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si anche se metti DEBUG=0; resta sempre il confronto che rallenta, in compilazione occupano una montagna di memoria delle istruzioni inutili, se non ti servono un bel // risolve smiley soprattutto un bel
//serial.begin(9600);
Logged

no comment

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22936
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No, scusa. Le direttive servono proprio per non far passare nel compilato finale le porzioni di codice che non interessano. Non stiamo parlando di un if generico ma di un check condizionale per il compilatore.

Se metti:

Code:
#define DEBUG 1
(....)
if (DEBUG) {
  Serial.Println("a");
}
Questo codice viene compilato e inserito nello sketch finale per cui ad ogni passaggio da quel punto l'Atmega esegue l'if.

Se metti
Code:
#define DEBUG 1
(....)
#if DEBUG
  Serial.Println("a");
#endif
quel serial.println non viene inserito nello sketch finale SOLO se DEBUG ha valore 0.
« Last Edit: June 20, 2012, 04:00:24 pm by leo72 » Logged


Genova
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3428
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si se hai delle direttive ok ... ma questo pezzo mi sfugge non l'ho capito
Quote
Se metti

#define DEBUG 1
(....)
#if DEBUG
  Serial.Println("a");
#endif

quel serial.println viene inserito nello sketch finale SOLO se DEBUG ha valore 0.
non dovrebbe essere inserito se valore DEBUG = 1?

ciao
Logged

no comment

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22936
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, scusa ho sbagliato. Volevo scrivere: "non viene inserito... ecc...". Ora correggo.
Stavamo comunque parlando di direttive, quindi se la direttiva è falsa, il codice non viene inserito. Non appesantisce quindi l'esecuzione dello sketch.
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3428
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

capito thx, comunque che non passassero dal compilato non lo sapevo ... mannaggia le sai tutte!!  smiley-mr-green io le levavo e mi toglievo il dubbio  smiley-twist
« Last Edit: June 20, 2012, 04:07:25 pm by pablos » Logged

no comment

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22936
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non serve solo a questo, ad esempioi puoi inserire nel codice dei dati in base al micro che stai usando o al clock di sistema. Se guardi dentro la mia libreria swRTC vedi un massiccio uso delle direttive perché lì ho dovuto rendere il codice compatibile con una dozzina di micro differenti, ed ogni famiglia di micro ha i suoi registri: un codice unico non andava bene, gli if avrebbero appesantito tutto. In fase di compilazione invece sistemo lo sketch per lo specifico micro su cui poi andrà a girare effettivamente il programma.
Logged


Pages: [1] 2   Go Up
Jump to: