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

8

Así que la semana pasada trabajé para que los mensajes de UART se enviaran desde un STM32F407 y para leerlos en mi computadora portátil a través de un cable ugreen RS232 a USB con termita.

He usado 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:

Salidadetermitasparalamismaseñalquesemuestraenelosciloscopio.

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

Para recibir el carácter correcto, he intentado reducir y aumentar las velocidades de transmisión.
He intentado diferentes juegos 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.

    
pregunta FeraTaTa

2 respuestas

21

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

Figura1.NivelesdeseñalRS232.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 "engañar" a veces y enviar una señal TTL a una entrada RS232 siempre que el nivel lógico esté invertido. La confiabilidad de este método depende del chip utilizado en la entrada RS232.

Figura2.Laformadeondatransmitida.Enlapartesuperiorestáelpatróndebitsdela"Q" que transmitiste. En la parte inferior está la lectura de la entrada RS232.

Tenga en cuenta que la entrada RS232 está buscando un borde positivo para indicar el bit de inicio. Esto no ocurre hasta el segundo bit de sus datos, por lo que todo lo que sigue es un bit a la derecha e invertido según lo ve el receptor. Suerte, 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 descodificó y mostró una 'W'.

Para propósitos de prueba, puedes invertir tu salida TTL. Esto probablemente funcionará ya que está "funcionando" en este momento.

Figura3.Elchip MAX232 utiliza 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.

    
respondido por el Transistor
5

Teniendo en cuenta el corto alcance y la baja tasa de bits de 9600, los niveles TTL y CMOS funcionan bien. El problema que el @Transistor detalla elocuentemente 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 * también sugiere, un inversor funcionará.

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

Además, la "zona gris" es para el 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 TTL antiguo (dos caídas de Vbe) o la tolerancia de 1.4V +/- 20% (?).

Lo llaman zona gris para cumplir con todas las especificaciones de distancia y velocidad de transmisión debido a los problemas de ruido y el sonido del borde.

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

    
respondido por el Tony EE rocketscientist

Lea otras preguntas en las etiquetas