2017-09-19 3 views
2

Je déclare un tableauLire à partir du tableau deux octets à la fois?

uint8_t data_buffer[64]; 

Je vous écris dans, puis j'ai besoin de itérer dessus regardant qu'il stocke des données. Les données sont écrites en groupes de deux.

En ce moment je suis en train de faire quelque chose comme ça désordre

for(int i = 1; i < BUFFER_LEN + 1; i += 2) 
{ 
    if(data_buffer[i] == 0xff && data_buffer[i+1] == 0xff) 
    { 
     write_led_states(i/2 + 1, OFF); 
    } 
    else 
    { 
     write_led_states(i/2 + 1, ON); 
    } 
} 

Mais je préfère de beaucoup être en mesure de lire deux octets de données à la fois de la mémoire tampon pour que je puisse faire quelque chose comme ceci:

for(int i = 1; i < BUFFER_LEN + 1; i++) 
{ 
    if(data_buffer[i] == 0xffff) // where data_buffer is being read two bytes at a time 
    { 
     write_led_states(i, OFF); 
    } 
    else 
    { 
     write_led_states(i, ON); 
    } 
} 

Une autre façon de dire ce que je veux faire est de redéfinir les indices afin qu'ils vont de ressembler à ceci:

[1][2][3][4][5][6][7][8] 

d'aimer ceci:

[1...][2...][3...][4...] 

Est-ce possible?

+3

Votre code actuel me semble accéder au tableau hors limites. Vous savez que les tableaux sont basés sur 0, n'est-ce pas? –

+0

Le premier octet du tampon n'est pas utilisé? ('data_buffer [0]') –

+0

Le premier octet du tampon contient un indicateur notant le type de données qui suit. Mais je suppose que oui, je sors des limites à la fin. – Indigo

Répondre

2

Change ceci:

uint8_t data_buffer[64]; 

à ceci:

uint16_t data_buffer[32]; 

uint_16_t utilise 2 octets (16 bits) par élément (et ajuster la taille de la moitié de 64).


PS: Votre code semble accéder à un tableau hors limites, qui invoque Comportement non défini, ici:

for(int i = 1; i < BUFFER_LEN + 1; i += 2) 

indexation Array commence à 0, ce qui devrait commencer à 0 et l'état doit être i < BUFFER_LEN.

Cependant, avec mon appraoch, vous n'avez pas besoin d'augmenter par deux, vous faites simplement un endroit propre pour la boucle, comme ceci:

for(int i = 0; i < BUFFER_LEN; ++i) 
+0

Il peut y avoir un problème gros/petit endian ici. Avez-vous vérifié cela? –

+1

@PaulOgilvie, pourquoi? il vérifie '0xffff' qui se trouve être la même représentation dans little/big endian. –

+0

@LuisColorado, Si cela ne concernait que 0xffff, il n'y aurait pas de problème. Serait-ce seulement une utilisation ou un exemple alors il peut y avoir un problème qui n'est pas couvert par la solution, et la solution n'indique pas cette supposition/limitation. –

1

utiliser simplement un lieu uint16_t, qui est de 2 octets par élément,

uint16_t data_buffer[32]; 

être prudent avec boutisme si elle peut être un problème.

Remarque: il semble que vous ne savez pas que les tableaux sont 0 indexées, afin

for (int i = 1; i < BUFFER_LEN + 1; i += 2) 

Shoul probablement (très probablement),

for (int i = 0; i < BUFFER_LEN; i += 2) 

Et en cas vous faites ce que je vous propose, chaque élément est de 2 octets de sorte que vous aurez besoin de la moitié du nombre d'éléments et bien sûr, vous incrémenter i par 1

for (int i = 0; i < BUFFER_LEN; ++i) 
0

Vous pouvez combiner les deux éléments uint8_t en un seul uint16_t par bhtshifting:

for (int i = 1; i < BUFFER_LEN + 1; i += 2) { 
    uint16_t pair = data_buffer[i] << 8 | data_buffer[i+1]; 
    LEDState newLEDState = (pair == 0xffff) ? OFF : ON; // replace "LEDState" with the proper type 
    write_led_states(i/2 + 1, newLEDState); 
}