2016-01-08 3 views
0

Je travaille avec un module ZigBee basé sur ARM Cortex-M3 32 bits. Mais ma question n'est pas liée au protocole ZigBee lui-même. J'ai seulement accès au code source de la couche d'application, ce qui devrait suffire à mes fins. couche inférieure (APS) transmet des données à la couche d'application dans APSDE-DATA.indication primitive de la fonction de demande suivante:La décomposition d'une chaîne d'octets bruts avec une structure particulière donne des données erronées

void zbpro_dataRcvdHandler(zbpro_dataInd_t *data) 
{ 
    DEBUG_PRINT(DBG_APP,"\n[APSDE-DATA.indication]\r\n"); 

    /* Output of raw bytes string for further investigation. 
    * Real length is unknown, 50 is approximation. 
    */ 
    DEBUG_PRINT(DBG_APP,"Raw data: \n"); 
    DEBUG_PRINT(DBG_APP,"----------\n"); 
    for (int i = 0; i < 50; i++){ 
     DEBUG_PRINT(DBG_APP,"%02x ",*((uint8_t*)data+i)); 
    } 
    DEBUG_PRINT(DBG_APP,"\n"); 

    /* Output of APSDE-DATA.indication primitive field by field */ 
    DEBUG_PRINT(DBG_APP,"Field by field: \n"); 
    DEBUG_PRINT(DBG_APP,"----------------\n"); 
    DEBUG_PRINT(DBG_APP,"Destination address: "); 
    for (int i = 0; i < 8; i++) 
     DEBUG_PRINT(DBG_APP,"%02x ",*((uint8_t*)data->dstAddress.ieeeAddr[i])); 
    DEBUG_PRINT(DBG_APP,"\n"); 
    DEBUG_PRINT(DBG_APP,"Destination address mode: 0x%02x\r\n",*((uint8_t*)data->dstAddrMode)); 
    DEBUG_PRINT(DBG_APP,"Destination endpoint: 0x%02x\r\n",*((uint8_t*)data->dstEndPoint)); 
    DEBUG_PRINT(DBG_APP,"Source address mode: 0x%02x\r\n",*((uint8_t*)data->dstAddrMode)); 
    DEBUG_PRINT(DBG_APP,"Source address: "); 
    for (int i = 0; i < 8; i++) 
     DEBUG_PRINT(DBG_APP,"%02x ",*((uint8_t*)data->srcAddress.ieeeAddr[i])); 
    DEBUG_PRINT(DBG_APP,"\n"); 
    DEBUG_PRINT(DBG_APP,"Source endpoint: 0x%02x\r\n",*((uint8_t*)data->srcEndPoint)); 
    DEBUG_PRINT(DBG_APP,"Profile Id: 0x%04x\r\n",*((uint16_t*)data->profileId)); 
    DEBUG_PRINT(DBG_APP,"Cluster Id: 0x%04x\r\n",*((uint16_t*)data->clusterId)); 
    DEBUG_PRINT(DBG_APP,"Message length: 0x%02x\r\n",*((uint8_t*)data->messageLength)); 
    DEBUG_PRINT(DBG_APP,"Flags: 0x%02x\r\n",*((uint8_t*)data->flags)); 
    DEBUG_PRINT(DBG_APP,"Security status: 0x%02x\r\n",*((uint8_t*)data->securityStatus)); 
    DEBUG_PRINT(DBG_APP,"Link quality: 0x%02x\r\n",*((uint8_t*)data->linkQuality)); 
    DEBUG_PRINT(DBG_APP,"Source MAC Address: 0x%04x\r\n",*((uint16_t*)data->messageLength));  
    DEBUG_PRINT(DBG_APP,"Message: "); 

    for (int i = 0; i < 13; i++){ 
     DEBUG_PRINT(DBG_APP,"%02x ",*((uint8_t*)data->messageContents+i)); 
    } 
    DEBUG_PRINT(DBG_APP,"\n"); 

    bufm_deallocateBuffer((uint8_t *)data, CORE_MEM); 
} 

