Perché non riesco a inviare correttamente i messaggi su RS232?


9

Quindi la settimana scorsa ho lavorato per ottenere i messaggi UART inviati da un STM32F407 e leggerlo sul mio laptop tramite un cavo da RS232 a USB brutto usando la termite.

Ho usato STMCube per generare codice e aggiungerlo leggendo le istruzioni pertinenti nella parte superiore del file "stm32f4xx_hal_uart.c" (e guardando molti video e leggendo online).

Ho controllato il messaggio trasmesso su un oscilloscopio e corrisponde alla sua rappresentazione ASCII.

Ad esempio, invio 'Q' che è 0101 0001, ricevo 'W' che è 0101 0111. La lettura sull'ambito mostra:

inserisci qui la descrizione dell'immagine

Uscita della termite per lo stesso segnale visualizzato sull'oscilloscopio. inserisci qui la descrizione dell'immagine

Ho confermato che baud rate / parità / HWcontrol corrispondono sulla termite e nel mio codice.

Per ricevere il carattere corretto ho provato ad abbassare e aumentare i baud rate.
Ho provato diversi set di caratteri per cercare di trovare un modello che causi la visualizzazione di caratteri errati.
Inoltre ho provato diversi terminali come su Putty o Teraterm.


8
Il tuo "cavo da RS232 a USB" funziona con livelli di tensione RS232 o livelli di tensione "TTL" e la tua scheda STM32F407 utilizza il driver / ricevitore appropriato per quei livelli? Sono quasi certo che la risposta alla domanda 2 sia "No", perché se interpreto la traccia del tuo ambito attraverso un filtro "livelli e polarità errati" vedo anche una "W". Con ogni probabilità la tua scheda non ha hardware driver / ricevitore (quindi utilizza livelli TTL) e il tuo "cavo da RS232 a USB" ha hardware driver / ricevitore RS232 (quindi utilizza livelli RS232).
brhans,

3
Provare alcuni personaggi diversi confermerebbe all'istante l'ipotesi di @brhans. Inviare lo stesso personaggio più volte aspettandosi un risultato diverso è una delle definizioni di follia ...
Dave Tweed,

3
FeraTaTa - Solo un punto che non credo sia stato menzionato finora: a prima vista, la traccia dell'oscilloscopio mostra un segnale che sembra inattivo a 0 V (guarda il 1simbolo con lo sfondo giallo a sinistra della traccia - questo è il livello 0V) e quindi impulsi sotto 0V. Ciò non sarebbe vero per un segnale logico proveniente direttamente da un STM32 e, in effetti, non è vero. Guardando nell'angolo in basso a sinistra, hai impostato il canale 1 sull'accoppiamento CA (questo è il ~simbolo che vedi lì). Il segnale è veramente alto al minimo e pulsa a circa 0 V. Utilizzare l' accoppiamento CC per una visione sana di quel segnale.
SamGibson,

Risposte:


22

Hai perso un dettaglio importante di RS232. I livelli logici sono i seguenti:

inserisci qui la descrizione dell'immagine

Figura 1. Livelli di segnale RS232. Fonte: Wikimedia Commons .

  • Logica 1 = da -3 a -12 V.
  • Logica 0 = da +3 a +12 V.
  • Tra -3 e +3 il livello logico non è definito.
  • Il bit di avvio RS232 è uno 0 logico.

Per convertire dalla logica TTL (5 V) in RS232 è necessario un driver. Chip come il MAX232 fanno l'inversione del livello logico e aumentano la tensione per te.

È possibile "imbrogliare" a volte e immettere un segnale TTL in un ingresso RS232 a condizione che il livello logico sia invertito. L'affidabilità di questo metodo dipende dal chip utilizzato sull'ingresso RS232.

inserisci qui la descrizione dell'immagine

Figura 2. La forma d'onda trasmessa. In cima c'è il modello di bit della 'Q' che hai trasmesso. In fondo è come l'entrata RS232 lo legge.

Notare che l'ingresso RS232 sta cercando un fronte positivo per indicare il bit di avvio. Ciò non accade fino al secondo bit dei tuoi dati, quindi tutto ciò che segue è un po 'a destra e invertito quando il ricevitore lo vede. Per fortuna il tuo MSB è il livello logico corretto per il bit di stop, quindi il ricevitore lo ha interpretato come un frame valido, lo ha decodificato e visualizzato una 'W'.

A scopo di test è possibile invertire l'output TTL. Questo probabilmente funzionerà in quanto "funziona" al momento.

inserisci qui la descrizione dell'immagine

Figura 3. Il MAX232 chip utilizza condensatori nei circuiti della pompa di carica per aumentare l'alimentazione a 5 V per i livelli RS232.

Per affidabilità, aggiungere un chip MAX232 per trasmettere e ricevere un segnale di livello RS232 adeguato.


3
Come forse un'alternativa migliore, sono disponibili cavi UART da USB a TTL. Se l'OP utilizza comunque un adattatore USB, non ha molto senso aggiungere un chip aggiuntivo per il cambio di livello.
Graham,

1
RS-232 è uno 0 logico = V + bipolare che è qualsiasi cosa> 2 V e una soglia equivale TTL di 1,5 V tip. in CMOS come 74HCTxx con piccola isteresi (50mV ??)
Tony Stewart Sunnyskyguy EE75

6
In inglese, per favore, Tony?
Transistor

3
Questo è l'inglese per gli EE, quale parte non capisci? RS232 è -V al minimo e> + 2V all'avvio ma ha una logica negativa rispetto alla tensione (0 = V +, 1 = V-) per i dati e si arresta su V-. Scommetto che non sapevi che la soglia RS-232 è di 1,4 ~ 1,5 V
Tony Stewart Sunnyskyguy EE75

8
Grazie Tony. È molto più leggibile e sensibile. Tralasci la punteggiatura, le parole chiave e le congiuntive su troppe risposte rapide. Sono un vecchio come te con quasi quattro decenni di EE. La mia figura 1 mostra le tensioni di soglia per RX. Vedi anche Omega , Analog , Wikipedia e Maxim . Tutti gli stati ± 5 V per TX e ± 3 V per RX.
Transistor

7

Considerando la breve distanza e la bassa velocità in bit di 9600, i livelli TTL e CMOS funzionano bene. Il problema illustrato in modo eloquente da @Transistor è che i dati UART sono logici negativi 0 ~ 5 V e RS-232 è logica positiva +/- V f tra +/- 3 e +/- 15 V (?)

Pertanto, come * suggerisce anche, un inverter funzionerà.

Il problema non è un problema di bit rate rate (BER) o integrità del segnale, ma una logica invertita.

Inoltre, la "zona grigia" è per il margine di rumore lungo raggio non è <+/- 3V per voi , perché il cavo è corto. La soglia logica effettiva di RS-232 Rx è esattamente la stessa della vecchia TTL (due cadute di Vbe) o della tolleranza di 1,4 V +/- 20% (?).

Lo chiamano una zona grigia per soddisfare tutte le specifiche di distanza e velocità di trasmissione a causa di disturbi del rumore e squilli dei bordi.

Per cavi più lunghi, procurati MAX232. Le variazioni possono dipendere dalla velocità e dalle caratteristiche della tensione.

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.