[Résolu]reception d'un message sur un port numerique

Bonjour ,

je dois analyser un signal que je reçois sur un port numérique. Ce signal biaire est envoyé tout les 200 ms et il fait 14 Octets.

J'utilise alors une interruption sur un front descendant pour déclencher l'enregistrement reçu cependant les valeurs sont fausses, je reçois seulement des '0'.
pouvez m'aider merci

voici le programme :

void ajout(void);
void affiche(void);
int tab[111];

void setup() {
Serial.begin(38400);
pinMode (7,INPUT);

attachInterrupt(7,ajout,FALLING);
affiche();
}


void loop() {
}


void ajout()
{
 for (int i=0;i<111;i++)
 {
 char val = digitalRead(7);
   tab [ i ] =val;
   
   
   
  }
 } 


void affiche()
{
   for (int i=0;i<111;i++)
   {
     Serial.print(tab [ i ], BIN);
   }
   
}

bonjour
mets ton code entre balise code = </> en haut à gauche
ensuite c'est normal à priori que tu ne recupere que 0 en sortie
tu rentre (par falling) et sort de ton interruption avant que ton signal ne change et en plus tu n'indice pas le poste de tab

Je ne comprends pas mon signal varie pendant la boucle for :confused:

iprogamer:
Je ne comprends pas mon signal varie pendant la boucle for :confused:

si tu es capable de faire des modifs dans ton code, tu dois aussi etre capable de le mettre entre balise code, non ? 8)
tu es sur quel arduino
comment a tu choisi ton pin d'interrruption ?
comment peut tu etre sur que ton entrée va changer dans la boucle sous interruption
pour info sur interrupt 0 avec un UNO , il faut ~ 500 µs pour sortir de la boucle for

Quand il t'a dit

mets ton code entre balise code = </>

C'était pas les balises à </> c'était pour ça

j'utilise un Arduino UNO.
J'ai choisi le pin 2 (Int 1) correspondant à l'un des deux ports d'interruption.
Je sais que l'entrée change car a l'affichage les valeurs varient

iprogamer:
<j'utilise un Arduino UNO.
J'ai choisi le pin 2 (Int 1) correspondant à l'un des deux ports d'interruption.
Je sais que l'entrée change car a l'affichage les valeurs varient.

pin2 c'est l'interrupt 0 pas 1
donc dans ton code déjà remplace 7 par 0 :sunglasses:

attachInterrupt(7,ajout,FALLING);

J'ai modifié le programme et arrêter la transmission du signal.
Le TTL envoie donc un '1' logique de base (vérifier à l'oscilloscope) mais le programme varie encore sur ses valeurs

void ajout(void);
void affiche(void);
int tab[111];
int input = 2;
void setup() {
  
Serial.begin(38400);
pinMode (input,INPUT);

attachInterrupt(1,ajout,FALLING);
affiche();
}
void loop(){}
void ajout()
{
  for (int i=0;i<200;i++)
  {
  int  val = digitalRead(input);
    tab[i]=val;
   }
  } 
 
 void affiche()
 {
    for (int i=0;i<200;i++)
    {
      Serial.print(tab[i], BIN);
    }
    
 }

iprogamer:
J'ai modifié le programme et arrêter la transmission du signal.
Le TTL envoie donc un '1' logique de base (vérifier à l'oscilloscope) mais le programme varie encore sur ses valeurs

void ajout(void);

void affiche(void);
int tab[111];
int input = 2;
void setup() {
 
Serial.begin(38400);
pinMode (input,INPUT);

attachInterrupt(1,ajout,FALLING);
affiche();
}
void loop(){}
void ajout()
{
 for (int i=0;i<200;i++)
 {
 int  val = digitalRead(input);
   tab[i]=val;
  }
 }

void affiche()
{
   for (int i=0;i<200;i++)
   {
     Serial.print(tab[i], BIN);
   }
   
}

je ne comprend pas ce qu tu cherche à faire
1-tu explique plus bas que tu utilise pin2 d'un UNO et tu attache l'interrupt 1 au lieu de 0
2- tu a un tableau dimensionné à 111 et ta boucle for elle va jusqu'à <200

tes fronts d'info ont une longueur fixes ?
parce que là tu ne tient aucun compte de la temporalité, c'est la boucle qui cadence à son propre rythme

excuse moi pour les 2 erreurs, c'est corrigé.
Je sais seulement que la transmission se fait à une vitesse de 38400 bauds

iprogamer:
excuse moi pour les 2 erreurs, c'est corrigé.
Je sais seulement que la transmission se fait à une vitesse de 38400 bauds

attend une seconde (ou moins) là :grin: , tu es en train de nous expliquer que tu veux "simplement" recevoir des infos series à 38400 , une trame de 14 bytes emise toutes les 200 ms ?

oui pour pouvoir les enregistrer et les analyses :confused:

iprogamer:
oui pour pouvoir les enregistrer et les analyses :confused:

tu es en train de vouloir reinventer la roue 8)
softwareserial tu connais ? :grin:

avec un uno j'utilise ça , ça duplique en adaptant eventuellement les vitesses ce qui est reçu vers le serial monitor

#include <SoftwareSerial.h>
//
SoftwareSerial BTSerial(2, 3); // RX | TX
// RX arduino <--- TX cible
// TX arduino ---> RX cible


void setup()

{
  Serial.begin(38400); // vitesse serial monitor

  BTSerial.begin(38400);  // vitesse software serial NB ne pas depasser 57600
}

void loop()
{


  if (BTSerial.available())
    Serial.write(BTSerial.read());


  if (Serial.available())
    BTSerial.write(Serial.read());
}

J'avais déjà essayer mais ça imprime des symboles bizarre indechiffrable

il suffit de remplacer

write(BTSerial.read());

par

print(BTSerial.read(),HEX);

pour voir le code ASCII des valeurs reçues

iprogamer:
J'avais déjà essayer mais ça imprime des symboles bizarre indechiffrable

software serial fonctionne tres bien
alors tu a plusieurs questions à te poser et a verifier

38400 c'est sur et certain ? verifié comment ?
ensuite la vitesse ne fait pas tout , il y a d'autres parametres à determiner
comme nb bits de data, parité, et nb bits de stop
par defaut en dehors de la vitesse c'est 8bits data,pas de parité, 1 bit de stop.

c'est quoi comme "truc" en entrée ?

fdufnews:
il suffit de remplacer

write(BTSerial.read());

par

print(BTSerial.read(),HEX);

pour voir le code ASCII des valeurs reçues

oui aussi a tester si c'est juste sur la "presentation" que ça bloque

Merci sauf que cela m'affiche bien des valeurs mais en enlevant des zéros au résultat affiche en HEX

iprogamer:
Merci sauf que cela m'affiche bien des valeurs mais en enlevant des zéros au résultat affiche en HEX

c'est l'absence du zero non significatif
il faut decomposer et tester si le caractere reçu est < 16 , si oui ajouter un 0 devant l'impression

d'accord merci beaucoup , comment fais ton pour enregistrer cela dans une variable car

val = (BTSerial.read(),HEX);

me donne une valeur étrange