2015-10-20 5 views
5

Sto provando a convertire la seguente struttura in un array di caratteri in modo che possa essere inviata tramite la porta seriale.Conversione di una struttura in un array di car usando memcpy

struct foo 
{ 
    uint16_t voltage; 
    char ID ; 
    char TempByte; 
    char RTCday[2]; 
    char RTCmonth[2]; 
    char RTCyear[2]; 
    char RTChour[2]; 
    char RTCmin[2]; 
    char Sepbyte; 
}dvar = { 500, 'X' , '>' , "18" , "10" , "15" , "20" , "15" , '#'}; 

ho quindi convertirlo in un array di caratteri utilizzando il seguente:

char b[sizeof(struct foo)]; 
memcpy(b, &dvar, sizeof(struct foo)); 

Tuttavia, per qualche motivo ottengo questi valori finali della matrice char

0x0A 0xFF 

all'inizio ho pensato che stava ottenendo i valori perché quando l'ho lanciato in un array di caratteri era effettivamente il casting su una stringa, quindi ho pensato che fosse NULL '\ 0'

Qualsiasi aiuto sarà apprezzato.

Grazie

+4

Non vedo dove è la struttura 'datadownload' e qual è la dimensione di esso – Gopi

+1

Cosa intendi per" valori finali "? Come si esamina il contenuto dell'array? E stai programmando C o C++? La semantica potrebbe essere diversa. Su una nota non correlata, hai comunque pensato di usare un sindacato? –

+2

http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-ofsizeof-of-each-member – Lundin

risposta

1

Ho il sospetto che stai usando un microcontrollore a 8 bit! Puoi eseguire il debug scrivendo b[sizeof(foo)] e b[sizeof(foo)+1] Questi saranno i tuoi due personaggi. Se hai notato, non dovresti fare riferimento a questi, sono fuori dai limiti del tuo array di caratteri. es. n array di elementi [0 .. (n-1)] (copiati dalla tua struct)

Se aggiungi un elemento inutilizzato alla tua struct (o aumenta la dimensione del membro finale) il char array può essere terminato ' \ 0 '-compiler probabilmente vuole farlo.

Oppure eseguire un'assegnazione del puntatore come mostrato da @Melebius.

4

Sui processori moderni, sizeof (struct download dei dati) deve essere allineata su 32bit confini. La dimensione della struttura dati è 8 caratteri + 1 breve (16 bit) intero. Il compilatore deve aggiungere 2 caratteri alla dimensione della struttura per poterlo gestire correttamente quando lo si assegna. Dato che stai comunicando su una linea seriale e sai esattamente cosa stai inviando, potresti anche specificare il numero esatto di byte che sei disposto a inviare sulle tue linee seriali: 2 +/* 1 breve */+ 8 (8 byte).