Go Down

Topic: Seriale 0.23 vs 1.02 vs 1.51 (Read 1 time) previous topic - next topic

Testato

Jan 06, 2013, 05:22 pm Last Edit: Jan 06, 2013, 05:29 pm by Testato Reason: 1
ho caricato il medesimo sketch con il quale ricevo una stringa inviata da processing
La stringa e' di 500 caratteri e la ricevo sulla usb quindi uart pin 0-1 a 115200bps

Lo sketch caricato con IDE 0.23 ne riesce a ricevere ~150
Lo sketch caricato con IDE 1.02 ne riesce a ricevere ~70
Lo sketch caricato con IDE 1.51 ne riesce a ricevere ~70

come mai c'e' questa differenza ?
C'e' un modo per ricevere tutta la stringa di 500 caratteri ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72


ho caricato il medesimo sketch con il quale ricevo una stringa inviata da processing
La stringa e' di 500 caratteri e la ricevo sulla usb quindi uart pin 0-1

Lo sketch caricato con IDE 0.23 ne riesce a ricevere ~150
Lo sketch caricato con IDE 1.02 ne riesce a ricevere ~70
Lo sketch caricato con IDE 1.51 ne riesce a ricevere ~70

come mai c'e' questa differenza ?
C'e' un modo per ricevere tutta la stringa di 500 caratteri ?


Dall'IDE 1.x in poi la seriale è gestita via interrupt ed il buffer interno è stato dimezzato.
Prova intanto ad aumentare i buffer modificando il file:
1.0.x: hardware/arduino/cores/arduino/HardwareSerial.cpp
1.5.1: hardware/arduino/avr/cores/HardwareSerial.cpp
alla riga 59 trovi "64", metti "128", il valore che c'era nelle versioni 002x.

astrobeed


C'e' un modo per ricevere tutta la stringa di 500 caratteri ?


Devi svuotare il buffer della seriale mano a mano che arrivano i caratteri altrimenti lo riempi e quelli in più vanno persi.
Fino all'IDE 023 il buffer era di 128 caratteri, gestito da interrupt in ricezione e tramite polling in trasmissione senza nessun buffer.
Dall'IDE 1.x il buffer è di 64 caratteri in ricezione e 64 caratteri in trasmissione, tutti e due sono gestiti tramite interrupt quindi per inviare tot caratteri Arduino non si ferma fino a che non sono stati trasmessi tutti i caratteri come avveniva con l'IDE pre 1.x

Testato

#3
Jan 06, 2013, 06:17 pm Last Edit: Jan 06, 2013, 06:19 pm by Testato Reason: 1
Ho allargato a 128 il buffer descritto da Leo, e poi anche a 256
Quote
#if (RAMEND < 1000)
 #define SERIAL_BUFFER_SIZE 16
#else
 #define SERIAL_BUFFER_SIZE 256 // Originalmente 64
#endif


Il risultato e' ottimo, con 128 sono ritornato alle vecchie prestazioni e con 256 le ho superate.

Domande:
0: Parliamo di 256Byte o bit ?
1: Quale e' la contropartita ? Sono 256Byte/bit fermi, sempre allocati giusto, quindi tolti alla Ram ?, Ci sono altri problemi ?
2: Quell #if (RAMEND < 1000) che significa ? Forse che se la Ram scende sotto i 1000 Byte (oppure bit) il buffer si autoriduce ?
3: Astro io non ho usato nessun delay, la velocita' di lettura e svuotamento buffer e' al massimo, c'e' un solo delay di un millesimo di secondo nel codice proprio della lettura seriale
Code: [Select]
while (Serial.available())
        {
 delay(1);
 if (Serial.available() >0)
                {
         char c = Serial.read();

Posso provare a toglierlo o non serve ?
Tu hai altre idee che possano non farmi modificare manulmente il buffer ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

0 e 1:
Parliamo di BYTE quindi se metti 256 come valore del buffer, consumi (256*2)=512 byte del quantitativo totale di memoria. Ricorda che i buffer sono 2 (RX e TX). Sono ovviamente byte PERSI se inizializzi la seriale e poi non la usi.
2:
se la memoria totale (RAM) è inferiore a 1000, inizializza i buffer ristretti. E' un check per chip che hanno poca memoria RAM
3:
quel delay(1) non serve a nulla. Essendo ricezione e trasmissione gestite via interrupt, una volta che hai messo il/i byte nel buffer corrispondente, vengono spediti finché non sono finiti

Go Up