Go Down

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

Bubule

Bonjour

Il me semble avoir presque tout lu (dans le forum Français), sur ce qui se rapporte aux communications séries. Et du coup, cela me paraît bien compliqué pour le noob que je suis. Maintenant, je ne sais plus trop quelle serait la procédure à employer.

Je dois faire s'échanger des variables (int, float et long) d'une carte à l'autre (entre Duemilanove et Mega 2560).

La configuration matérielle :
Duemilanove (Pin 0(Rx) et 1(Tx)) raccordée en croisant les fils, au port serial1 de la Mega (Pin 18(Tx) et 19(Rx)).
La Mega est raccordée au Pc par le port série standard (0/1) pour contrôler la réception des valeurs sur le terminal.

La première étape que j'ai réussi à faire, c'est enregistrer les variables à transférer dans un tableau (3 variables pour commencer). Les envoyer sur le port série de la Duemilanove (pin 0 et 1), et ainsi les lire sur le terminal.

Sur la Mega, je n'arrive pas à les enregistrer. Ce qui m'apparait maintenant comme normal, au regard de ce que j'ai pu lire. Ce n'est pas aussi simple que je le pensais.

Dois-je transformer mes variables afin qu'elles aient toutes le même format dans le tableau (long, float, … ?)
Dois-je formater les variables avant l'envoi ? Comment ? (dois-je les modifier en char ? > Que faire des long ?)


Le nombre de données du tableau de l'émetteur (et donc recevoir sur l'autre) est fixe et connu.
Le format à l'arrivée serait donc à reformater pour retrouver le même type qu'avant l'envoi de la carte émettrice (connu également).

Je me pose beaucoup plus de questions après avoir potassé pendant plusieurs jours qu'avant !
Si vous avez des exemples fonctionnels, je suis preneur…



Franck

BONNES FETES DE FIN D'ANNEE !!!!!!!

skywodd

#1
Dec 31, 2011, 06:26 pm Last Edit: Dec 31, 2011, 06:30 pm by skywodd Reason: 1
Bonjour,

Pour envoyer / recevoir des variables il faut d'abord les transformé en une suite d'octets.

Exemple, un char ou un byte = un octet,
Envoi :
Code: [Select]
Serial.write(variableDeTypeChar);
Réception :
Code: [Select]
char variable = Serial.read();

Exemple, un int = 2 octets,
Envoi :
Code: [Select]
Serial.write(variableDeTypeInt & 0xFF); // Envoi l'octet de poids faible
Serial.write((variableDeTypeInt >> 8) & 0xFF); // puis l'octet de poids fort

Réception :
Code: [Select]
int variableRecu = Serial.read() + (Serial.read() << 8);

Exemple, un long = 4 octets,
Envoi :
Code: [Select]
Serial.write(variableDeTypeLong & 0xFF); // Envoi l'octet de poids faible
Serial.write((variableDeTypeLong >> 8) & 0xFF);
Serial.write((variableDeTypeLong >> 16) & 0xFF);
Serial.write((variableDeTypeLong >> 24) & 0xFF); // puis l'octet de poids fort

Réception :
Code: [Select]
long variableRecu = Serial.read() + (Serial.read() << 8) + (Serial.read() << 16) + (Serial.read() << 24);

Edit: Le plus simple est de faire des fonctions exemple pour le int :
Code: [Select]

void sendInt(int valeur) {
  Serial.write(valeur & 0xFF);
  Serial.write((valeur >> 8) & 0xFF);
}

int recevInt() {
  while(Serial.available() < 2);
  return Serial.read() + (Serial.read() << 8);
}
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Bubule

Bonjour et MEILLEURS VŒUX A TOUS !!

Merci pour ton aide Skywood.

Ok, çà confirme, ce n'est pas aussi simple de transférer des donnés. Je ne pense pas que les bulles de la nuit en soit la seule explication …

Il faut donc bien que toutes les données soient selon le même format.
Pour info, j'ai une quinzaine de variables à transférer. La plupart sont des "int", et les "long" devraient pouvoir être passées en "int". Mais j'ai deux "double" qui gèrent le PID (librairie ici : http://arduino.cc/playground/Code/PIDLibraryConstructor ). Et là, je ne pense pas pouvoir les changer.
A moins qu'il soit possible d'écrire ceci :
Code: [Select]
int valeur_Réduite = double Valeur
Il est également possible que d'autres variables viennent compléter la liste avec le temps.

Donc pour simplifier le traitement pré-envoi,  ce qui me semble le plus logique en fonction de ce que tu proposes, serait de toutes les convertir en "double" afin de n'avoir qu'un seul type de traitement. En créant des fonctions.
Mais comment les appelles tu ? Encore un apprentissage pour moi.

Franck




skywodd


Ok, çà confirme, ce n'est pas aussi simple de transférer des donnés. Je ne pense pas que les bulles de la nuit en soit la seule explication …

C'est pas simple mais ce n'est pas énormément compliqué non plus ;)


Il faut donc bien que toutes les données soient selon le même format.
Pour info, j'ai une quinzaine de variables à transférer. La plupart sont des "int", et les "long" devraient pouvoir être passées en "int". Mais j'ai deux "double" qui gèrent le PID (librairie ici : http://arduino.cc/playground/Code/PIDLibraryConstructor ). Et là, je ne pense pas pouvoir les changer.
A moins qu'il soit possible d'écrire ceci :
Code: [Select]
int valeur_Réduite = double Valeur
Il est également possible que d'autres variables viennent compléter la liste avec le temps.

Un double est sur 4 octets comme pour un long, regarde sur la référence arduino tu as tout les types de données basique.
http://arduino.cc/en/Reference/HomePage


Donc pour simplifier le traitement pré-envoi,  ce qui me semble le plus logique en fonction de ce que tu proposes, serait de toutes les convertir en "double" afin de n'avoir qu'un seul type de traitement. En créant des fonctions.
Mais comment les appelles tu ? Encore un apprentissage pour moi.

imaginons une fonctions :
Code: [Select]
void faireQuelqueChose(char variable) {
// ...
}


tu l'appellerai ainsi :
Code: [Select]
char c = '.'; // variable quelconque pour l'exemple
// ...
faireQuelqueChose(c); // appel de la fonction


Je te conseil de faire un tour sur ce tutoriel :
http://www.siteduzero.com/tutoriel-3-13982-les-fonctions.html
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Bubule

Merci  ;)

Je m'en vais lire tout çà et je reviens.

Go Up