Nouvelles:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

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 ?