Leggere una stringa con Wire.read() in comunicazione I2C?

Salve a tutti, sto realizzando una comunicazione i2C tra un Arduino Nano ed un Arduino Mega. Arduino Mega funzionerà da master, mentre Nano sarà slave. Per comporre la stringa sto utilizzando la comodissima libreria ArduinoJson. Tutti i dati vengono salvati in un char array, il quale poi viene serializzato con apposita funzione e inviato sul bus I2C. Il problema non è mandare la stringa, questo mi è chiaro. Non so come deserializzare con lo slave la stringa inviata.
Le funzioni che sto utilizzando sono:
Master:

Wire.beginTransmission(4);
DynamicJsonDocument doc (256);
doc["btn1"] = btn1;
doc["btn2"] = btn2;
serializeJson (doc, buffer);
Wire.write(buffer);
Wire.endTransmission();

Slave:

void receiveEvent(int howMany) {
while (0 <Wire.available()) {
DynamicJsonDocument doc (256);

buffer = Wire.read();
deserializeJson (doc, buffer);
int btn1 = doc["btn1"];
int btn2 = doc["btn2"];

Non so davvero come fare. Ma sono sicuro che qualcuno di voi può darmi una mano. Ringrazio in anticipo.

@nicoib come prima cosa dovresti correggere il tuo post e racchiudere il codice usando gli appositi tag image

Il tuo errore nasce da un presupposto sbagliato. L'istruzione Wire.read(); legge un byte alla volta a differenza dell'istruzione Wire.write(buffer); che invece puoi chiamare passando solo l'indirizzo del buffer (ci pensa poi il metodo write "internamente" a scorrere il buffer ed inviare sul bus i2c byte dopo byte).

Ciò detto, io temo che il tuo caso sia il classico esempio di problema XY perché prima chiedi informazioni sul bus SPI, ora I2C.
Se devi instaurare una comunicazione tra 2 dispositivi, non è la scelta del tipo di bus a risolvere il problema! Devi adottare un protocollo di comunicazione - anche minimo- per capire chi, come e quando vuole inviare un messaggio impegnando il bus (sia esso seriale, SPI, I2C o quello che preferisci).
Esattamente quale sarebbe il tuo obiettivo?

Ciao grazie per la tua risposta. Il mio obbiettivo è quello di far scambiare dei dati tra due schede. Il master leggera tramite dei sensori alcuni parametri ambientali e li manderà allo slave il quale a sua volta invierà al master gli stati di alcuni pulsanti. Tutto qua. Ora il problema nasce perchè utilizzando JsonDocument non so come deserializzare la stringa inviata. Questo perche la funzione Wire.read() legge byte per byte. Per l'appunto non so come comporre tutti questi caratteri insieme per creare una stringa per deserializzare i dati.

Ma semplicemente creare una struttura, lasciando perdere tutto l'appesantimento del Json e usare una libreria già pronta ed affidabile per lo scambio di dati tra schede (anche tra più schede e con vari sistemi di trasmissione), come la libreria PJON che si trova in Megatopic no ? ? ? :smiling_imp:

Guglielmo

Non sapevo l'esistenza di questa libreria. Studierò questa libreria per utilizzarla al meglio

QUI la pagina della documentazione.

Guglielmo

Grazie mille

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.