primitive APSDE-DATA.indication est mis en oeuvre par les structures suivantes:

/** 
* @brief type definition for address (union of short address and extended address) 
*/ 
typedef union zbpro_address_tag { 
    uint16_t shortAddr; 
    uint8_t ieeeAddr[8]; 
} zbpro_address_t; 

/** 
* @brief apsde data indication structure 
*/ 
PACKED struct zbpro_dataInd_tag { 
    zbpro_address_t dstAddress; 
    uint8_t dstAddrMode; 
    uint8_t dstEndPoint; 
    uint8_t srcAddrMode; 
    zbpro_address_t srcAddress; 
    uint8_t srcEndPoint; 
    uint16_t profileId; 
    uint16_t clusterId; 
    uint8_t messageLength; 
    uint8_t flags; /* bit0: broadcast or not; bit1: need aps ack or not; bit2: nwk key used; bit3: aps link key used */ 
    uint8_t securityStatus; /* not-used, reserved for future */ 
    uint8_t linkQuality; 
    uint16_t src_mac_addr; 
    uint8_t messageContents[1]; 
}; 
typedef PACKED struct zbpro_dataInd_tag zbpro_dataInd_t; 

Comme en conséquence, je reçois suivant:

[APSDE-DATA.indication] 

Raw data: 
--------- 
00 00 00 72 4c 19 40 00 02 e8 03 c2 30 02 fe ff 83 0a 00 e8 05 c1 11 00 11 08 58 40 72 4c ae 53 4d 3f 63 9f d8 51 da ca 87 a9 0b b3 7b 04 68 ca 87 a9 

Field by field: 
--------------- 
Destination address: 00 00 00 28 fa 44 34 00 
Destination address mode: 0x12 
Destination endpoint: 0xc2 
Source address mode: 0x12 
Source address: 13 01 12 07 02 bd 02 00 
Source endpoint: 0xc2 
Profile Id: 0xc940 
Cluster Id: 0x90a0 
Message length: 0x00 
Flags: 0x00 
Security status: 0x04 
Link quality: 0x34 
Source MAC Address: 0x90a0 
Message: ae 53 4d 3f 63 9f d8 51 da ca 87 a9 0b 

de cette sortie, je peux voir que si la chaîne brute a des valeurs attendues, expédié les champs sont totalement différents. Quelle est la raison de ce comportement et comment le réparer? Est-ce lié à l'architecture ARM ou au mauvais type de casting?

Je n'ai pas accès à l'implémentation de DEBUG_PRINT, mais nous pouvons supposer que cela fonctionne correctement.

+0

C'est en fait un 'uint8_t'. Lancer 'uint8_t' à' uint8_t * 'n'a pas beaucoup de sens. –

Répondre

2

Il n'y a pas besoin de déréférencer dans vos déclarations de debug_print, par exemple

DEBUG_PRINT(DBG_APP,"%02x ",*((uint8_t*)data->dstAddress.ieeeAddr[i])); 

devrait être tout simplement

DEBUG_PRINT(DBG_APP,"%02x ", data->dstAddress.ieeeAddr[i]); 

ainsi de suite et ainsi de suite ...

1

Considérez ce code:

DEBUG_PRINT(DBG_APP,"%02x ",*((uint8_t*)data->dstAddress.ieeeAddr[i])); 

et l'accès subscripting Tableau des membres directs et indirects ont une priorité plus élevée que ne le fait la coulée, de sorte que le troisième argument est équivalent à

*((uint8_t*) (data->dstAddress.ieeeAddr[i])) 

Mais data->dstAddress.ieeeAddr[i] n'est pas un pointeur, il est un uint8_t. C vous permet de le convertir en un pointeur en moulant, mais le résultat n'est pas un pointeur à la valeur, mais plutôt une interprétation de pointeur de la valeur. Le déréférencement produit un comportement indéfini.

La même chose s'applique à vos autres appels DEBUG_PRINT(). `Data-> dstAddrMode` (et la plupart des autres éléments de votre structure) n'est pas une adresse *