El mejor método para transferir dos valores de porcentaje int a través de un bus CAN

2

Tengo dos enteros:

  • int A es un valor desde -100 hasta 0 y
  • int B es un valor de 0 a 100

¿Cuál es la forma más efectiva de poner esto en un mensaje CAN y decodificarlo nuevamente en el otro microcontrolador?

Para el mensaje CAN tengo esta estructura:

typedef struct
{
    uint16_t id;
    uint8_t length : 4;
    uint8_t data[8];
} CANmessage;
    
pregunta kimliv

2 respuestas

9

No necesita int para almacenar esos valores; bastará con un int8_t . int8_t puede almacenar desde -128 hasta +127.

Luego simplemente coloque int8_t A en los datos [0], int8_t B en los datos [1] (envíelos a uint8_t ) y establezca la longitud es 2. Léalos desde allí en el otro extremo como uint8_t (envíalos a int8_t ), y el hermano de Robert es tu madre.

Sin embargo, ni siquiera necesita restringirlo a int8_t, podría usar uint8_t en todo. Los valores que tienes son -100-0 y 0-100. Esos son ambos rangos de 101 valores. 101 cabe en 8 bits sin firmar fácilmente. Siempre que ambos extremos estén de acuerdo en que el valor positivo en los datos [0] es un valor negativo (almacenar -34 como 34), entonces utilícelo como tal (reste los datos [0] de 0, entonces 34 se convierte en -34), entonces no Necesito transmitir el - signo.

    
respondido por el Majenko
6

Desea enviar dos números para que cada uno pueda tener 101 valores diferentes. Por lo tanto, hay 101 x 101 = 10,201 diferentes valores globales posibles que puede enviar. Log2 (10,201) = 13.3, por lo que siempre puede ajustar su mensaje en 14 bits binarios. Los datos en un bus CAN se envían en trozos de 8 bits de bytes, por lo que necesita un mínimo de dos de ellos. El esquema de codificación más simple sería utilizar un byte para cada valor.

Hay una sobrecarga significativa con cada trama de bus CAN, por lo tanto si envía 2 o 3 o 4 o más bytes de datos en una trama no hace mucha diferencia en el protocolo general. Si realmente desea minimizar las longitudes de trama CAN, vea si puede codificar la información en la ID de trama. Si esta es la única información que su bus CAN llevará, entonces tiene otros 11 bits de ID más allá de los 0 a 8 bytes de datos opcionales en una trama estándar, y 29 bits de ID más allá de los bytes de datos en una trama extendida. Por ejemplo, podría usar marcos de datos estándar con un byte de datos cada uno. Eso le da 11 bits de ID más 8 bits de datos para un total de 19 bits que puede controlar. Eso le da 5 bits más allá de sus datos en bruto que puede usar como un código de operación o algo así.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas