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:
Salida de termitas para la misma señal que se muestra en el osciloscopio.
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.
1
sí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.Respuestas:
Te has perdido un detalle importante de RS232. Los niveles lógicos son los siguientes:
Figura 1. Niveles de señal RS232. Fuente: Wikimedia Commons .
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.
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.
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.
fuente
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.
fuente