Bonjour,
j'ai 2 arduino: un nano et un mega.
Je me suis créé 2 fonction de transfert et réception. Seul, ça fonctionne bien.
Mais quand j’intègre ces fonctions dans mon code et que je l’exécute, ça ne fonctionne plus.
J’utilise un soft serial (serial1) sur le nano et le serial1 sur le mega.
Désolé pour l'orthographe!
Pour le nano (celui qui reçois):
//#include <SoftwareSerial.h> // Library serial /!\ Commanter cette ligne sur Arduino mega
//SoftwareSerial Serial1(2, 3); // Port série virtuel pour le dialogue entre carte: TX, RX /!\ commanter cette ligne sur arduino mega
String read; // Elément reçu sous forme de string
String buffer; // Buffer de réception
String write; // Elément a envoyer sous forme de string
//Tempo multi
int TempoNum; // Numerot de la tempo a appeler
int TempoSible; // Temps de pause
// Tempo multi. Renceigner sible (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 sible
{'0', '0', '0', '0', '0', '0'}, // Valeur incrémenté
{'0', '0', '0', '0', '0', '0'} // Resultat
};
//--------------------------------------------------------------------
void setup() {
Serial.begin(9600); // Démarage du port série Standard pour la com avec le moniteur
while (!Serial);
Serial1.begin(9600); // Démarage du port serie virtuel à 115200
while (!Serial1);
TempoNum = 1; // Numerot de la tempo TimeOut
TempoSible = 10; // Temps du Lost
Temporisation ();
Serial.println("Receve Setup Complete!"); // Prét
}
//--------------------------------------------------------------------
void loop() {
//delay(2000);
Receve(); // Appelle la fonction
/*if (read != "")
{
Serial.println("Ce qui est traite: " + read );
} buffer = "";
read = "";
//Serial.println("on attend");
delay(1000);*/
}
//--------------------------------------------------------------------
//Fonction de réception de String entre carte
void Receve ()
{
//Serial.println(" EN RECEPTION");
delay(171);
DebutRecep:
TempoNum = 0; // Numerot de la tempo TimeOut
TempoSible = 5000; // Temps du TimeOut
Tempo[1][TempoNum] = 0; // On initialise le compteur
Serial.flush();
//-----------------------------DEMANDE DIALOGUE
//Serial.println(" DEMANDE DIALOGUE");
delay(171);
while (Serial1.read() != 251) // Attend que la demande soit acceptée
{
Serial1.write(250); // Fait une demande de dialogue
TempoNum = 0; // Numerot de la tempo TimeOut
Temporisation ();
if (Tempo[2][TempoNum] == 1)
{
Serial.println("timeOut1"); // TimeOut
return; // Sort de la boucle de réception
}
}
//-----------------------------LIAISON EN COURS
//Serial.println(" LIAISON EN COURS");
delay(171);
TempoSible = 3000; // Temps du TimeOut
Tempo[1][TempoNum] = 0; // On initialise le compteur
while (Serial1.available() <= 0) // Attend que le buffer soit plus vide
{
TempoNum = 0; // Numerot de la tempo TimeOut
Temporisation ();
if (Tempo[2][TempoNum] == 1)
{
Serial.println("timeOut2"); // TimeOut
return; // Sort de la boucle de réception
}
}
//-----------------------------RECEPTION DU MESSAGE
//Serial.println(" RECEPTION DU MESSAGE");
delay(171);
buffer = ""; // Vide le buffer
while (1 <= Serial1.available()) { // Le buffer de réception est il plein? Reçoie tout sauf le dernier Octet
//Serial.println(Serial1.available());
char c = Serial1.read(); // Octet de réception en tant que caractère
buffer += c; // Ajoute le carractere dans le String buffer
}
read = buffer; // Copie le buffer dans read
//Serial.println("Recu avant validation: " + buffer);
Serial.flush(); // Vide le buffer
//-----------------------------AR DE RECEPTION
delay(171);
//Serial.println(" AR DE RECEPTION");
Serial1.write(252); // Envoie l'AR pour message reçu
Serial1.print(read); // Envoie le message du String reçu pour verif
Serial.flush(); // Vide le buffer
TempoSible = 2000; // Temps de pose
Tempo[1][TempoNum] = 0; // On initialise le compteur
//-----------------------------ATTENTE VALIDATION MESSAGE
//Serial.println(" ATTENTE VALIDATION MESSAGE");
delay(171);
while (Serial1.peek() != 253 && Serial1.peek() != 254)// Attend la réponse sur la validité du message
{
//Serial.println(Serial1.peek());
Serial.flush(); // Vide le buffer
TempoNum = 0; // Numerot de la tempo TimeOut
Temporisation ();
if (Tempo[2][TempoNum] == 1)
{
Serial.println("timeOut3"); // TimeOut
return; // Sort de la boucle de réception
}
}
//-----------------------------ANALYSE REPONSE
//Serial.println(" ANALYSE REPONSE");
delay(171);
if (Serial1.read() == 253)
{
Serial.println("Message valide: " + read);
}
else
{
read = "";
Serial.println("Nok");
}
}
//--------------------------------------------------------------------
//Fonction 6 temporisation
int Temporisation ()
{
if (Tempo[1][TempoNum] == 0) // Si la tempo démare
{
Tempo[0][TempoNum] = TempoSible; // On initialise le temps
}
if (Tempo[2][TempoNum] == 1)
{
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
}
}
Pour le mega, juste la fonction car c'est trop lourd:
void Send()
{
DebutEmit:
TempoSible = 5000; // Temps du TimeOut
Tempo[1][TempoNum] = 0; // On initialise le compteur
//-----------------------------ATTENTE DIALOGUE
//Serial.println(" ATTENTE DIALOGUE");
delay(171);
while (Serial1.peek() != 250) // Attend une demande de dialogue
{
TempoNum = 0; // Numerot de la tempo TimeOut
Temporisation ();
if (Tempo[2][TempoNum] == 1) // Si fin de la tempo
{
Serial.println("timeOut"); // TimeOut
return; // Sort de la boucle de réception
}
}Serial.println(Serial1.read());
Serial1.write(251); // Demande acceptée
//-----------------------------TRANSFERT MESSAGE
//Serial.println(" TRANSFERT MESSAGE");
delay(171);
//Serial.println("On est en liaison");
//Serial.println("On peu transferer");
Serial1.print(write); // Envoie le message du String write
Serial.flush(); // Vide le buffer
buffer = ""; // Vide le buffer
TempoSible = 1000; // Temps du TimeOut
Tempo[1][TempoNum] = 0; // On initialise le compteur
//-----------------------------ENVOIE AR
//Serial.println(" ENVOIE AR");
delay(171);
while (Serial1.read() != 252) // Attend l'AR de réception
{
TempoNum = 0; // Numerot de la tempo TimeOut
Temporisation ();
if (Tempo[2][TempoNum] == 1)
{
Serial.println("timeOut");
return;
}
}
//-----------------------------ECHO POUR CTRL
//Serial.println(" ECHO POUR CTRL");
delay(171);
while (Serial1.available() <= 0)
{
}
TempoSible = 1000; // Temps du TimeOut
while (1 <= Serial1.available()) { // Reçoie tout sauf le dernier Octet
char c = Serial1.read(); // Octet de réception en tant que caractère
buffer += c; // Ajoute le carractere dans le String buffer
TempoNum = 0; // Numerot de la tempo TimeOut
Tempo[1][TempoNum] = 0; // On initialise le compteur
Temporisation ();
if (Tempo[2][TempoNum] == 1)
{
Serial.println("timeOut");
return;
}
}
//Serial.println("On envoie : " + write);
//Serial.println("On recois pour controle : " + buffer);
Serial.flush(); // Vide le buffer
//-----------------------------ENVOIE REPONSE
//Serial.println(" ENVOIE REPONSE");
delay(171);
if (buffer == write)
{
Serial.println("ok");
Serial1.write(253);
}
else
{
Serial.println("Nok");
Serial1.write(254);
goto DebutEmit;
}
//Serial.println(" FIN");
return;
}