Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=signup Les demandes d'inscription sont révisées quotidiennement.

Menu principal

Transmission i2c en C++ --> caractères non voulus

Démarré par Tarharnak, Novembre 16, 2020, 05:08:19 PM

« précédent - suivant »

Tarharnak

Bonjour,

Je fait communiquer deux Arduino sur un bus i2c dans le but de récupérer 2 valeurs (celles de deux sondes de température).

Quand je reçois sur le maitre les caractères d'une seule sonde ça fonctionne impec :

15:46:42.272 -> Valeur reçue de sonde 1: 15.13



Mais quand je reçois sur le maitre les caractères des deux sonde (que je fait appel à  ma fonction i2c_data() une seconde fois enfaite) j'ai des caractère curieux que je ne souhaite pas  :

15:48:50.401 -> Valeur reçue de sonde 1: 15.13□⸮
15:48:51.412 -> Valeur reçue de sonde 2: 14.93□⸮


CODE MASTER :

void loop()
{
i2c_data(I2C_SLAVE_CHEMINEE, 1, 5);
delay(1000);
i2c_data(I2C_SLAVE_CHEMINEE, 2, 5); // EDIT POUR LE FORUM : si je ne fait appel à  cette fonction qu'une fois cela ne m'affiche pas les caractère en plus
delay(1000);
}

String i2c_data(int slave, int code, int size)//(adresse esclave, code pour pointer la bonne sonde, nombres d'octets)
{
Wire.beginTransmission(slave); // envoie du code au slave précisé en amont pour pointer vers la sonde voulu
Wire.write(code);   //code         
Wire.endTransmission();
Wire.requestFrom(slave, size);   // envoie d'une requête au slave de transmettre x* octet (*donné par size)
Serial.print("Valeur reçue de sonde ");Serial.print(code);Serial.print(": ");
int i = 0;
char str[size];
while(Wire.available())
{
str[i] = Wire.read();
i++;
}
Serial.print(str);
Serial.println("");
return str;
}


CODE SLAVE :
void receiveEvents(int numBytes)

pointeur_i2c = Wire.read();

}

void requestEvents()
{
if(pointeur_i2c == 1)
{


Serial.print("   -  requête pour t1 reçue - ");
Serial.print("Temperature envoyée : ");

char send[7]; // création de la variable qui contiendra le resultat 6 caractères + le \n


dtostrf(temperature1, 5, 2, send);// conversion de la valeur de float à  char;

Serial.println(send);
Wire.write(send);
pointeur_i2c = 0;
}
if(pointeur_i2c == 2)
{
Serial.print("   -  requête pour t2 reçue - ");
Serial.print("Temperature envoyée : ");

char send[7]; // création de la variable qui contiendra le resultat 6 caractères + le \n
dtostrf(temperature2, 5, 2, send);// conversion de la valeur de float à  char;
Serial.println(send);
Wire.write(send);
pointeur_i2c = 0;
}
}


Tarharnak

J'ai trouvé :

À la fin de la réception, il faut mettre un 0 dans le dernier élément pour terminer la chaine de caractères.


int i = 0;
char str[size+1];
while(Wire.available())
{
str[i] = Wire.read();
i++;
}
        str[i]='\0';


Mais ça ne répond pas à  la question : Pourquoi cela fonctionnait il lorsque la fonction n'était appelée qu'une fois ?