Primero, algo que Olin también notó: los niveles son lo contrario de lo que generalmente produce un microcontoller:
No hay de qué preocuparse, veremos que también podemos leerlo de esta manera. Solo tenemos que recordar que en el alcance un bit de inicio será un 1
bit de parada 0
.
A continuación, tiene la base de tiempo incorrecta para leer esto correctamente. 9600 bits por segundo (unidades más apropiadas que Baudios, aunque este último no está mal per sé) es 104 s por bit, que es 1/10 de una división en su configuración actual. Acercar y establecer un cursor vertical en el primer borde. Ese es el comienzo de tu bit de inicio. Mueva el segundo cursor a cada uno de los siguientes bordes. La diferencia entre los cursores debe ser múltiplos de 104 s. Cada 104 s es un bit, primero el bit de inicio ( ), luego 8 bits de datos, tiempo total 832 s y un bit de parada ( ). μμμ1
μ0
No parece que los datos de la pantalla coincidan con los enviados 0x00
. Debería ver un 1
bit angosto (el bit de inicio) seguido de un nivel bajo más largo (936 s, 8 bits de datos cero + un bit de parada).
Lo mismo para el que estás enviando; debería ver un nivel alto largo (nuevamente 936 s, esta vez el bit de inicio + 8 bits de datos). Entonces debería ser casi 1 división con su configuración actual, pero eso no es lo que veo.
Se parece más a la primera captura de pantalla que está enviando dos bytes, y en la segunda cuatro, con la segunda y la tercera el mismo valor. μ
0xFF
μ
conjeturas:
0b11001111 = 0xCF
0b11110010 = 0xF2
0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2
editar
Olin tiene toda la razón, esto es algo así como ASCII. De hecho, es el complemento de 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 pedido popular :-))
Advertencia: esta es una larga historia, porque es una transcripción de lo que sucede en mi cabeza cuando intento descifrar algo como esto. Solo léelo si quieres aprender una forma de abordarlo.
Ejemplo: el segundo byte en la primera captura de pantalla, comenzando con los 2 pulsos estrechos. Comienzo con el segundo byte a propósito porque hay más aristas que en el primer byte, por lo que será más fácil hacerlo bien. Cada uno de los pulsos estrechos es aproximadamente 1/10 de una división, por lo que puede tener 1 bit de altura cada uno, con un bit bajo en el medio. Tampoco veo nada más estrecho que esto, así que supongo que es un poco. Esa es nuestra referencia.
Luego, después de que 101
haya un período más largo a bajo nivel. Parece aproximadamente el doble de ancho que los anteriores, por lo que podría ser 00
. El alto seguimiento que nuevamente es el doble de ancho, así que eso será 1111
. Ahora tenemos 9 bits: un bit de inicio ( 1
) más 8 bits de datos. Entonces, el siguiente bit será el bit de parada, pero porque es0
No es inmediatamente visible. Entonces, juntando todo lo que tenemos 1010011110
, incluido el bit de inicio y parada. Si el bit de detención no fuera cero, ¡habría hecho una mala suposición en alguna parte!
Recuerde que un UART envía el LSB (bit menos significativo) primero, por lo que tendremos que invertir los 8 bits de datos: 11110010
= 0xF2
.
Ahora conocemos el ancho de un solo bit, un doble bit y una secuencia de 4 bits, y tenemos un vistazo al primer byte. El primer período alto (el pulso ancho) es ligeramente más ancho que 1111
en el segundo byte, por lo que tendrá 5 bits de ancho. El período bajo y el período alto siguiente son tan anchos como el bit doble en el otro byte, así que obtenemos 111110011
. De nuevo 9 bits, por lo que el siguiente debe ser un bit bajo, el bit de parada. Está bien, así que si nuestra estimación aproximada es correcta, podemos volver a invertir los bits de datos: 11001111
= 0xCF
.
Luego recibimos una pista de Olin. La primera comunicación es de 2 bytes de longitud, 2 bytes más corta que la segunda. Y "0" también es 2 bytes más corto que "255". Entonces, probablemente sea algo así como ASCII, aunque no exactamente. También noto que el segundo y tercer byte del "255" son iguales. Genial, ese será el doble "5". ¡Estamos bien! (Debe alentarse de vez en cuando). Después de decodificar "0", "2" y "5", noto que hay una diferencia de 2 entre los códigos para los dos primeros, y una diferencia de 3 entre los últimos dos. Y finalmente noto que 0xC_
es el complemento de 0x3_
, que es el patrón para los dígitos en ASCII.