Serial.begin (): Perché non usare sempre 28800?

In molti esempi di codice online le persone aggiungono la riga Serial.begin(9600) nel blocco di configurazione.

Quando cerco cosa Serial.begin() è nella documentazione ufficiale, dice che controlla il trasferimento dei dati bit al secondo.

Quindi la domanda ovvia è, perché non utilizzare 28800, la velocità di trasferimento più alta? Perché le persone si accontentano di 9600? Qual è il limite qui?

Commenti

  • Cordiali saluti, il massimo che un arduino collegato a supporti USB è in realtà 115200 e 57600 è spesso il secondo più comune baud che vedi.

Rispondi

Perché le persone accontentarsi?

Le persone si accontentano perché è più che abbastanza veloce. Luso più comune è solo quello di stampare alcune cose su un terminale per il debuggin. 9600 baud corrisponde a 960 caratteri al secondo o 12 x 80 righe di caratteri al secondo. Quanto velocemente riesci a leggere? 🙂

Se il tuo programma utilizza la porta seriale per il trasferimento di dati in blocco, scegli di non accontentarti.

Che cosè la limitazione …

I limiti sul seriale sono alti. Direttamente puoi usare 115200 baud nei tuoi programmi e funzionerà. Il terminale Arduino consentirà un massimo di 115200, ma altri programmi come RealTerm ti permetterebbero di correre più in alto.

La seriale hardware funzionerà a 1 M baud. Se leggi in giro vedrai che le persone hanno utilizzato fino a 1 M controllando direttamente lUART. Potresti trarre vantaggio da velocità di trasmissione elevate per usi come la trasmissione tramite un chip Bluetooth. Se si utilizza linterfaccia seriale hardware per lo scambio da chip a chip con una breve distanza, è completamente fattibile 1 M baud. Pensa a tutti i dispositivi SPI e I2C che funzionano perfettamente a una frequenza di clock di 1 MHz.

Su distanze maggiori, inizierai ad avere problemi di rumore quando utilizzi segnali a livello logico (da 0 a 5 V normali). Per utilizzare distanze maggiori, è necessario aggiungere un ricetrasmettitore per fornire segnali robusti, comunemente RS-232 e meno comunemente RS-485. Con RS-232 è possibile eseguire un mega bit a distanze di 10 pollici di piedi.

La velocità di clock del microprocessore sarà il limite reale. Con una UART hardware, il processore deve caricare un byte nella UART ogni 10 bit (per N81) .Quindi quando si arriva a 1 M baud sarà una sfida per il processore a 16 MHz mantenere lUART rifornito di dati. Un nuovo byte verrà inviato ogni 160 tick di clock, che sono pochissime righe di codice. Per una breve raffica di dati, potresti raggiungere quella velocità. Il messaggio è che il processore esaurirà la velocità prima che lUART sia il limite.

Nota, tutto ciò si applica a HardwareSerial , il software seriale è molto diverso.

Commenti

  • Si prega di notare che 2M è archiviabili con seriale hw, ma limplementazione di arduino ‘ sembra troppo lenta e invia un sacco di spazzatura. Vedere atmega328p ds per trovare il bit magico per raddoppiare la velocità. Aggiungete anche che 9800 baud è uno standard molto vecchio, e molto dei sensori utilizza quel valore come standard, anche se può essere configurato per altri, come xbee, gps e altro. Anche seriale su usb usa la negoziazione auto-baudrate che può sovrascrivere il baudate selezionato, ma penso che non sia usato da arduino (ma potrebbe essere su leonardo)
  • 9600 8N1 è anche unimpostazione predefinita de facto. Molti dispositivi con uninterfaccia seriale vengono forniti con questa impostazione e devono essere configurati se è richiesta unaltra velocità (o bit di dati, bit di parità, bit di stop).
  • ” è più che abbastanza veloce ” – Buona risposta, ma non sono daccordo con questo punto. La maggior parte delle implementazioni delloutput di debug sono bloccanti, quindi è molto desiderabile rendere loutput di debug il più veloce possibile per evitare modifiche eccessive nel tempo di esecuzione del codice.
  • Se ‘ stai effettuando un trasferimento di dati in blocco, idealmente ‘ utilizzeresti SPI, giusto?

