Problème lors d'envoie d'une tame

Bonjour, Je suis en BTS et j'ai un projet à faire, dans ce projet je dois envoyer une trame de 5 octet. Mais lorsque j'envoie un "zéro", tous les octets suivant s'annule et ne s'envoie pas. Auriez-vous une solution ? Merci

Fix your code.

#include <displayshield4d.h>
#include <SoftwareSerial.h>

SoftwareSerial serial1(8,9);
DisplayShield4d  oled;


int RIGHT = 4;
int LEFT = 3;
int UP = 6;
int DOWN = 2;
int PRESS = 5;
int resolution = 0;

char trame[6]; //0 : Lum ; 1 : Vpol ; 2 : Hpol; 3 : mires ; 4 : resol

int luminance = 0;
int mires = 0;
int polarite = 0;
int valid = 0;

const int PAGE_ACCUEIL =1;
const int PAGE_RESOLUTION =2;
const int PAGE_LUMINANCE =3;
const int PAGE_MIRES =4;
const int PAGE_POLARITE =5;
const int PAGE_VALID =6;
int PAGE;

int selection = 0;
int clr_ok = 0;

boolean send_frame = false;

void setup()
{
  Serial.begin (57600);
  serial1.begin (9600);
  oled.Init();
  oled.Clear();
  PAGE = PAGE_ACCUEIL;
  selection = 1;
  
  pinMode(RIGHT, INPUT);
  digitalWrite(RIGHT, HIGH);
  
  pinMode(LEFT, INPUT);
  digitalWrite(LEFT, HIGH);
  
  pinMode(UP, INPUT);
  digitalWrite(UP, HIGH);
  
  pinMode(DOWN, INPUT);
  digitalWrite(DOWN, HIGH);
  
  pinMode(PRESS, INPUT);
  digitalWrite(PRESS, HIGH);
  clr_ok = 0;
  send_frame = false;

}
void loop()
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// GESTION CHANGEMENT DE PAGES
/////////////////////////////////////////////////////////////////////////////////////////////////////////
  if((digitalRead(RIGHT) == 0) ||  (digitalRead(LEFT) == 0)) { // Si bouton droit ou bouton gauche est activé 
        if (PAGE == PAGE_VALID) { // Si la page = Page_VALID
           PAGE = PAGE_ACCUEIL; // Alors page = Page_ACCEUIL
        } else { // Sinon 
          PAGE++; // PAGE incrémenter de 1
        }
       delay(10); // Delai de 10 ms
       while(digitalRead(RIGHT) == 0){}
       while(digitalRead(LEFT) == 0){}
       delay (10);
       oled.Clear(); // Efface l'écran
       clr_ok = 0;
       selection = 1; // Retour à sélection = 1
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// GESTION SELECTION DES PARAMETRES DE LA PAGE LUMINANCE PAGE 2
///////////////////////////////////////////////////////////////////////////////////////////////////////// 
if (PAGE == PAGE_LUMINANCE) { // Si la page = Page_RESOLUTION
if (digitalRead(DOWN) == 0){ // Si le bouton bas est activé
         if(selection == 11) { // Si sélection = 8
             selection = 1; // Sélection retourne à 1
         } else { // Sinon
            selection ++; // Sélection incrémenter de 1 
            resolution ++;
         }
       while(digitalRead(DOWN) == 0){}
       oled.Clear();
       delay (10);
 }
 if (digitalRead(UP) == 0){ // Si le bouton haut est activé
         if(selection == 1) { // Si sélection = 1
             selection = 11; // Sélection retourne à 8
         } else { // Sinon
            selection --; // Sélection décrémenter de 1 
            resolution --;
         }
       while(digitalRead(UP) == 0){}//}
       oled.Clear();
       delay (10);
 }}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// GESTION SELECTION DES PARAMETRES DE LA PAGE POLARITE PAGE 3
///////////////////////////////////////////////////////////////////////////////////////////////////////// 
 if (PAGE == PAGE_POLARITE) {
     if (digitalRead(DOWN) == 0){
         if(selection == 2) {
             selection = 1;
         } else {
            selection ++; 
            luminance ++;
         }
       while(digitalRead(DOWN) == 0){}
       oled.Clear();
       delay (10);
   }
  if (digitalRead(UP) == 0){
           if(selection == 1) {
             selection = 2;
         } else {
            selection --; 
            luminance --;
         }
       while(digitalRead(UP) == 0){}
       oled.Clear();
       delay (10);
 }}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// GESTION SELECTION DES PARAMETRES DE LA PAGE MIRE PAGE 4 
///////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if (PAGE == PAGE_MIRES) {
 if (digitalRead(DOWN) == 0){
         if(selection == 8) {
             selection = 1;
         } else {
            selection ++; 
            mires ++;
         }
       while(digitalRead(DOWN) == 0){}//}
       oled.Clear();
       delay (10);
 }
   if (digitalRead(UP) == 0){
         if(selection == 1) {
             selection = 8;
         } else {
            selection --;
            mires --; 
         }
       while(digitalRead(UP) == 0){}//}
       oled.Clear();
       delay (10);
 }}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// GESTION SELECTION DES PARAMETRES DE LA PAGE RESOLUTION PAGE 5
///////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if (PAGE == PAGE_RESOLUTION) {
 if (digitalRead(DOWN) == 0){
         if(selection == 4) {
             selection = 1;
         } else {
            selection ++; 
            polarite ++;
         }
       while(digitalRead(DOWN) == 0){}//}
       oled.Clear();
       delay (10);
 }
    if (digitalRead(UP) == 0){
         if(selection == 1) {
             selection = 4;
         } else {
            selection --;
           polarite --; 
         }
       while(digitalRead(UP) == 0){}//}
       oled.Clear();
       delay (10);
 }}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// GESTION SELECTION DES PARAMETRES DE LA PAGE VALIDATION PAGE 6
///////////////////////////////////////////////////////////////////////////////////////////////////////// 
   if (PAGE == PAGE_VALID) {
 if (digitalRead(DOWN) == 0){
         if(selection == 2) {
             selection = 1;
         } else {
            selection ++;
           valid ++; 
         }
       while(digitalRead(DOWN) == 0){}//}
       oled.Clear();
       delay (10);
 }
    if (digitalRead(UP) == 0){
         if(selection == 1) {
             selection = 2;
         } else {
            selection --;
           valid --; 
         }
       while(digitalRead(UP) == 0){}//}
       oled.Clear();
       delay (10);
 }}
       if (PAGE == PAGE_VALID) {
   if (digitalRead(PRESS) == 0){
     if(selection == 1){
       oled.Clear();
       oled.drawstringblock(20,55, 0, oled.RGB(0, 255, 0), 1, 1, "Message envoye");
       serial1.write (trame);
       delay (2000);
       PAGE = PAGE_ACCUEIL;
  }else{
       oled.Clear();
       oled.drawstringblock(10,55, 0, oled.RGB(255, 0, 0), 1, 1, "Message pas envoye");
       delay (2000);
       PAGE = PAGE_ACCUEIL;
         }
       while(digitalRead(RIGHT) == 0){}//}
       delay (10);
       oled.Clear();
       delay (10);
   }}
     if (PAGE == PAGE_VALID) {
      if (digitalRead(PRESS) == 0){
      if(selection == 2){
       oled.Clear();
       oled.drawstringblock(20,55, 0, oled.RGB(0, 255, 0), 1, 1, "Message pas envoye");
       delay (2000);
       PAGE = PAGE_ACCUEIL;
  }else{
       oled.Clear();
       oled.drawstringblock(10,55, 0, oled.RGB(255, 0, 0), 1, 1, "Message pas envoye");
       delay (2000);
       PAGE = PAGE_ACCUEIL;
         }
       while(digitalRead(RIGHT) == 0){}//}
       delay (10);
       oled.Clear();
       delay (10);
   }}

Quelle arduino ? Uno ? Mega ? Autre ? Quels composants utilisés ? La trame doit partir d'où ? Etre envoyé où ? Comment est déclenché l'envoi ?

c'est un arduino uno Il y a une carte RS232 et une carte 4Display avec un écran oled La trame est envoyer de l'arduino et va dans une carte Altera DE2 L'envoi est déclenché lorsque j'ai paramétrer toutes les informations grâce a un menu

A quoi sert la variable send_frame ??

Sinon, je suppose que tu essaies d'envoyer ta trame avec l'instruction suivante : serial1.write (trame); ?

Si c'est bien cela, c'est normal que ça ne fonctionne pas. trame est un tableau. Pour traiter les valeurs d'un tableau, il faut itérer sur ce dernier pour traiter (ici envoyer) chaque valeur du tableau.

bigben99: Sinon, je suppose que tu essaies d'envoyer ta trame avec l'instruction suivante : serial1.write (trame); ? Si c'est bien cela, c'est normal que ça ne fonctionne pas. trame est un tableau. Pour traiter les valeurs d'un tableau, il faut itérer sur ce dernier pour traiter (ici envoyer) chaque valeur du tableau.

Pas tout à fait (même si itérer fonctionnera) - si vous utilisez la fonction write standard, elle a trois forme en fonction du type de paramètre

Serial.write(val)  --> envoie un octet
Serial.write(str)  --> envoie une chaîne sous forme de série d'octets
Serial.write(buf, len) --> envoie un buffer de longueur len en octets

Dans votre castrame est un pointeur sur un tableau de char, donc le C++ va penser que vous voulez passer une chaîne de caractère (et donc utilisera la méthode Serial.write(str)) et en C les chaînes de caractères se terminent par un caractère nul '\0' --> donc dès que vous avez 0 dans votre trame, la fonction write s'arrête à cet endroit car elle pense avoir atteint la fin de la chaîne à écrire

--> il faut expliciter au compilateur qu'il doit utiliser la fonction write en lui disant que vous lui passer un buffer et le nombre d'octets à envoyer :

serial1.write((uint8_t *)trame, sizeof(trame))

(et étant donné que vous mettez des nombres dans votre tableau trame, il serait bon de ne pas le déclarer comme un tableau de char mais plutôt comme un tableau de byte ou uint8_t qui est le type C consacré, ça éviterait le cast dans l'appel à la méthode write)

et pendant que vous y êtes donnez des noms lisibles à vos pins et faites utilisez un type approprié - au lieu de

int RIGHT = 4;
int LEFT = 3;
int UP = 6;
int DOWN = 2;
int PRESS = 5;

vous pourriez faire

const byte RIGHTPin = 4;
int LEFTPin = 3;
int UPPin = 6;
int DOWNPin = 2;
int PRESSPin = 5;

et bien sûr adapter ensuite, notamment pour activer le pull-up aujourd'hui la doc recommande la méthode explicite et au lieu de

pinMode(RIGHT, INPUT);
  digitalWrite(RIGHT, HIGH);

on écrit aujourd'hui

pinMode(RIGHTPin, INPUT_PULLUP);

tout simplement

Quand je lis cela

int resolution = 0;
char trame[6]; //0 : Lum ; 1 : Vpol ; 2 : Hpol; 3 : mires ; 4 : resol
int luminance = 0;
int mires = 0;
int polarite = 0;
int valid = 0;

je me dis que vous allez mettre ces valeurs dans la trame... ce n'est pas top de mettre des int dans un char - même si le compilateur va transformer la valeur pour vous... si ce sont toutes des valeurs entre 0 et 255, déclarez tout en uint8_t