¿Cómo debo interpretar este paquete USB de forma legible para los humanos?

1

Usando un wixel (transmisor / receptor inalámbrico con capacidad USB, esta cosa "wixel" es una placa de microcontrolador de uso general que incluye, entre otras cosas, USB, 2 UART's y una radio de 2.4GHz ") en conjunto con esta aplicación de wixel para leer en una transmisión desde un sensor de glucosa Dexcom / transmisor, para uso en algún software que estoy escribiendo. Aquí están las piezas relevantes del código C:

void print_packet(Dexcom_packet* pPkt) {
    uartEnable();
    printf("%lu %hhu %d\n", dex_num_decoder(pPkt->raw), pPkt->battery, adcConvertToMillivolts(adcRead(0)));
    uartDisable();
}

uint32 dex_num_decoder(uint16 usShortFloat) {
    uint16 XDATA usReversed = usShortFloat;
    uint8 XDATA usExponent = 0;
    uint32 XDATA usMantissa = 0;
    bit_reverse_bytes((uint8*)&usReversed, 2);
    usExponent = ((usReversed & 0xE000) >> 13);
    usMantissa = (usReversed & 0x1FFF);
    return usMantissa << usExponent;
}

void bit_reverse_bytes(uint8* buf, uint8 nLen) {
    uint8 XDATA i = 0;
    for(; i < nLen; i++) {
        buf[i] = bit_reverse_byte(buf[i]);
    }
}

uint8 bit_reverse_byte(uint8 in) {
uint8 XDATA bRet = 0;
if(in & 0x01)
    bRet |= 0x80;
if(in & 0x02)
    bRet |= 0x40;
if(in & 0x04)
    bRet |= 0x20;
if(in & 0x08)
    bRet |= 0x10;
if(in & 0x10)
    bRet |= 0x08;
if(in & 0x20)
    bRet |= 0x04;
if(in & 0x40)
    bRet |= 0x02;
if(in & 0x80)
    bRet |= 0x01;
return bRet;
}

Mi problema es que las lecturas que recibo no tienen sentido. Estoy usando Labview para escribir mi software, por lo que empleé una simple lectura de VISA (escuchando un paquete) para un número desconocido de bytes y un carácter de terminación \ n. El resto de la aplicación de Wixel muestra que está usando el control de flujo de hardware RTS / CTS, así que lo he configurado. Mi problema es que estoy esperando un decimal largo (% lu), un carácter corto sin signo (% hhu) y un decimal (% d), pero cuando leo los bytes individuales recibidos como estos tipos de datos, mis valores vienen fuera raro.

Por ejemplo, una lectura de 98 en el medidor de glucosa real fue "117888 215 0 \ n" en mi paquete. He descartado endianness, ya que la lectura de los bytes hacia atrás como ASCII da caracteres de estilo Unicode súper extraños. Simplemente no veo cómo el primer número está relacionado de alguna manera con el segundo. Sinceramente, creo que puedo estar interpretando incorrectamente el tipo de datos, aunque sé que printf proporciona caracteres puramente ASCII. Lo último extraño es que el 215 casi siempre aparece en algún lugar del paquete, ya sea el primer número, el número intermedio o el último número. Es bastante extraño y me lleva a creer que me podría estar perdiendo algo.

Cualquier ayuda para interpretar estos datos sería apreciada.

    
pregunta ijustlovemath

1 respuesta

0

Resulta que, el valor sin procesar (que es de lo que estaba publicando) necesita ser calibrado a través de una regresión lineal para convertirlo en el valor que estoy buscando. La regresión inicial es aproximadamente glucose(raw)=1.0*(raw/1000) - 30 , con lecturas adicionales del sensor que se utilizan en un ajuste de mínimos cuadrados para refinar los coeficientes. En caso de duda, hacer algunas estadísticas! ¡Gracias a todos los que hicieron el esfuerzo de ayudarme!

    
respondido por el ijustlovemath

Lea otras preguntas en las etiquetas