Risposta

Oltre a tutte le risposte interessanti, vale la pena ricordare che impostare la velocità seriale su XXX bit / s non implica necessariamente XXX bit / i sullhardware.

Gli orologi, anche al quarzo, sono imperfetti e soggetti a deriva. Inoltre, poiché il clock seriale viene solitamente generato tramite un pre-divisore di potenza di due e un contatore (intero), non è possibile ottenere tutto il valore con precisione data una frequenza di clock di base. Con laiuto dei bit di avvio / arresto, la comunicazione seriale asincrona può tollerare una certa deriva del clock. Ma questo ha dei limiti.

Ad esempio, se il tuo ATmega328PA funziona a 1 MHz, puoi raggiungere 9600 b / s con lo 0,2% di errore. Ma a 14400 b / s lerrore è -3,5% (in realtà comunica a 13900 b / s). E a 28800 b / s, lerrore è del + 8,5% (in realtà comunica a 31200 b / s).Tutti questi dati provengono dalla scheda tecnica ATmega48PA-88PA-168PA-328PA, p200 .

Questo non è un problema quando due dispositivi identici comunicano insieme (in quanto comunicano alla stessa velocità). potrebbe essere un problema durante la comunicazione tra dispositivi diversi.

Aumentando la frequenza di base non è necessario migliorare in modo significativo la precisione. Ad esempio, lesecuzione dello stesso ATmega328PA di cui sopra a 2MHz non dà risultati migliori poiché sono principalmente dovuti a errori di arrotondamento. Ma eseguendolo a 1,8432 MHz si ottengono bps molto precisi da 2400 b / s fino a 57,6 kHz.

Risposta

Penso che sia un una sorta di tradizione per utilizzare una velocità di trasferimento che non è la più lenta (300) ma anche non quella che potrebbe causare problemi in alcune configurazioni (28800 o anche 115200). La porta seriale del PC (molto spesso un adattatore USB FTDI232) può far fronte a velocità più elevate, ma il tuo hardware fai-da-te potrebbe non farlo. Quindi 9600 bps si è affermato come una sorta di velocità di trasferimento standard per esempi di codice.

Risposta

Indietro nella notte dei tempi , il “gold standard” per le tastiere remote (utilizzando un modem telefonico e telescriventi, se ricordate) era di 9600 baud, inizialmente raggiungibile solo su una linea telefonica dedicata. Il tempo scorre, lentamente; la tecnologia avanza, rapidamente; e la memoria si muove ancora più lentamente del tempo (sembra). Possiamo comunicare regolarmente, almeno per diversi metri, a un paio di ordini di grandezza più veloci di 9600 baud. Quello che una volta era considerato un gold standard non è più gold, ma è ancora considerato uno standard.

tl; dr: è la storia, non la tecnologia.

Risposta

Penso che la ragione principale per cui le persone usano 9600 la maggior parte del tempo è che è la velocità di trasmissione predefinita nellIDE di Arduino. Inoltre, velocità di trasmissione dati più elevate potrebbero non essere affidabili se il segnale seriale deve viaggiare a lungo, anche se non ho idea del motivo per cui è stata selezionata come velocità ottimale.

Risposta

Tempo di reazione umana

Perché è in grado di fermare il monitor seriale quando il tuo Arduino sta battendo sulla porta è richiesto dagli utenti il 100% delle volte e la velocità di trasferimento massima è richiesta inferiore a 100% delle volte.

9600 baud è un compromesso tra “facile uccidere un processo in fuga” e “fastidiosamente lento”.

Commenti

  • 100% ehi … interessante;)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *