Pages: [1]   Go Down
Author Topic: Envoie de donné par "serial"  (Read 1348 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour.

J'ai actuellement un probleme dans mon programme arduino.
En effet je souhaiterais envoyé une variable sur le port série a l'aide de serial.write mais cela ne fonctionne pas.

Mon programme releve un temps T1 et un temps T2 et j'aurais besoin d'envoyé la différence de temps noté T=T2-T1 a un programme qui tourne sur python.

Dans le programme Arduino j'ai écrit Serial.write(T) mais ce que je recois sur mon programme python c'est la lettre T et non pas sa valeur smiley-sad

Si quelq'un pouvait m'aider se serait sympa smiley
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

*farfouille dans ses dossier*

dans un projet j'avais comme ca pour recup des valeur depuis arduino :
Code:
Serial.print(my_rand, DEC);

en fait faut préciser le genre de data que tu envoie, par défaut c'est de l'ASCII
http://arduino.cc/en/Serial/Print
Logged

Celtic Kingdom
Offline Offline
Sr. Member
****
Karma: 2
Posts: 455
hard oui no!!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,

Et les temps sont exprimés sous quel type dans les variables ?
Pas sous forme de characters j'imagine ?
Parce qu'avec certains types cela va coincer il me semble.
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,

Et les temps sont exprimés sous quel type dans les variables ?
Pas sous forme de characters j'imagine ?
Parce qu'avec certains types cela va coincer il me semble.

perso moi je dit le contenu des vars ce sont des chiffre, le type ca change juste l'espace mémoire que ca prend

que tu fasse
char c = '*';
char c = 42;
int c = 42;

dans les trois cas si tu demande a faire Serial.print(c, BYTE); tu aura une * d'envoyer sur le série

tu peut très bien stocker des mesure dans un char si tu sait que ca peut largement y tenir
après certe tu a des type spécifique, mais ca reste des nombre ^^
Logged

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

Bonsoir.
Je vous remercie pour ces réponse aussi rapide smiley

Les temps T1 et T2 me sont renvoyé par la fonction  micros().
T1 et T2 sont défini comme des entier ( Int).

Par contre serial.print me permet d'envoyer la variable au niveau de la console mais j'ai besoin de l'avoir sur le port série car mon programme en python utilise serial.read.

Je ne peux malheureusement pas faire de teste aujourd'hui car le matériel que j'utilise se trouve pour l'instant a l'université et je n'y aurais accés que demain après midi.
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 24
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oui ca l'envoie sur la console, si on ouvre la console ^^
si on la laisse fermer ca laisse le port COM libre pour qu'un autre programme puissent l'utiliser

par exemple moi je faite mes interfaçage avec l'ordi en C et C++

PS pour tes entier tu pourrais même utiliser des entier non signer (unsigned int), a moins que tu puissent avoir des temps negatif
Logged

Celtic Kingdom
Offline Offline
Sr. Member
****
Karma: 2
Posts: 455
hard oui no!!!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si ce sont des 'int' que tu envoies, d'expérience :
Code:
int T = ?;  // avec pour ? la valeur, bien entendu
void setup()
{
  Serial.begin(9600);  // etc.
}
void loop()
{
  Serial.print("T = ");
  Serial.println(T);  // println pour le retour chariot
}
Cela devrait fonctionner.

Après, si c'est pour envoyer autrement que par le port série sur un autre port série; par exemple pour envoyer sur un LCD série cela ne fonctionnera pas, il faudra transformer le contenu de la variable en 'char' et gérer avec un buffer le transfert.
Il me semble aussi qu'en utilisant la librairie "serial" cela ne soit aussi simple que dans mon exemple (à confirmer par un spécialiste).
Logged

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

Quote
Les temps T1 et T2 me sont renvoyé par la fonction  micros().
T1 et T2 sont défini comme des entier ( Int).
Pour info, micros( )retourne des unsigned long.
Logged

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

Merci a tous sa marche enfin.
Le probleme était que j'utilisais la fonction serial.write au lieu de serial.print.
En effet je pensais que serial.print ne permettait que d'afficher la valeur dans la console sans possibilitée de la récupérer.


 
Logged

Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1398
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai galéré quelques heures avec un dialogue série entre un arduino et VB6. C'est au niveau du récepteur qu'il faut traiter la donnée en nombre, car '*' ou 42, sur le port série, ce sera toujours 42 qui sera envoyé. Si ton soft qui la récupère traite en ascii, alors tu auras '*', mais si tu vas un peu plus dans le hard, tu retrouveras ton 42.

Pour info, VB6 ne traite le port série qu'en word (ou 16 bits) par défaut. Il faut donc imposer quelque part de traiter les données dès la réception (ou émission)... en byte...
Logged

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

La premiere partie qui était d'envoyer une donnée sur le port série est opérationnel.

Le probleme maintenant c'est que ce que le nombre que j'envoie varie entre 3 et 36000 or serial.read ne lie qu'un bit a la fois donc j'obtiens par exemple
2
5
4
1
au lieu de 2541.
J'ai vu qu'il était possible de passer par un tableau mais je me demande si cela ne vas pas trop ralentir le programme qui a besoin de tourner rapidement.

Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ne lie qu'un bit a la fois

petit correction sans doute pas fait exprès : "ne lie qu'un byte(octet) à la fois".

Sinon tu envoie des donnée sur le port série via pyton et tu l'affiche comment ?
J'ai du mal à saisir certaine chose avec l'arduino et le port série, comme le fait qu'il envoie le correspondant ascii 'T' au lieu de la véritable valeur de la variable T via Serial.write qui est censé faire un l'envoi d'un flux binaire de la variable (2 byte ici pour un entier) ...

Il est pourtant bien indiqué que pour envoyé la représentation (ascii je suppose) d'une valeur il faut utilisé print à la place de write (et c'est pas ce qu'il voulait) ..., à moins qu'à la réception du coté pyton il fasse également sa propre interprétation du flux ?
http://arduino.cc/en/Serial/Write
Et encore je vois pas comment dans le cas présent il interprèterait la valeur de la variable avec le nom de la variable, qui disparait une fois le code compilé et correspondrait plutôt à une adresse mémoire une fois exécuté ?
Je trouve également étrange qu'avec read on ai l’impression de recevoir 4 caractère au lieu de 2 byte tout court (qu'il affiche la correspondance peut importe), donc voir également l'envoi côté pyton ?
Cette liaison série avec l'arduino me perturbe lol, faudra que je fasse des testes avec autres chose que le programme arduino un jours. smiley-grin
« Last Edit: October 23, 2011, 08:16:05 pm by osaka » Logged


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

Tu veux envoyer les chiffres 2 5 4 1 ou bien l'unsigned long 2541?

Dans le premier cas il faut utiliser Serial.print()
Dans le deuxième cas il faut utiliser Serial.write() en passant par un tableau.

Pour envoyer 36000 il faut à minima utiliser un unsigned int. Dans ce cas il faut faire un cast car micros() retourne des unsigned long.
Logged

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

Ce que je veux envoyé c'est bien l'unsigned long 2541.

Je vous explique le fonctionnement du programme.
J'utilise un telemetre a Ultrason SRF 06.
J'envoie dans une boucle infini une impulsion.
Quand je recois en retour l'impulsion de sortie renvoyé par le telemetre  je note le temps T1
Et quand l'impulsion est terminé je note le temps T2.
Je calcule ensuite T=T2-T1 et c'est cette valeur que je dois envoyer sur python car T sera proportionnelle a la distance .
Logged

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

La méthode la plus élégante définir une union entre un unsigned long et un tableau de 4 unsigned char. (désolé je suis au boulot j'ai pas le temps de développer)
La méthode plus simple copier les 4 octets de l'unsigned long par une boucle:

Code:
unsigned char octet[4];
temp = T
for (i=0;i<3;i++)
{
    octet[i]= (unsigned char)(temp & 0xFF);
    temp>>=8;
}
« Last Edit: October 25, 2011, 01:43:43 am by fdufnews » Logged

Pages: [1]   Go Up
Jump to: