communication sur le port serie.

bonjour,

voila je me presente je m'appele ivan et j'ai 16 ans.

j'ai une petite question. celle si est de savoir si je pourais commander mon arduino grace a 2 port serie differant (pour pouvoir entree deux donner via mon application qui elle est faite en c# ) dans mon application je pourais mettre deux port serie mais dans la programation de mon arduino je ne le sait pas ou je ne connais pas la technique.
mais j'ai une deuxiéme question est ce que le commande envoyer ne peut pas être une chaine de caractére ??? (la aussi comment puis-je faire ?)

void setup()   
{                
  Serial.begin(9600);
  Serial.begin(11600);
}

void loop()
{
  int variable1 = Serial.read ();  // cette variable serais égale au donner envoyer sur le port   a 9600.
  int variable2 = Serial.read(); // cette variable serais égale au donner envoyer sur le port a 11600.
}

Yep!

Bonjour ivanutsu,

Première question : De quel type d'arduino disposes-tu ?
Deuxième question : Par quel procédé désires-tu envoyer tes données ? Port USB ? MAX232 ? etc ?

Il faut déjà préciser que le port Usb est associé avec le premier port serie (rx/tx, port digital 0 et 1 sur une duemilanove par exemple) de tous les arduino, les arduino mega disposent de 4 ports series au total, le premier toujours en partage avec l'usb, les 3 suivant TTL 5v. Un pc fonctionne, lui, en TTL 12v, il faut donc convertir le signal avec un MAX232, le plus courant. Il existe également pour les arduino ne possèdant qu'un seul port serie, une librairie qui transforme tout port digital en port sériel : SoftwareSerial http://arduino.cc/en/Reference/SoftwareSerial

Comme je suppose que tu transmets tes données par le port usb, tu ne disposes actuellement que d'une seule interface.

Pour recevoir des chaines de charactères, il y a de nombreux exemples sur le forum. Mais pour te donner une piste, il suffit de déclarer un objet de type char, donc trés brièvement :

char buffer[64];

while (Serial.available() > 1) {
  buffer[index] = Serial.read();
  index++;
}

Les caractères sont envoyés un par un, il faut donc les stocker dans un tableau de type char, l'index s'incrémente d'un pas à chaque fois. Il faut s'assurer que le tableau soit assez grand pour recevoir ta chaine de caractère et ne pas oublier de reinitialiser l'index (index = 0;).

Tu peux nous exposer un peu ton projet et les aboutissants de ton programme :wink:

En tout cas bienvenue et je te souhaite beaucoup de plaisir avec ton arduino.

@+

Zoroastre.

grand merci a toi j'ai qu'une arduino uno pour l'instant mais la mega va arriver. je vais me pencher du coter des librairie prevue pour en savoir un peut plus. sinon un grand merci pour la resolution des chaine de caractere mais si je ne le reinitialise pas est-ce que je ne risque pas de surcharger la memoire ???

merci a toi ivanutsu

Yep!

L'index sert à positionner le caractère arrivant dans le tableau, si le tableau accepte x caractères et que l'index est au maxima, ta chaine sera tronquée.

Le tableau utilise sa ressource mémoire, tant que tu travailles dedans, tu ne pourra exceder ses ressources.

Je ne connais pas ton niveau en programmation mais je peux te proposer le code que j'utilise pour recevoir toute sorte de données, il s'agit de définir deux caractères, un pour indiquer le début de la trame, un second pour délimiter la fin des données. Dans mon cas, j'utilise respectivement '*' et '!'.

#define STARTBIT '*'
#define STOPBIT '!'
#define BUFFERSIZE 96
char buffer[BUFFERSIZE + 1];

int dataBufferIndex = 0;
  boolean storebuffer = false;
  delay(20);
  if(Serial.available() > 1){
        char incoming = Serial.read();
        if(incoming==STARTBIT){
            dataBufferIndex = 0;                                            //Initialize our dataBufferIndex variable
            storebuffer = true;
        }
        if(storebuffer){
          while(Serial.available()){
            char incoming = Serial.read();
            delay(50);
            if(dataBufferIndex == BUFFERSIZE){dataBufferIndex = 0; break; }
            if(incoming == STOPBIT) {buffer[dataBufferIndex] = 0; dataBufferIndex = 0; storebuffer = false; }
            else { buffer[dataBufferIndex++] = incoming; }
          }
        }
  }

