Go Down

Topic: Transferts de données entre arduino par la liaison série (Read 5 times) previous topic - next topic

skywodd


Pourquoi bloquer le programme tant qu'on ne reçoit pas de caractère ?   =>while(Serial.available() < 1); // Block until Serial data available

Je fait toute mes fonctions de réception en tant que fonction bloquante, aprés c'est un choix tu peut aussi conditionner l'appel à la fonction avec un if(Serial.available() > 0) juste avant.


Pourquoi tester le caractère '\0' qui correspond au code NULL?

J'ai réfléchi comme si c'était une chaine de caractéres :smiley-roll-sweat: un test avec '\n' serais plus malin ... Nobody is perfect ...


Pourquoi initialiser la valeur de str dans la fonction alors que l'on gagne 36 octets de prg en le faisant dans les définitions =>   *str = ""; // Init String 1°ligne de la fct
(...)
Ne peut-on pas faire une addition composée sur une valeur pointée et gagner 126 octets de prg ?  =>*str = *str + c; // Append char to string  =>(*str += c;)

... Là c'est du vraiment du grappillage ... oui tu peut faire un += et faire l'initialisation avant l'appel, mais à ce moment si tu veut vraiment gratter le moindre octets de ram/flash c'est un char[] qu'il faut utiliser ...


Euh, une dernière remarque  :smiley-roll-sweat: ça ne fonctionne pas :smiley-zipper:

A pars le if(c == 10) que j'ai repris de ta fonction sans chercher à comprendre je vois pas ce qui pourrai planter ...

Code: [Select]
void decode_rx(String *str){
  char c = Serial.read();
  while(Serial.available() > 0 && c != '\n'){
    *str += c;
    c = Serial.read();
  }
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

zeric

Bonsoir,
Merci pour la réponse  :smiley-sweat:
Je viens de lire que le '\0' est le caractère qui même si on ne le voit pas, fini chaque chaîne de caractère implicitement:
- comme  justement je travaille sur des chaînes de caractères  :smiley-sweat:, ça me fait le '\n' en moins a envoyer ...
Pour le grapillage : 36+126=162 octets pour 2 instructions :smiley-eek: A l'échelle d'un programme, je trouve ça  :smiley-eek-blue:
Pour le char[], la 2° solution, la taille  divisée par 2, ça me plait  ;)

Quote


Euh, une dernière remarque  :smiley-roll-sweat: ça ne fonctionne pas :smiley-zipper:

A pars le if(c == 10) que j'ai repris de ta fonction sans chercher à comprendre je vois pas ce qui pourrai planter ...

Ben justement, vu que j'envoie le '\n' juste après (...le '\0' que je ne savais pas qu'on envoyais!), on rentre jamais dans cette partie de boucle...

-La 2°solution, bien la fct "memset" pour faire une init de chaine, mais la fct "decode_rx" ne marche pas comme mon prg, je peux pas faire de test de la chaine
complète dans la suite, je vais voir ça de plus près...

skywodd


-La 2°solution, bien la fct "memset" pour faire une init de chaine, mais la fct "decode_rx" ne marche pas comme mon prg, je peux pas faire de test de la chaine
complète dans la suite, je vais voir ça de plus près...

hu? Peut pas faire de test sur la chaine ?
-> strcmp ?
Code: [Select]
if(strcmp(chaine_recu, "blabla") == 0)
  Serial.print("balbla recu !");

Je vois pas ce qui te pose probléme, enfin j'ai pas compris ou tu avait un probléme :smiley-sweat:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

zeric

Raah, trop rapide !
Au départ, je voulais juste savoir si il était possible d'écrire ma fonction "mieux" (plus "programmeur" => optimisé, moins de place  :smiley-sweat:)
La version 2 va dans ce sens: le problème, si je veux faire le test dans mon prg: if (hein == "ben_alors"){
"ben_alors" est la chaine de caractère que j'envoie depuis l'autre côté (ou le Serial Monitor ou un autre arduino!), decode_rx la décode :D
et comme j'en envoie plein (de chaines de caractères), je conditionne des branchements derrière "en fonction de".
M'exprime-je bien :smiley-sweat:

RANKOMAN

Bonjour,
peut être pourriez vous m'aider, j ai un clavier PS/2 connecté sur un arduino alimentation sur broch +5 volt et Grnd et broche 8 et 2 pour les data et l irq. Je recois bien les données mais je voudrais envoyer au clavier deux octet F3 et 00. POurriez vous m indiquer si il faut utiliser Serial.write tet comment, merci d avance

Go Up