Probléme d'éxécution sur Arduino Mega

Bonjour a tous, J’utilisais depuis peu une arduino uno, cependant mon programme nécessitait plusieurs ports séries je me suis donc orientés vers une carte arduino méga afin d’obtenir plus de port serie. Cependant, mon code fonctionnant sur arduino uno ne fonctionne plus sur arduino mega :

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
const int MODE_TRANSMISSION = 5;
void setup()

{
  // Open serial communications and wait for port to open:
  pinMode(MODE_TRANSMISSION, OUTPUT);
  Serial.begin(9600);
  mySerial.begin(9600);

  delay(500);
  digitalWrite(MODE_TRANSMISSION, HIGH);

}

void loop() {
  //if (x == 1) { //run the loop once*
  delay(1000);
  digitalWrite(5, HIGH);
  byte message[] = {0x02, 0x30, 0x30, 0x05, 0x85, 0x03};
  mySerial.write(message, sizeof(message));
  digitalWrite(5, LOW);
  char tab[17];
  char tab2[5];
  char tab3[5];
  bool carteAutorisee = true;
  bool carteRefusee = true;
  char tabcarte[5] = "54CC9";
  if (mySerial.available()) {
    for (int i = 0; i < 17; i++) {
      tab[i] = mySerial.read();
      //Serial.print(tab[i], HEX);

      //Serial.print(incomingByte, HEX);
      // Serial.print(' ');

    }

    memcpy(tab2, tab + 10, 5);
    for (int i = 0; i < 5; i++) {
      //Serial.print("ITERATION : ");
      //Serial.print(i);
      Serial.print("\t");
      //Serial.print(tab2[i], HEX);
      Serial.print("\n");

    }



    Serial.print(tab2);
  
  }
}

En effet, j’ai modifie ce code afin de ne plus utiliser la librairie SoftwareSerial et d’utiliser Serial3 (en
branchant mes pin RX/TX aux endroits adéquats).

const int MODE_TRANSMISSION = 5;
void setup()

{
  // Open serial communications and wait for port to open:
  pinMode(MODE_TRANSMISSION, OUTPUT);
  Serial.begin(9600);
  Serial3.begin(9600);

  delay(500);
  digitalWrite(MODE_TRANSMISSION, HIGH);

}

void loop() {
  //if (x == 1) { //run the loop once*
  delay(1000);
  digitalWrite(5, HIGH);
  byte message[] = {0x02, 0x30, 0x30, 0x05, 0x85, 0x03};
  Serial3.write(message, sizeof(message));
  digitalWrite(5, LOW);
  char tab[17];
  char tab2[5];
  char tab3[5];
  bool carteAutorisee = true;
  bool carteRefusee = true;
  char tabcarte[5] = "54CC9";
  if (Serial3.available()) {
    for (int i = 0; i < 17; i++) {
      tab[i] = Serial3.read();
      //Serial.print(tab[i], HEX);

      //Serial.print(incomingByte, HEX);
      // Serial.print(' ');

    }

    memcpy(tab2, tab + 10, 5);
    for (int i = 0; i < 5; i++) {
      //Serial.print("ITERATION : ");
      //Serial.print(i);
      Serial.print("\t");
      //Serial.print(tab2[i], HEX);
      Serial.print("\n");

    }



    Serial.print(tab2);
  
  }
}

Cependant, mon code compile mais rien ne se passe sur le moniteur série alors qu’il fonctionnait parfaitement sur ma carte arduino uno. Merci pour tout aide que vous pourrez m’apporter.

As-tu bien branché comme il faut :

  • RX de ton device externe sur TX du Serial3 soit la pin 14 du Mega
  • TX de ton device externe sur RX du Serial3 soit la pin 15 du Mega
    Es-tu sûr de la vitesse de transmission des messages de ton device externe : 9600 bauds? C'est un lecteur de badge RFID ? Quelle référence ?

Si c'est tout bon, essaye de changer

if (Serial3.available())

par

while (Serial3.available())

Au passage (tu as commenté une ligne au début de la loop), si tu veux que ton code ne soit exécuté qu'une seule fois, tu mets tout dans le setup et tu laisses la loop vide

Bonjour, merci de la rapidité de la réponse.

Le câblage a bien été effectuée comme indiquée, et la vitesse est bien de 9600 bauds comme indiqué dans la doc (LXS - Lecteur standard Prox 125 kHz - STid Sûreté). J'ai changé comme indiqué le code, ce qui ne donne aucun résultat satisfaisant. Cependant je reçoit cette fois des données (?????) alors qu'avec le code précédemment aucune donnée n'étais transmise. Mon problème est donc toujours le meme, je n'arrive toujours pas a lire le badge.

Bonjour,

Ici  char tabcarte[5] = "54CC9";tu écris en dehors du tableau car la cahien fait 6 caractères avec le ‘\0’ final.
Ça peut conduire à des résultats inattendus.

D’autre part la méthode de lecture est incorrecte

  if (Serial3.available()) {
    for (int i = 0; i < 17; i++) {
      tab[i] = Serial3.read();
      //Serial.print(tab[i], HEX);

      //Serial.print(incomingByte, HEX);
      // Serial.print(' ');

    }

Si après avoir lu le premier caractère, le second caractère n’est pas encore arrivé, Serial3.read() va retourner un 0 que tu vas mettre dans tab[i]. Ça a des grandes chances d’arriver car il ne faut pas oublier qu’à 9600 bauds le temps de transmission d’un caractère est d’environ 1ms.

Essaye ça (sans garantie, je ne peux pas tester) :

void loop() {
  digitalWrite(5, HIGH);
  byte message[] = {0x02, 0x30, 0x30, 0x05, 0x85, 0x03};
  Serial3.write(message, sizeof(message));
  digitalWrite(5, LOW);
  char tab[17];
  if (Serial3.available()) {
    int count = 0;
    while (Serial3.available()) {
      tab[count++] = Serial3.read();
      if (count > 16) break;
    }
    Serial.print(tab);
  }
}

Bonjour,

SoftwareSerial est piégeux, toutes les broches ne sont utilisables et cela dépends de la carte. Dans le cas de la carte mega (source):

Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).

Oui, mais il n'y a plus de SofwareSerial dans aucun des bouts de code: dès le début, le posteur l'a remplacé par Serial3...

Oups... Merci de la correction (signé : un gars traumatisé par SoftwareSerial).

un grand merci a vous et plus particulièrement a lesept. Tout fonctionne parfaitement :slight_smile:

De rien !

De rien :wink: