Pages: [1]   Go Down
Author Topic: Liaison série -> récupération d'une valeur  (Read 630 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 111
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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 ?

Offline Offline
Full Member
***
Karma: 0
Posts: 111
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 111
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je pense à un truc tout simple :
Code:
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.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 111
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

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

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
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3019
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
« Last Edit: January 19, 2013, 10:06:58 am by fdufnews » Logged

Pages: [1]   Go Up
Jump to: