En primer lugar, algo que también notó Olin: los niveles son los contrarios a los que suele arrojar un microcontador:
No hay que preocuparse, ya veremos que también podemos leerlo así. Sólo tenemos que recordar que en el ámbito un bit de inicio será un 1
y el bit de parada 0
.
A continuación, tienes la base temporal equivocada para leer esto correctamente. 9600 bits por segundo (unidades más apropiadas que los baudios, aunque estos últimos no son erróneos per sé) son 104 \$\mu\$ s por bit, lo que supone 1/10 de división en su configuración actual. Acércate, y pon un cursor vertical en el primer borde. Ese es el comienzo de tu bit inicial. Mueve el segundo cursor a cada uno de los siguientes bordes. La diferencia entre los cursores debe ser múltiplo de 104 \$\mu\$ s. Cada 104 \$\mu\$ s es un bit, primero el bit de inicio ( 1
), luego 8 bits de datos, tiempo total 832 \$\mu\$ s, y un bit de parada ( 0
).
No parece que los datos de la pantalla coincidan con los enviados 0x00
. Debería ver un estrecho 1
(el bit de inicio) seguido de un nivel bajo más largo (936 \$\mu\$ s, 8 bits de datos cero + un bit de parada).
Lo mismo para el 0xFF
que estás enviando; deberías ver un nivel alto y largo (de nuevo 936 \$\mu\$ s, esta vez el bit de inicio + 8 bits de datos). Así que debería ser casi 1 división con su configuración actual, pero eso no es lo que veo.
Más bien parece que en la primera captura de pantalla estás enviando dos bytes, y en la segunda cuatro, siendo el 2º y el 3º el mismo valor.
estimaciones:
0b11001111 = 0xCF
0b11110010 = 0xF2
0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2
editar
Olin tiene toda la razón, esto es algo así como el ASCII. De hecho es Complemento a 1 de ASCII.
0xCF ~ 0x30 = '0'
0xCE ~ 0x31 = '1'
0xCD ~ 0x32 = '2'
0xCC ~ 0x33 = '3'
0xCB ~ 0x34 = '4'
0xCA ~ 0x35 = '5'
0xF2 ~ 0x0D = [CR]
Esto confirma que mi interpretación de las capturas de pantalla es correcta.
editar 2 (cómo interpreto los datos, a petición popular :-))
Advertencia: esta es una historia larga, porque es una transcripción de lo que pasa en mi cabeza cuando trato de descifrar una cosa así. Léelo sólo si quieres aprender una forma de abordarlo.
Ejemplo: el segundo byte de la primera captura de pantalla, empezando por los 2 pulsos estrechos. Empiezo por el segundo byte a propósito porque hay más aristas que en el primer byte, así que será más fácil acertar. Cada uno de los pulsos estrechos es aproximadamente 1/10 de una división, por lo que podría ser 1 bit alto cada uno, con un bit bajo en medio. Tampoco veo nada más estrecho que esto, así que supongo que es un solo bit. Esa es nuestra referencia.
Entonces, después de 101
hay un período más largo en el nivel bajo. Parece el doble de ancho que los anteriores, así que podría ser 00
. El alto que sigue es de nuevo el doble de ancho, por lo que será 1111
. Ahora tenemos 9 bits: un bit de inicio ( 1
) más 8 bits de datos. Así que el siguiente bit será el bit de parada, pero como es 0
no es inmediatamente visible. Así que juntando todo tenemos 1010011110
, incluyendo el bit de arranque y parada. Si el bit de parada no fuera cero, ¡habría hecho una mala suposición en alguna parte!
Recuerda que una UART envía primero el LSB (bit menos significativo), por lo que tendremos que invertir los 8 bits de datos: 11110010
= 0xF2
.
Ahora conocemos la anchura de un bit simple, de un bit doble y de una secuencia de 4 bits, y echamos un vistazo al primer byte. El primer periodo alto (el pulso ancho) es ligeramente más ancho que el 1111
en el segundo byte, por lo que tendrá 5 bits de ancho. El periodo bajo y el alto que le siguen son cada uno tan ancho como el doble bit del otro byte, por lo que obtenemos 111110011
. De nuevo 9 bits, así que el siguiente debería ser un bit bajo, el bit de parada. Eso está bien, así que si nuestra estimación es correcta podemos volver a invertir los bits de datos: 11001111
= 0xCF
.
Entonces recibimos una pista de Olin. La primera comunicación tiene 2 bytes, 2 bytes menos que la segunda. Y "0" es también 2 bytes más corto que "255". Así que probablemente sea algo parecido a ASCII, aunque no exactamente. También observo que el segundo y el tercer byte del "255" son iguales. Genial, eso será el doble "5". ¡Vamos bien! (Hay que animarse de vez en cuando.) Después de descodificar el "0", el "2" y el "5", observo que hay una diferencia de 2 entre los códigos de los dos primeros, y una diferencia de 3 entre los dos últimos. Y por último me doy cuenta de que 0xC_
es el complemento de 0x3_
que es el patrón de los dígitos en ASCII.
3 votos
Las líneas en serie están en estado lógico de "1", así que ten en cuenta que aquí tienes un 1 en la parte inferior y un 0 en la superior. Sé que la gente ya se ha fijado en eso. Mi comentario es con el propósito de guiar futuras capturas de datos en serie; puedes sondear las cosas para que el estado de reposo sea alto.