2016-10-09 2 views
2

Un nouveau centre de traitement de données par satellite vient d'être achevé et prêt pour le test initial en utilisant des données en direct envoyées à partir d'un satellite en orbite. Comme les premiers messages sont affichés sur l'écran et vous remarquez que beaucoup de valeurs de données sont hors de portée. Par exemple, sur l'écran du terminal est défini comme "delta time" et il semble être hors de la plage attendue [0.01 à 10.000.00 secondes], mais la valeur affichée (en tant que double) est [-4.12318024e- 028 secondes]. Après un examen plus approfondi du flux de données basé sur les octets bruts, vous trouvez que les données d'origine ont été envoyées par le satellite pour ce double mot comme [0xC0 0x83 0xA1 0xCA 0x66 0x55 0x40 0xBA]. Sur l'un des anciens terminaux, ces données s'affichent correctement et se situent dans la plage attendue.Erreur de traitement de données par satellite

a. [5] What caused this problem? 
b. [5] If this is the real problem, what should the actual value be? 

Répondre

0

Ah, analyse de mode de défaillance. Très important en effet!

Eh bien, l'autre terminal affiche correctement les données -> il existe une incompatibilité entre le terminal et les données.

Big Endian, petit Endian peut-être? Je m'attends à ce que le "vieux" terminal soit petit Endian parce qu'il a peut-être été codé en C. Maintenant vous pouvez interpréter les données.

Voici un code

#include <stdio.h> 

union myW { 
    double x; 
    // Recieved as:[0xC0 0x83 0xA1 0xCA 0x66 0x55 0x40 0xBA] 
    unsigned char d[8] = {0x83, 0xC0,0xCA, 0xA1, 0x55, 0x66, 0xBA, 0x40}; 
}; 

union myBad { 
    double x; 
    // Recieved as:[0xC0 0x83 0xA1 0xCA 0x66 0x55 0x40 0xBA] 
    unsigned char d[8] = {0xC0, 0x83,0xA1, 0xCA, 0x66, 0x55, 0x40, 0xBA}; 
}; 


int main(void) 
{ 
    myW value; 
    value.x = 1.0; // check how reasonable number looks like 

    printf("Something reasonable: \n"); 
    for(int i = 0; i < 8; i++) 
    { 
     printf("%u ", value.d[i]); 
    } 

    myW received; 
    printf("\nWhat shouldve been displayed:\n"); 
    for(int i = 0; i < 8; i++) 
    { 
     printf("%u ", received.d[i]); 
    } 
    printf("\n%f\n", received.x); 

    myBad bad; 
    printf("\nBad output as:\n"); 
    for(int i = 0; i < 8; i++) 
    { 
     printf("%u ", bad.d[i]); 
    } 
    printf("\n%0.30f\n", bad.x); 
} 

Sortie:

Something reasonable: 
0 0 0 0 0 0 240 63 
What shouldve been displayed:: 
131 192 202 161 85 102 186 64 
6758.334500 

Bad output as: 
192 131 161 202 102 85 64 186 
-0.000000000000000000000000000412 

avec Compilé g ++

+0

J'ai essayé octets inverse + inverse bits + XOR 0x80, et le résultat est '2.39' .. Mais ... vous ne pensez pas, puisque c'est un problème, le résultat est susceptible d'être quelque chose de plus «arrondi», comme «20.0» ou quelque chose de remarquable, comme «3.14159» ... –

+0

Pourquoi vous attendez-vous à cela? Parce que c'est un problème "académique"? C'est dans la fourchette attendue! [0.01 à 10.000.00 secondes] – Makketronix