Differenza tra valore binario reale e valore dell'oscilloscopio


14

Ho provato a vedere un carattere "A" ASCII con un oscilloscopio ma il valore binario reale e i valori dell'oscilloscopio sono diversi, perché? ASCII "A" Valore binario - 01000001

L'oscilloscopio visualizza questo grafico:

Ascii A

Ascii A

Uso un Arduino Uno per inviare il valore ASCII usando il codice:

void setup() {  
  Serial.begin(9600);  
}  

void loop() {  
  Serial.println("A");  
  delay(1000);  
}

Risposte:


35

Ecco come leggi la forma d'onda dell'oscilloscopio. Mi sono preso il tempo per modificare l'immagine della forma d'onda e annotarla per mostrare quale bit è quale. Il microcontrollore invia 10 bit per carattere; START, che è sempre 0, 8 bit di dati e STOP che è sempre 1. La linea si ferma anche su 1, quindi il primo fronte di discesa START avvisa il ricevitore che sta arrivando un byte. I bit vengono inviati per primi all'LSB, quindi se si desidera "guardarli" in modo aritmetico, è necessario rispecchiarli in senso orizzontale affinché abbiano senso. La larghezza di ciascun bit è determinata dal baudrate e il trasmettitore e il ricevitore devono entrambi sapere qual è il baudrate.

Dall'immagine qui sotto puoi vedere che invia tre caratteri: carattere ASCII 'A', un ritorno a capo e un avanzamento riga.

inserisci qui la descrizione dell'immagine


Se si tratta di comunicazione seriale, onda dare così. giusto? Cosa sono CR e LF? Quali altri dati possono ottenere come CR o LF?
— user38701

1
CR è ritorno a capo, LF è avanzamento riga. Insieme formano una Newline, ad esempio il cursore si sposta all'inizio della riga successiva. Fanno parte dello standard "ASCII" ("American Standard Code for Information Interchange"), google "ASCII chart" o qualcosa del genere.
— PkP,

@ user38701: CRLF è ciò che accade quando si preme il tasto Invio. Tecnicamente, CR dovrebbe essere la chiave di ritorno e LF dovrebbe essere la chiave di invio, ma la console seriale interpreta la chiave di invio come CRLF (o talvolta solo LF). Nella maggior parte dei linguaggi di programmazione, CR è "\ r" e LF è "\ n" ma alcuni compilatori / linguaggi
— generano

1
Il ritorno a capo è semplice. Ha usato un printlncomando, che significa stampare la stringa, oltre a un "\ r \ n". Quindi tre personaggi
— ps95,

1
vale la pena notare che le terminazioni di linea sono specifiche del sistema.CRLF è principalmente la terminazione di linea Windows e Arduino. Se ripetessi lo stesso test usando un terminale su Linux come sorgente della "A", vedresti solo LF.
— Nicolas Holthaus,

13

Se guardi la documentazione di Arduino println () noterai che aggiunge un ritorno a capo e un avanzamento di riga alla fine. Quindi in decimale finirai con 65 (A), 13 (CR) e 10 (LF) che in binario si traduce in:

01000001 00001101 00001010

I dati seriali asincroni vengono inviati prima LSB in modo che diventi:

10000010 10110000 01010000

Il tuo segnale è inattivo, quindi il bit di inizio sarà 0 e il bit di arresto sarà 1, quindi aggiungilo a ciascun byte e finisci con:

0100000101 0101100001 0010100001

È un po 'difficile stabilire il tempo esatto dal tuo diagramma, ma questo sembra corrispondere almeno approssimativamente e dovrebbe darti un'idea da dove provengono alcuni bit extra e perché vengono riordinati. Il link Wikipedia fornito da Kvegaoro fornisce molte buone informazioni di base sui dati seriali asincroni.


1

Se quel flusso che mostra è seriale asincrono , l'oscilloscopio mostrerà i bit di inizio, i bit di arresto e i bit di parità corrispondenti. Tieni anche conto se il tuo segnale è invertito o meno e se il tempo è prima il bit più significativo o il bit più significativo. Se aggiungi ulteriori dettagli sul flusso seriale che hai rappresentato nell'immagine, possiamo darti una risposta migliore e più dettagliata, altrimenti si tratta solo di un'ipotesi colta

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.