Breve fondo primero; Tengo datos del bus CAN de un ángulo de dirección que obviamente es hexagonal. El ángulo de dirección cubre dos bytes de un mensaje. El documento de especificación que tengo dice que esos dos bytes forman un int de 16 bits con signo, que son el ángulo de dirección que un prescaler de 1/1024, eso es todo lo que tengo (no tengo acceso a la fuente). Lo que estoy tratando de hacer es convertir esos valores hexadecimales en int firmado, sin embargo, no estoy seguro de cómo hacerlo correctamente.
Una pequeña sección del mensaje CAN dentro de un período de tiempo corto (nos centramos en los bytes 2 y 3):
can0 700 [8] 00 00 99 93 55 0B EF BD
can0 700 [8] 00 00 95 95 10 0C 17 BE
can0 700 [8] 00 00 6F 97 FB 0A 17 BE
can0 700 [8] 00 00 39 99 5C 0A 40 BE
can0 700 [8] 00 00 AD 9A 62 08 EF BD
can0 700 [8] 00 00 EF 9B B5 08 40 BE
can0 700 [8] 00 00 CA 9D 9A 09 17 BE
can0 700 [8] 00 00 3E 9F 55 09 40 BE
can0 700 [8] 00 00 91 A0 ED 09 17 BE
Por lo que sé, por lo general, los datos en los mensajes CAN siguen este formato: un byte para los datos reales, un byte para el número de desbordamientos.
Por ejemplo, tomemos un int sin signo de un valor de 2000. Suponiendo que el byte # 0 es para desbordamientos, el byte # 1 es para los datos reales, obtenemos:
CAN message -> [07, D0, x, x, x, x, x, x]
07 que indica que ha habido 7 desbordamientos, D0 que indica que el resto es 208, por lo tanto:
7*255 + 208 = 2000
Entiendo cómo hacerlo con valores sin firmar. Pero esta vez en mi escenario estoy tratando con valores firmados. Supongo que un byte es para desbordamientos, un byte es para el resto, pero no estoy seguro.
-
¿Cómo se calculan los desbordamientos para los valores firmados? ¿Está desbordado + = 1 cuando el valor > 127 y desbordamiento - = cuando valor < -128? ¿Tiene sentido incluso que los desbordamientos tengan firmeza?
-
¿Cómo puedo convertir estos bytes en decimales firmados en C / C ++? Digamos que mi valor de byte en hexadecimal es 91. La última vez que intenté almacenarlo en int y lo imprimí, se imprimió 145 (binario normal) y no -111 (complemento de 2). ¿Cómo puedo imponer el complemento de 2 (si eso tiene sentido) en mi código?
-
¿Podría estar interpretando mal el formato de byte? Todo lo que dice es que estos dos bytes representan el ángulo de dirección y que el ángulo de dirección es int16_t. Los he monitoreado los cambios en tiempo real y uno de ellos cambia erráticamente, casi como saltar de 00 a FF, mientras que el otro está aumentando / disminuyendo lentamente y casi linealmente con el tiempo. Ideas?
Realmente estoy atrapado aquí, ni siquiera sé si voy en la dirección correcta ... ¡Cualquier sugerencia y ayuda son realmente apreciadas!