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.