Обратите внимание, что структура вашей структуры создает проблему в 32-битной системе. Многие (большинство) 32-битных архитектур ЦП требуют 4-байтового выравнивания для 32-битных слов, поэтому new_weld_count требует 'padding' для обеспечения правильного выравнивания памяти.
typedef struct
{
unsigned char new_weld_status[2]; //a
//char padding_1[2]; //hidden padding
UINT32 new_weld_count; //a
UINT16 new_weld_fail_count; //a
} NEW_PULSE_DATA;
Следующее переопределение вашей структуры полностью устраняет проблему.
typedef struct
{
UINT32 new_weld_count; //a
UINT16 new_weld_fail_count; //a
unsigned char new_weld_status[2]; //a
} NEW_PULSE_DATA;
NEW_PULSE_DATA ex_PULSE_DATA;
Однако вышеописанный подход не является подходом, обычно используемым для передачи структурных (передаваемых) данных по сетям / по сообщениям. Более распространенный и гораздо лучший подход заключается в использовании уровня сериализации / десериализации (он же маршаллинг) для размещения структур в форматах «по проводам». Ваш текущий подход заключается в совмещении хранения в памяти и адресации с форматом связи.
//you need to decide on the size of wire format data,
//Both ends of the protocol must agree on these sizes,
#define new_weld_count_SZ sizeof(ex_PULSE_DATA.new_weld_count)
#define new_weld_fail_count_SZ sizeof(ex_PULSE_DATA.new_weld_fail_count)
#define new_weld_status_SZ sizeof(ex_PULSE_DATA.new_weld_status)
//Then you define a network/message format
typedef struct
{
byte new_weld_count[new_weld_count_SZ];
byte new_weld_fail_count[new_weld_count_SZ];
byte new_weld_status[new_weld_count_SZ];
} MESSAGE_FORMAT_PULSE_DATA;
Тогда вы реализуете функции сериализации и десериализации на обоих концах транспорта. Следующий пример упрощен, но содержит суть того, что вам нужно.
byte*
PULSE_DATA_serialize( MESSAGE_FORMAT_PULSE_DATA* msg, NEW_PULSE_DATA* data )
{
memcpy(&(msg->new_weld_count), data->new_weld_count, new_weld_count_SZ);
memcpy(&(msg->new_weld_fail_count), data->new_weld_fail_count, new_weld_fail_count_SZ);
memcpy(&(msg->new_weld_status), data->new_weld_status, new_weld_status_SZ);
return msg;
}
NEW_PULSE_DATA*
PULSE_DATA_deserialize( NEW_PULSE_DATA* data, MESSAGE_FORMAT_PULSE_DATA* msg )
{
memcpy(data->new_weld_count, &(msg->new_weld_count), new_weld_count_SZ);
memcpy(data->new_weld_fail_count, &(msg->new_weld_fail_count), new_weld_fail_count_SZ);
memcpy(data->new_weld_status, &(msg->new_weld_status), new_weld_status_SZ);
return msg;
}
Обратите внимание, что я пропустил обязательные сетевые преобразования порядка байтов, потому что я предполагаю, что вы уже решили проблемы с порядком байтов между двумя доменами процессора. Если вы не рассматривали порядок байтов (от байтов до байтов), то вам также необходимо решить эту проблему.
При отправке сообщения отправитель выполняет следующие действия:
//you need this declared & assigned somewhere
NEW_PULSE_DATA data;
//You need space for your message
MESSAGE_FORMAT_PULSE_DATA msg;
result = send(PULSE_DATA_deserialize( &data, &msg ));
Когда вы получаете сообщение, получатель делает следующее,
//recipient needs this declared somewhere
NEW_PULSE_DATA data;
//Need buffer to store received data
MESSAGE_FORMAT_PULSE_DATA msg;
result = receive(&msg,sizeof(msg));
//appropriate receipt checking here...
PULSE_DATA_deserialize( &data, &msg );