c++ - serial - Convertir struct a byte y de nuevo a struct
serial arduino example (4)
Actualmente estoy trabajando con Arduino Uno s, 9DOFs y XBee s, e intentaba crear una estructura que pudiera enviarse en serie, byte por byte y luego volver a construirse en una estructura.
Hasta ahora tengo el siguiente código:
struct AMG_ANGLES {
float yaw;
float pitch;
float roll;
};
int main() {
AMG_ANGLES struct_data;
struct_data.yaw = 87.96;
struct_data.pitch = -114.58;
struct_data.roll = 100.50;
char* data = new char[sizeof(struct_data)];
for(unsigned int i = 0; i<sizeof(struct_data); i++){
// cout << (char*)(&struct_data+i) << endl;
data[i] = (char*)(&struct_data+i); //Store the bytes of the struct to an array.
}
AMG_ANGLES* tmp = (AMG_ANGLES*)data; //Re-make the struct
cout << tmp.yaw; //Display the yaw to see if it''s correct.
}
Fuente: http://codepad.org/xMgxGY9Q
Este código no parece funcionar, y no estoy seguro de lo que estoy haciendo mal.
¿Cómo puedo solucionar esto?
Haces las cosas en el orden equivocado, la expresión.
&struct_data+i
toma la dirección de struct_data
y la aumenta i
veces el tamaño de la estructura .
Intenta esto en su lugar:
*((char *) &struct_data + i)
Esto convierte la dirección de struct_data
en un char *
y luego agrega el índice, y luego usa el operador de desreferencia (unario *
) para obtener el "char" en esa dirección.
Parece que he resuelto mi problema con el siguiente código.
struct AMG_ANGLES {
float yaw;
float pitch;
float roll;
};
int main() {
AMG_ANGLES struct_data;
struct_data.yaw = 87.96;
struct_data.pitch = -114.58;
struct_data.roll = 100.50;
//Sending Side
char b[sizeof(struct_data)];
memcpy(b, &struct_data, sizeof(struct_data));
//Receiving Side
AMG_ANGLES tmp; //Re-make the struct
memcpy(&tmp, b, sizeof(tmp));
cout << tmp.yaw; //Display the yaw to see if it''s correct
}
ADVERTENCIA: este código solo funcionará si el envío y la recepción utilizan la misma arquitectura endian .
Siempre utilice las estructuras de datos al máximo.
union AMG_ANGLES {
struct {
float yaw;
float pitch;
float roll;
}data;
char size8[3*8];
int size32[3*4];
float size64[3*1];
};
for(unsigned int i = 0; i<sizeof(struct_data); i++){
// +i has to be outside of the parentheses in order to increment the address
// by the size of a char. Otherwise you would increment by the size of
// struct_data. You also have to dereference the whole thing, or you will
// assign an address to data[i]
data[i] = *((char*)(&struct_data) + i);
}
AMG_ANGLES* tmp = (AMG_ANGLES*)data; //Re-Make the struct
//tmp is a pointer so you have to use -> which is shorthand for (*tmp).yaw
cout << tmp->yaw;
}