Go Down

Topic: Liaison série -> récupération d'une valeur (Read 871 times) previous topic - next topic

Geeks

Bonjour,

Je reviens sur un des points qui me taraude en ce moment et ça va de mal en pi.

Sur un de mes modem je déclenche une interruption. Ça c'est ok.
Ensuite, dans cette interruption, je tente de récupérer la valeur transmise avec un Serial1.read(). Ok on a bien des choses qui transitent.

Sauf que quand j'envoie "10" d'un coté, je me retrouve avec 32 ou 31 de l'autre  :smiley-sad-blue:

Je ne cherche pas a afficher des lettres, uniquement des chiffres de -9999.9 à +9999.9.

Donc, y a une chose que je fais mal ou pas bien.

Merci pour vos indications.

barbudor

1) voire "code ascii"
30 et 31 sont les codes ascii des caractères '0' et '1'
Tu mélanges les valeurs numériques et les caracteres qu'elles représentent

2) il est fortement déconseillé d'utiliser Serial dans une interruption sous peine d'arriver à des blocages
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Geeks


1) voire "code ascii"
30 et 31 sont les codes ascii des caractères '0' et '1'
Tu mélanges les valeurs numériques et les caracteres qu'elles représentent

C'est exact. Il faut dire que je me suis tapé beaucoup de modifs sur mes softs ces derniers temps et ce soir j'accuse le coup. Bon, existe-t-il une solution pour récupéré la bonne valeur ?


2) il est fortement déconseillé d'utiliser Serial dans une interruption sous peine d'arriver à des blocages

Ah c'est donc pour ça que j'au eu des bloquages... Existe-t-il un moyen de remédier ?

Geeks

Je pense à un truc tout simple :
Code: [Select]

void loop() {
   //Flag Reception à 1 ?
     //Lire les données
   //Traitement
   //pause 5 s
   //Boucler
}

//Si je passe en interruption
  //Mettre un flag à 1


Je ne sait pas si en faisant ainsi je risque de perdre des trames ! Si c'est le cas, bon alors ça peut pas aller, il faudra que je trouve une solution pour ne pas raté trop de trames.

Geeks

Bon, je confirme. Avec la méthode indiqué au dessus, je perd 100% des trames  :smiley-sad-blue:

J'ai donc pensé:
Quote

- Si je suis en interruption
- Je peux appeler une fonction externe
- Je fait le traitement de la fonction
  - Recevoir les données Serial3.available() puis While, puis Serial3.read()
- On revient dans l'interruption
- Mettre le failSafe sur off


En pratiquant ainsi, j'ai réaliser un petit bout de code qui capture 100% des trames reçus. Mais est-ce la bonne méthode ?

Ensuite, j'ai une autre question. Si j'envoie une valeur chiffré, comme dit au dessus, je reçois de l'ascii. Mon souci est de voir le résultat quand même. Comment donc transformet cet ascii en valeur lisible ?

Merci.

Amandine

Bonjour,
pour transformer des valeurs reçues en ASCII en nombre c'est relativement simple, il faut d'abord enlever les 4 bits de poids fors de chaque octet avec un "ET" 00001111 puis multiplier par la puissance de 10 correspondant au rang. Exemple pour 3 chiffres 313233 (1, 2, 3 en ASCII) on enlève les 4 bits de poids fort, on obtient 1, 2, 3 puis on fait 1 x 10 p2 + 2 x 10 p1 + 3 x 10 p0 et on obtient 123. Le jeu d'instruction de l'Arduino permet de faire cela facilement.

skywodd

Bonjour,

Ajoute une délimiteur âpres ta valeur (un \n par exemple) ;)

Ensuite utilise SerialEvent (/!\ c'est une interruption) pour détecter le délimiteur et passer un flag à 1.
Dans loop() si le flag est à 1 tu utilises parseInt() pour lire la valeur représenté par la chaine ASCII reçu.

Ces deux liens te donnerons toutes les info dont tu as besoin :
http://arduino.cc/en/Tutorial/SerialEvent
http://arduino.cc/en/Reference/ParseInt
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

fdufnews

#7
Jan 19, 2013, 04:03 pm Last Edit: Jan 19, 2013, 04:06 pm by fdufnews Reason: 1
Quote
Bon, je confirme. Avec la méthode indiqué au dessus, je perd 100% des trames

Pas,étonnant si tu bloques la boucle principale pendant 5s. En 5s il peut en passer des trucs.
Pourquoi mets-tu un delay()?

Quote
Sauf que quand j'envoie "10" d'un coté, je me retrouve avec 32 ou 31 de l'autre  smiley-sad-blue

Je ne cherche pas a afficher des lettres, uniquement des chiffres de -9999.9 à +9999.9.


Ce qui n'est pas clair dans ta démarche c'est ce que tu envoies et ce que tu veux.
Tu envoies tes valeurs sous formes de chiffres ou de texte?
A l'arrivée tu veux un nombre ou une chaîne de caractères représentant ce chiffre?

Go Up