Bonsoir, j’ai besoin de faire dialoguer deux machines entre elles…
Le maître demande à l’esclave quelque octets et c’est là qu’est le problème: je ne sais pas au moment où je lui demande, combien d’octets l’esclave va me retourner.
Voici le sketch master_reader:
// Wire Master Reader
// by Nicholas Zambetti <http://www.zambetti.com>
// Demonstrates use of the Wire library
// Reads data from an I2C/TWI slave device
// Refer to the "Wire Slave Sender" example for use with this
// Created 29 March 2006
// This example code is in the public domain.
//////////////////////////////////////////////////////////////////
// //
// Test en I²C de réception du maître //
// //
//////////////////////////////////////////////////////////////////
#include <Wire.h>
#define bouton 4 // bouton test sur pin 4
char message[100]; // buffer de caractères pour réception I2C
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
pinMode(bouton, INPUT);
Serial.begin(9600); // start serial for output
}
void loop() {
if (!digitalRead(bouton)){
master_read (2,6); // lecture en I2C sur l'esclave 2 de 6 octets
}
}
///// Fonction de lecture d'information par le maître sur le bus I²C /////
void master_read (int d, int n) {
Wire.requestFrom(d, n); // request n bytes from slave device #d
char c;
while (1 < Wire.available()) { // loop through all but the last
c = Wire.read(); // receive a byte as character
Serial.print(c); // print the character
}
c = Wire.read(); // receive a byte as character
Serial.println(c);
delay(250);
}
et celui du slave_sender:
// Wire Slave Sender
// by Nicholas Zambetti <http://www.zambetti.com>
// Demonstrates use of the Wire library
// Sends data as an I2C/TWI slave device
// Refer to the "Wire Master Reader" example for use with this
// Created 29 March 2006
// This example code is in the public domain.
//////////////////////////////////////////////////////////////////
// //
// Test en I²C d'émission de l'esclave //
// //
//////////////////////////////////////////////////////////////////
#include <Wire.h>
//char * entete = "Arduino"; // string à transmettre
char * mess = "Arduino"; // string à transmettre
void setup() {
Wire.begin(2); // join i2c bus with address #2
Wire.onRequest(requestEvent); // register event
}
void loop() {
delay(100);
}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
//Wire.write("hello "); // respond with message of 6 bytes
Wire.write(mess); // respond with message of x bytes
// as expected by master
}
En gros, je voudrais pouvoir recevoir n’importe quel mot (string) à partir du moment où je lui demande et non avoir à me soucier de la longueur de celui-ci; il n’y aurait pas la fonction “readStringUntil()” dans la class stream https://www.arduino.cc/en/Reference/Stream qui pourrait m’aider ? Mais je ne l’ai pas vu implémentée.
Donc comment feriez-vous pour transmettre un string de longueur indéfinie sachant que le maître lui demandant impose une longueur finie avec la fonction Wire.requestFrom (addresse esclave I2C, nombre d’octets) ?