Bonjour,
Voila plusieurs jours que je me questionne sur un protocole de com série entre 2 Arduino SoftwareSerial.
Je souhaite faire un outil sécurisé pour transmettre des string qui contrôle:
*l’intégrité du message
*Si le message n’est pas en doublon
*Un TimeOut
J’y arrive trés bien à basse vitesse, mais quand je commence à débrider, les erreurs, puis les TimeOut…
Il faudrait que j’instaure une sorte de synchro (maitre / esclave) mais je ne sais pas comment m’ prendre.
Je met mes 2 code. Il y à surement des choses à corriger.
Les variables:
#include <SoftwareSerial.h> // Library serial /!\ Commenter cette ligne sur Arduino mega
SoftwareSerial Serial1(8, 7); // Port série virtuel pour le dialogue entre carte: TX, RX /!\ commenter cette ligne sur arduino mega
String read; // Elément a envoyer sous forme de string
String buffer; // Buffer de réception
String write;
String hold;
int cpt;
//Tempo multi
int TempoNum; // Numerot de la tempo a appeler
int TempoSible; // Temps de pause
// Tempo multi. Renseigner cible (temps) et lire résultat (1 si ok)
//Trans, 0, 0, 0, 0, 0
int Tempo[3][6] = {{'0', '0', '0', '0', '0', '0'}, // Valeur cible
{'0', '0', '0', '0', '0', '0'}, // Valeur incrémenté
{'0', '0', '0', '0', '0', '0'} // Resultat
};
Send:
void Send() {
TempoNum = 1; // Numerot de la tempo a appeler
TempoSible = 10; // Temps de pose
//--------------------------------------------------------------------
Serial1.print(write); // Envoie le message du String write
delay(100);
Debut:
//--------------------------------------------------------------------
buffer = ""; // Vide le buffer
while (1 <= Serial1.available()) { // Reçois tout sauf le dernier Octet
char c = Serial1.read(); // Octet de réception en tant que caractère
buffer += c; // Ajoute le caractere dans le String buffer
}
Temporisation (); // Appel de la fonction tempo
if (Tempo[2][TempoNum] == 1) // Si la tempo est terminée
{
Serial.println("Send ok");
return;
}
//Serial1.print(write);
goto Debut;
}
Receve:
void Receve ()
{
TempoNum = 1; // Numerot de la tempo a appeler
TempoSible = 20; // Temps de pose
Debut1:
//Serial.println(Serial1.available());
if (Serial1.available() > 0) { // Le buffer de réception est il plein?cpt++;
//--------------------------------------------------------------------
buffer = ""; // Vide le buffer
while (1 <= Serial1.available()) { // Le buffer de réception est il plein?cpt++;
//--------------------------------------------------------------------) { // Reçois tout sauf le dernier Octet
char c = Serial1.read(); // Octet de réception en tant que caractère
buffer += c; // Ajoute le caractere dans le String buffer
}
//Serial1.print(read ); // Renvoie le message pour vérification
//--------------------------------------------------------------------
if (buffer != read || buffer == hold) // Vérifie que le message reçu est le bon
{
//Serial.println("buffer != read || buffer == hold");
Temporisation (); // Appel de la fonction tempo
if (Tempo[2][TempoNum] == 1) // Si la tempo est terminée
{
Serial.println("TimeOut");
read = "";
return;
}
read = buffer;
goto Debut1; // Le message est en doublon, on recommence
}
hold = buffer;
read = buffer;
}
Temporisation (); // Appel de la fonction tempo
if (Tempo[2][TempoNum] == 1) // Si la tempo est terminée
{
Serial.println("TimeOut");
}
}
Temporisation
int Temporisation ()
{
if (Tempo[1][TempoNum] == 0) // Si la tempo démarre
{
Tempo[0][TempoNum] = TempoSible; // On initialise le temps
}
if (Tempo[1][TempoNum] < Tempo[0][TempoNum]) // Si la tempo n'est pas terminée
{
Tempo[1][TempoNum]++; // On incrémente
Tempo[2][TempoNum] = 0; // C'est pas fini
delay(1);
}
else // Temps écoulé
{
Tempo[0][TempoNum] = 0; // Initialisation
Tempo[1][TempoNum] = 0; // Initialisation
Tempo[2][TempoNum] = 1; // C'est fini
}
}