EDIT : esta respuesta se modificó para reflejar el comentario del interrogador y señala que tiene bastante razón en su diagnóstico del problema, que no es ' Información terriblemente útil. La única información útil en la sección es el hecho de que no hay un bit de inversión invertido ... Pero quizás ayude a las futuras personas a diagnosticar sus propios problemas de UART
Así que echemos un vistazo
un mapa a O que significa 01100001 mapas a 01001111
b se asigna a 'lo que significa que 01100010 se asigna a 00100111
Supongamos que hay un 1 implícito antes de cada uno de ellos y un 0 implícito después (bits de inicio y parada). El módulo RX recibe una señal baja continua, luego el bit de parada se envía como un valor alto, que se consumirá como una señal inactiva, luego el 0 inicial se consumirá como un bit de parada. Entonces los bits restantes serán invertidos,
so 'a' == 1 10000110 0 initially (we send least significant bit first)
1 (implicit start bit) and starting 1 are both consumed as idle bits
then the first 0 is treated as a start bit
so received == 00001100 inverted (the extra zeros are the stop bit and idle bits after transmission has ended)
11110011 and reverse it (it was sent LSB first)
11001111 is what the inverted input would look like
01001111 is what's actually received which is super close!
if what you actually sent was "abc" all in a row, then the start bit of the b would make what was received 01001111 which matches exactly
'b' == 1 01000110 0 ==> 10001100 inverted and reversed gives
11001110 is what should have "logically" happened
00100111 actual
So that doesn't quite match, but if we assume that the "abc" is what happened again, we get
01001110 which is close enough (not sure where the shift came from)
Parece que detectó el diagnóstico, desafortunadamente no hay un bit de configuración de "señal invertida" similar en el receptor en el PIC. ¡Aunque no es difícil poner un inversor en la ruta de recepción, que por cierto es lo que recomendaría hacer!
Como señaló Olin, las señales estándar rs-232 son de + 3V a + 15V para un '1' lógico y -3V a -15V para un '0' lógico. El PIC está diseñado para funcionar en niveles "TTL", lo que significa "lógica transistor-transistor". La idea es que el PIC está diseñado para hablar con otras cosas que están físicamente cerca (es decir, en la misma placa) y, por lo tanto, la distancia de transmisión adicional y el rechazo de ruido proporcionados por los niveles completos de rs-232 no son necesarios para la operación "estándar". No es práctico poder generar completamente internamente los voltajes positivos / negativos necesarios para la operación rs-232 completamente internamente en el PIC, por lo que la comunicación "normal" rs-232 nunca fue realmente una opción.
Dado que los niveles TTL no son el estándar sino un derivado del estándar (el mismo protocolo para temporización, bits de inicio y parada, paridad, pero diferentes voltajes), no compra un "adaptador rs-232" para su consumidor. Computadora a menos que se adhiera a la norma. ¡Hacen adaptadores rs-232 de nivel TTL y son muy populares en los sitios web de aficionados! Visite cable de Adafruit o Sparkfun FTDI breakout . Encuentro que, en general, si va a un conector DB9, probablemente sea un adaptador de nivel RS-232.