Stocker les donnée d'un port série dans un tableau

Bien le bonjour,
J'aimerais mettre les donnée reçue du port série dans un tableau, les donnée sont en binaire (010011100011...
J'ais essayer un truc du genre :

char data = Serial.read();
int length = sizeof(data);
for( int i = 0; i <= length; i++)
{
   if(int(data[i]) == 1)
       Serial.print("OK \n");
   else if(int(data[i]) == 0)
       Serial.print("No \n");
    else
       Serial.print("Err \n");
}

Veuillez m'excuser si il y a des erreur :blush: mais j'ais vite fait ce code pour pouvoir montrer un example de l'utilisation souhaiter

Merci d'avance :slight_smile:

Bon ben je penses avoir trouver, j'envoi sur le port série byte par byte que je stoque data_b[a] qui a été défini avec 50 valeur possible (j'envoi 50 byte donc 49 donnée + la donnée null(si j'ais bien compris dans la doc))
Ce qui donne :

char data;
char data_b[50];
int a = 0;
data = Serial.read();
if (data != "|")
{
    data_b[a] = data;
    data_ok = false;
}
else
    data_ok = true;

Voila c'est un gros résumer du code j'espère que je ne me trompe pas :~

Bonjour,

Je vois plein de GROSSE erreurs dans tes morceaux de code :wink:

Serial.read() retourne UN caractére, pas une ligne ou autre (et encore moins un String).
De plus il faut tester avec Serial.available() qu'il ya des données à lire avant de pouvoir faire le moindre Serial.read().

-> Tu devrais (re)prendre le temps de lire la doc de Serial :

--

Dans ton code n°1:

char data = Serial.read(); // Pas de test pour vérifier si il ya quelque chose de disponible avant de lire -> pas bon !

int length = sizeof(data); // Toujours égale à 1, équivalent à un sizeof(char)

for( int i = 0; i <= length; i++) // pas valable à cause de l'erreur ci dessus
{
   if(int(data[i]) == 1) // cast char vers int pour faire un test d'égalité à 1 !? 
                                    // char = valeur numérique de -127 à +127 donc pas besoin de cast en int ;)
                                    // De plus "data" est déclaré en char et non en tableau de char donc data[i] est une erreur !

       Serial.print("OK \n");
   else if(int(data[i]) == 0) // Même remarque que ci dessus
       Serial.print("No \n");
    else
       Serial.print("Err \n"); // Ps: équivalent à Serial.println("Err "); (println = print + \n)
}

Bon ben je penses avoir trouver, j'envoi sur le port série byte par byte que je stoque data_b[a] qui a été défini avec 50 valeur possible (j'envoi 50 byte donc 49 donnée + la donnée null(si j'ais bien compris dans la doc))

On ne travaille pas en ASCIIZ (pas de chaine de caractéres en retour de Serial.read(), juste un char) avec Serial.read().
C'est a toi de faire la gestion des fins de chaine comme tu l'entends :wink:

char data;
char data_b[50];
int a = 0;
data = Serial.read();
if (data != "|") // double quote (") = chaine de caractéres, simple quote (') = caractére
// Donc ici "|" est une erreur, de plus tu NE PEUT PAS faire un test d'égalité en C entre deux chaine de char (voir la doc de strcmp)
// Dans tout les cas tester un char avec une chaine de char n'as pas de sens ("|" = { '|', '\0' })
{
    data_b[a] = data;
    data_ok = false;
}
else
    data_ok = true;
// a n'est jamais incrémenté, ya comme un soucis ;)

--

Pour lire une valeur de type 00000000 (8 bits envoyé sous forme de chaine ascii) :

/* Variable globales */
char buffer[8]; // Buffer qui stocke les 8 bits en ascii
byte index = 0; // Itérateur qui permet d'indexer le buffer
byte valeur;    // Valeur final

/* Loop() */
void loop() {

  // Si les huits bits de la valeur ont été recu
  if(index == 8) {
    valeur = 0; // Initialisation de la valeur à zéro
	
	// Pour chaque bits
    for(byte i = 0; i < 8; ++i) {
	
	  // Si le bit est à "1" logique
	  if(buffer[i] == '1')
	    valeur |= 1 << i; // Mise à "1" du bit dans la valeur final
		// A |= B -> A = A (OU logique bit à bit) B
		// 1 << i -> 1 décalé de i bits vers la droite (ex: 1 << 4 = 16)
    }
	
	// Affichage de la valeur
	Serial.print("Valeur: ");
	Serial.println(valeur);
  }
  
  // Si des données sont disponible en lecture
  if(Serial.available() > 0) {
  
    // Lecture d'un octet depuis le port série
    char c = Serial.read();
	
	// Vérification de la validité du bit (caractére '1' ou '0')
	if(c != '0' && c != '1') {
	
	  // En cas d'erreur on reprend du début
	  index = 0;
	  Serial.println("Erreur !");
	  
	} else { // Si le bit est valide
	  buffer[index] = c; // On le stocke en mémoire
	  ++index;           // On prépare l'index pour le bit suivant
	}
  }
}