Dans ce code, le buffer est de 96 caractères, plutôt large, et enregistrera les data dés qu'il detectera le caractère '*', et s'arrêtera dés '!'.
Tu remarqueras que le tableau est en fait réécrit à chaque reception, si ta première chaine est de 10 caractères, et la seconde de 5 caractères, le tableau contiendra les caractères des deux chaines, de l'index 0 à 4 : la dernière chaine, de 5 à 9, la première chaine et ainsi de suite.
Il faut donc détecter la fin des données dans le tableau aussi, et c'est à celà que sert 'buffer[dataBufferIndex] = 0', il positionne un zero qui pourra être repéré facilement.

@+

Zoroastre.

Bonjour,

ivanutsu:
j'ai une petite question. celle si est de savoir si je pourrais commander mon arduino grâce a 2 port série différant (pour pouvoir entrée deux donner via mon application qui elle est faite en c# ) dans mon application je pourrais mettre deux port série mais dans la programmation de mon arduino je ne le sait pas ou je ne connais pas la technique.

Si le but est d'avoir deux port série virtuelle usb coté ordi, quelque soit l'arduino c'est impossible (matérielement j'entend, aprés avec le module usb/série qui va bien c'est faisable), par contre si le but est d'envoyer des données depuis l'application via le port usb et de les retransmettre à un autre matériel série, il existe une librairie de "software serial" NewSoftSerial -> NewSoftSerial | Arduiniana qui permet de transformer n'importe quelle couple de broche Dx en port série TTL (TTL = 0/5v, donc pas possible de connecter ce port série à un ordinateur via le port rs232 (-12/+12v) tel quelle !!).
Sinon d'un point de vu purement sémantique pour réaliser ton morceau de code :

void setup()   
{                
  
}

void loop()
{
  Serial.begin(9600); 
  int variable1 = Serial.read ();
  Serial.end();

  Serial.begin(11600);
  int variable2 = Serial.read();
  Serial.end();
}

Je dis bien d'un point de vu purement sémantique, parce que en réalité ce code à 2 chance sur 3 de buggé ou de ne pas recevoir correctement les données.
De plus tes commentaire me laisse penser que tu n'as pas compris le fonctionnement de Serial.read(), la fonction read() renvoi un octet, donc pour recevoir un int comme tu le voudrai dans ton code il faudrait recevoir au minimum deux octets (voir + bas pourquoi).

ivanutsu:
mais j'ai une deuxième question est ce que le commande envoyer ne peut pas être une chaine de caractère ??? (la aussi comment puis-je faire ?)

Cela peut être n'importe quoi sous forme binaire (byte[]), des caractères, des int, des float, des byte, ... mais il faudra coté arduino pensé à recoller les morceaux !

Exemple un int -> 2 octets donc coté arduino il faudra faire deux Serial.read() puis une peu de math :
int val = Serial.read() + (Serial.read() << 8);

Attention par contre aux différentes plateformes/architectures, big-endian, little-endian / 32bits, 64bits, en .net (C#, vb, ...) cela joue sur le nombres d'octets envoyé (et l'ordre dans lequel il sont envoyé) via le port série en utilisant BitConverter.GetBytes(); pour la conversion en bytes[].

ivanutsu:
je vais me pencher du coter des librairie prévue pour en savoir un peut plus. sinon un grand merci pour la résolution des chaine de caractère mais si je ne le réinitialise pas est-ce que je ne risque pas de surcharger la mémoire ???

La méthode que te donne zoroastre ne peut pas "déraper" car si tu regarde le code de plus prés tu remarquera ceci :

if(dataBufferIndex == BUFFERSIZE){dataBufferIndex = 0; break; }

Si BUFFERSIZE octets on était reçu alors on replace le curseur du tableau à 0 et on "casse" la boucle.
Si tu veut vraiment vider "à la main" le buffer du port série tu peut utiliser Serial.flush();