Отправка структуры из Arduino в Raspberry Pi — неправильные типы

Я использую Raspberry Pi и Arduino для своего проекта домашней автоматизации, где Raspberry Pi является контроллером узлов Arduino. Для связи я использую беспроводные приемопередатчики nRF24.

Моя проблема в том, что когда я отправляю следующую структуру

struct TempSensorData

{ uint32_t результат; uint32_t температура; uint32_t влажность; };

От Raspberry до Raspberry все прошло нормально, но теперь, когда я использую Arduino в качестве отправителя, я получаю очень странные результаты:

received: status: 335544320, temperature: 754974720 degrees, humidity: 0%

На Raspberry это было

received: status: 0, temperature: 22 degrees, humidity: 44%

Может ли это быть связано с типами? Или с разной архитектурой (например, с разным размером на 3-битной и 64-битной архитектурах)?

РЕДАКТИРОВАТЬ:

Код на Raspberry:

if (radio.available())

{ // сбрасываем полезные данные, пока не получим все Получено сообщениеData = {0}; радио.read(&receivedData, sizeof(Message)); Данные TempSensorData = receivedData.msgData.tempSensorData; std::cout << "получено: статус: " << data.result << ", температура: " << data.temperature << " градусы, влажность: " << data.humidity << "%" << std::endl; //TODO здесь у нас какие-то странные числа — проверяем, правильные ли у нас типы }

До этого я:

radio.begin();
radio.setPALevel(RF24_PA_LOW);
radio.setChannel(0x4c);
radio.openReadingPipe(1, RASPI_READ_ADDR);
radio.openWritingPipe(RASPI_WRITE_ADDR);

radio.enableDynamicPayloads();
radio.setAutoAck(true);
radio.powerUp();
radio.startListening();

И на Arduino:

Header header = {thisNodeId, thisNodeType, 0, static_cast<uint8_t>(MsgType::TEMP_SENSOR_DATA), 12345, Status::ok};
TempSensorData dhtData;
dhtData.result = DHT.read11(DHT11_PIN);
dhtData.humidity = (int)DHT.humidity;
dhtData.temperature = (int)DHT.temperature;
Message message = {0};
message.header = header;
message.msgData.tempSensorData = (dhtData);
radio.stopListening();
radio.write(&message, sizeof(message));
radio.startListening();

Я также использую общий заголовок с определенными структурами для Arduino и Raspberry, который содержит:

#define RASPI_WRITE_ADDR 0xF0F0F0F0F0LL
#define RASPI_READ_ADDR 0xF0F0F0F0E1LL

struct TempSensorData {   
  uint32_t result;
  uint32_t temperature;
  uint32_t humidity;
};  

enum class Status : uint8_t

{
хорошо, ошибка, неудача };

enum class MsgType : uint8_t {
    INITIALIZATION,
    RESET_REQUEST,
    ACK_NACK,
    TEMP_SENSOR_DATA,
};

struct Header {
  uint8_t nodeId;
  uint8_t nodeType;
  uint8_t location;
  uint8_t msgType;
  uint16_t checksum;
  Status status;
};

union MsgData {
  InitMsgData initMsgData;
  AckNack ackNack;
  TempSensorData tempSensorData;
};

struct Message {
    Header header;
    MsgData msgData;
};

радио — это элемент класса RF24 из https://github.com/TMRh20/RF24/

К сожалению, репозиторий RF24 на 64 коммита опережает тот, который я использую.

РЕДАКТИРОВАНИЕ2:

Возможно, проблема в этом

enum class Status {};

который я использую в обоих файлах.

Должен добавить, что при компиляции на Raspberry я использую g++-4.7, а при компиляции на Arduino — avr-g++-4.8.2

, 👍2