write serial reading read leer funciona example data como and c++ struct byte arduino xbee

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; }