Отправка структуры из 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
@lewiatan, 👍2
0
- Как получить тип данных переменной?
- Преобразование в Unix Timestamp и обратно
- Самый компактный способ питания Arduino от розетки
- Как заставить Arduino взаимодействовать с тремя другими Ардуино?
- avrdude: stk500_getsync(): not in sync: resp=0x00
- Ошибка "avrdude:stk500_recv(): programmer is not responding" при загрузке скетча в Arduino Pro Mini
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Сторожевой таймер застрял в цикле перезапуска? (мигает зеленый светодиод)