¿Por qué no puedo enviar mensajes con éxito a través de RS232?

9

Así que la semana pasada estuve trabajando para recibir mensajes UART enviados desde un STM32F407 y leerlos en mi computadora portátil a través de un cable ugreen RS232 a USB usando termitas.

He utilizado STMCube para generar código y agregarlo leyendo las instrucciones relevantes en la parte superior del archivo "stm32f4xx_hal_uart.c" (y viendo muchos videos y leyendo en línea).

He comprobado el mensaje transmitido en un osciloscopio y coincide con su representación ASCII.

Por ejemplo, envío 'Q' que es 0101 0001, recibo 'W' que es 0101 0111. La lectura en el alcance muestra:

ingrese la descripción de la imagen aquí

Salida de termitas para la misma señal que se muestra en el osciloscopio. ingrese la descripción de la imagen aquí

He confirmado que las tasas de baudios / paridad / HWcontrol coinciden en termitas y en mi código.

Para recibir el carácter correcto, he intentado reducir y aumentar las tasas de baudios.
He intentado diferentes conjuntos de caracteres para tratar de encontrar un patrón que haga que se muestren caracteres incorrectos.
Además, he probado diferentes terminales como Putty o Teraterm.

FeraTaTa
fuente
8
¿Su "cable RS232 a USB" funciona con niveles de voltaje RS232 o niveles de voltaje "TTL", y su placa STM32F407 está utilizando el controlador / receptor apropiado para esos niveles? Estoy casi seguro de que la respuesta a la pregunta 2 es "No", porque si interpreto su alcance a través de un filtro de "niveles y polaridad incorrectos", también veo una "W". Con toda probabilidad, su placa no tiene hardware de controlador / receptor (por lo tanto, utiliza niveles TTL) y su "cable RS232 a USB" tiene hardware de controlador / receptor RS232 (por lo tanto, utiliza niveles RS232).
Brhans
3
Probar algunos personajes diferentes confirmaría la hipótesis de @brhans al instante. Enviar el mismo personaje una y otra vez mientras se espera un resultado diferente es una de las definiciones de locura ...
Dave Tweed
3
FeraTaTa: solo un punto que no creo que se haya mencionado hasta ahora: a primera vista, su trazo de alcance muestra una señal que parece estar inactiva a 0V (mire el 1símbolo con el fondo amarillo a la izquierda del trazo, eso es el nivel de 0V) y luego pulsa por debajo de 0V. Eso no sería cierto para una señal lógica directamente desde un STM32 y, de hecho, no es cierto. Mirando en la esquina inferior izquierda, ha configurado el canal 1 para acoplamiento de CA (ese es el ~símbolo que ve allí). La señal está realmente en ralentí alto y pulsando alrededor de 0V. Utilice el acoplamiento de CC para obtener una vista sensata de esa señal.
SamGibson

Respuestas:

22

Te has perdido un detalle importante de RS232. Los niveles lógicos son los siguientes:

ingrese la descripción de la imagen aquí

Figura 1. Niveles de señal RS232. Fuente: Wikimedia Commons .

  • Lógica 1 = -3 a -12 V.
  • Lógica 0 = +3 a +12 V.
  • Entre -3 y +3 el nivel lógico no está definido.
  • El bit de inicio RS232 es un 0 lógico.

Para convertir la lógica TTL (5 V) a RS232 se requiere un controlador. Chips como el MAX232 hacen la inversión de nivel lógico y el aumento de voltaje por usted.

Es posible "hacer trampa" a veces y alimentar una señal TTL en una entrada RS232 siempre que el nivel lógico esté invertido. La fiabilidad de este método depende del chip utilizado en la entrada RS232.

ingrese la descripción de la imagen aquí

Figura 2. La forma de onda transmitida. En la parte superior está el patrón de bits de la 'Q' que transmitió. En la parte inferior está cómo la leyó la entrada RS232.

Tenga en cuenta que la entrada RS232 está buscando un borde positivo para indicar el bit de inicio. Esto no sucede hasta el segundo bit de sus datos, por lo que todo lo que sigue es un bit a la derecha e invertido como lo ve el receptor. Por suerte, su MSB es el nivel lógico correcto para el bit de parada, por lo que el receptor lo interpretó como un marco válido, lo decodificó y mostró una 'W'.

Para fines de prueba, puede invertir su salida TTL. Esto probablemente funcionará ya que está "funcionando" en este momento.

ingrese la descripción de la imagen aquí

Figura 3. El chip MAX232 usa condensadores en los circuitos de la bomba de carga para aumentar el suministro de 5 V para los niveles RS232.

Para mayor confiabilidad, agregue un chip MAX232 para transmitir y recibir una señal de nivel RS232 adecuada.

Transistor
fuente
3
Como quizás una mejor alternativa, hay disponibles cables USB a TTL UART. Si el OP está utilizando un adaptador USB de todos modos, no tiene mucho sentido agregar un chip adicional para cambiar de nivel.
Graham
1
RS-232 es un 0 lógico = V + bipolar que es cualquier cosa> 2V y un umbral equivalente TTL de 1.5V típ. en CMOS como 74HCTxx con histéresis pequeña (50mV ??)
Tony Stewart Sunnyskyguy EE75
66
En inglés, por favor, Tony?
Transistor
3
Eso es inglés para EE, ¿qué parte no entiendes? RS232 es -V en inactivo y> + 2V en el inicio, pero es lógica negativa al voltaje (0 = V +, 1 = V-) para datos y se detiene en V-. Apuesto a que no sabías que el umbral RS-232 es 1.4 ~ 1.5V
Tony Stewart Sunnyskyguy EE75
8
Gracias Tony. Eso es mucho más legible y sensato. Dejas de lado la puntuación, las palabras clave y los conjuntivos en muchas de tus respuestas rápidas. Soy un viejo como tú con casi cuatro décadas de EE. Mi figura 1 muestra los voltajes de umbral para RX. Ver también Omega , Analog , Wikipedia y Maxim . Todos los estados ± 5 V para TX y ± 3 V para RX.
Transistor
7

Teniendo en cuenta el corto alcance y la baja tasa de bits de 9600, los niveles TTL y CMOS funcionan bien. El problema elocuentemente detallado por @Transistor es que los datos UART son lógica negativa 0 ~ 5V y RS-232 es lógica positiva +/- V f entre +/- 3 y +/- 15V (?)

Por lo tanto, como * él también sugiere, un inversor funcionará.

El problema no es un problema de tasa de error de bit (BER) o integridad de señal, sino lógica invertida.

Además, la "zona gris" es para un margen de ruido de larga distancia. No es <+/- 3V para usted porque su cable es corto. El umbral lógico real de RS-232 Rx es exactamente el mismo que el antiguo TTL (dos caídas de Vbe) o 1.4V +/- 20% (?) De tolerancia.

Lo llaman una zona gris para cumplir con todas las especificaciones de distancia y velocidad de transmisión debido a fallas de ruido y zumbido de bordes.

Para cables más largos, obtenga cualquier MAX232. Las variaciones pueden depender de la velocidad y las características del voltaje.

Tony Stewart Sunnyskyguy EE75
fuente