Отправка структуры по i2c
Как бы вы отправили структуру из подчиненного устройства i2c, когда ее запросил мастер i2c?
Скетч Slave Struct Respdonder (Seeeduino Xiao)
#include <Wire.h>
struct TransmitData
{
int a;
int b;
int c;
int d;
float e;
float f;
float g;
float h;
};
TransmitData data;
void setup()
{
Serial.begin(9600);
Wire.begin(2);
Wire.onRequest(requestEvent);
data.a = 1;
data.b = 2;
data.c = 3;
data.d = 4;
data.e = 5.1;
data.f = 6.1;
data.g = 7.1;
data.h = 8.1;
}
void loop()
{
delay(100);
}
void requestEvent()
{
Serial.print("sending ("); Serial.print(sizeof data); Serial.println(" bytes)");
Wire.write((byte *)&data, sizeof data);
}
Мастер-структура Запроса/приемника скетча (Arduino MEGA)
#include <Wire.h>
struct TransmitData
{
int32_t a;
int32_t b;
int32_t c;
int32_t d;
float e;
float f;
float g;
float h;
};
TransmitData data;
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
Serial.print("requesting ("); Serial.print(sizeof data); Serial.print(" bytes)... ");
if (Wire.requestFrom(2, sizeof data)) {
Wire.readBytes((byte*) &data, sizeof data);
Serial.println("done");
Serial.println(data.a);
Serial.println(data.b);
Serial.println(data.c);
Serial.println(data.d);
Serial.println(data.e);
Serial.println(data.f);
Serial.println(data.g);
Serial.println(data.h);
}
else {
Serial.println("could not connect");
}
delay(500);
}
Последовательный выход на ведомом устройстве выглядит следующим образом:
sending (32 bytes)
Последовательный выход на ведущем устройстве выглядит следующим образом:
requesting (24 bytes)... done
1
0
2
0
0.00
0.00
5.10
6.10
@waspinator, 👍1
Обсуждение1 ответ
▲ 2
int
не гарантирует одинакового размера на разных платформах. Вместо этого используйте целочисленные типы с фиксированной шириной.
https://en.cppreference.com/w/cpp/types/integer
struct TransmitData
{
int32_t a;
int32_t b;
int32_t c;
int32_t d;
float e;
float f;
float g;
float h;
};
,
@waspinator
Смотрите также:
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
Вы можете попробовать библиотеку [I2C_Anything](https://github.com/nickgammon/I2C_Anything) Ник Гэммон, @chrisl