Cerca

modulo attività

modulo tecnica

Login Form

Cosa succede quando si invia alla stampa seriale una stringa molto lunga?

Si prova come al solito con misurazioni eseguite con l'oscilloscopio per misurare la durata di esecuzione dell'istruzione Serial.print().

L'articolo prosegue quanto affrontato qui.

Si usa lo sketch usuale dove il testo è composto da 79 volte il carattere "z" e da uno spazio finale " ".

serial Test 1

 

Con questo sketch vengono inviati impulsi sul pin D9 che servono a misurare la durata del comando Serial.print() della riga 30.

 

Si è già visto che una stringa di 40 caratteri in un unico blocco dà un risultato di durata dell'istruzione abbastanza prevedibile con l'uso dell'equazione della retta.

Se la stringa è composta da 80 caratteri il risultato atteso è calcolabile allo stesso modo:

t= 4,2 + 8,7*80 = 700,2µs

si va quindi a misurare la durata inserendo nel ciclo principale un ritardo di 100ms per essere sicuri che l'invio alla seriale non interferisca con il processo principale.

 

 

 

Risultato:

print80p2

 

 

 

risultato:

- il ritardo come differenza fra duratat del ciclo e durata dell'invio dei caratteri alla USART (intervallo print) è di 100ms (l'intervallo più ampio fra due gruppi di impulsi in rosso)

- il ciclo dura 11,6*10ms = 116ms

- l'invio dei caratteri sulla seriale si interrompe per 32ms che è un tempo piuttosto lungo  di idle dovuto al ritardo notevole introdotto nel ciclo, questo significa che la USART non allunga artificialmente la durata dell'esecuzione dell'istruzione Serial.print() in quanto l'invio alla seriale dura meno tempo della durata del ciclo

- il processore invia gli 80 caratteri nel tempo indicato con 'print' sul grafico ma la USART impiega molto più tempo per inviare i caratteri sulla seriale  a causa della velocità di trasmissione piuttosto bassa scelta nello sketch (9600)

- l'istruzione Serial.print(), vedi sotto, viene seguita in 7,8*2ms = 15,6ms;  una durata almeno 20 volte più lunga del valore calcolato! errore di calcolo?

print80d1

 

 

Non è un errore di calcolo dei parametri della retta e nemmeno un errore di estrapolazione; l'allungamento notevole della durata risiede nel fatto che 80 caratteri in un unico blocco (stringa) superano la capacità del buffer che è di 64 byte.

Quando la USART ha inviato il 15° carattere ed ha messo nello proprio shift register il 16°  restano da inviare 80 - 16 = 64 caratteri e l'istruzione Serial.print() può collocare nel buffer tutta la restante parte della stringa esaurendo la pausa e liberando il ciclo.

 

Con il solito baud rate di 9600 bit/s la trasmissione dei primi 15 caratteri richiede

15*1040µs = 15.600µs =15,6ms ... come misurato!

We use cookies to improve our website and your experience when using it. Cookies used for the essential operation of this site have already been set. To find out more about the cookies we use and how to delete them, see our privacy policy.

  I accept cookies from this site.
EU Cookie Directive plugin by www.channeldigital.co.uk