Pages: [1]   Go Down
Author Topic: Communication bi-directionnelle Arduino<-->Windows  (Read 359 times)
0 Members and 1 Guest are viewing this topic.
Reunion
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

Je tenais dans un premier temps à remercier toute la communauté ARDUINO pour leurs réalisations,

Voici mon projet dans les grandes lignes :
Utiliser une platine "Aduino Uno" relier à un PC via son port COMx et avoir une communication bi-directionnelle entre l’applicatif Windows Form et la platine, exemple :
- envoyer via le port série une commande composé "Menu m1 Commande c1 Commande c2" et en retour une validation du type "Ok" ou "Error"
- envoyer via le port série une commande composé "Menu m2 Commande c1" et en retour une valeur de retour du type valeur de lecture analogique
Mon problème est au niveau du code Arduino en entré et à son interprétation.
Je vous en remercie d'avance,
Cordialement,
Logged

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1246
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Tout dépend de ce que tu transmets (ascii, bin, ....).
Tu as des exemples sur le site Arduino, pour commencer consulte : http://arduino.cc/en/Tutorial/ReadASCIIString
@+
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

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

Bonjour et merci pour ta réponse,
voici le début de code sur lequel je travail :
Code:
//String buffer/mémoire tampon
String cmd = String("");
String cmdm = String("");
String cmdmval = String("");
String cmd1 = String("");
String cmd1val = String("");
String cmd2 = String("");
String cmd2val = String("");
String cmd3 = String("");
String cmd3val = String("");

void setup()
{
  // Initialise la communication série (et baud rate à 9600):
  Serial.begin(57600);
  Serial.println("Ready.");
}

void loop()
{// Début de boucle LOOP
  if (Serial.available() > 0) // Vérifier si des caractères sont reçu sur le port série
  {// Début de boucle SERIAL.AVIABLE
    char SerialInByte;// Variable temporaire pour copier le caractère lu
    SerialInByte = Serial.read();// Lire un caractère (un Byte)
    if(SerialInByte==13)// Si 'retour chariot' traite la commande
    {// Début de boucle IF 'retour chariot'
      ProcessCmd();// traitement de la ou des commande(s)
    }// Fin de boucle IF 'retour chariot'
    else
    {// Début de boucle ELSE 'retour chariot'
      if(SerialInByte==77)// Si 'M' traite la commande
      {
        cmdm = String(SerialInByte);
      }
      else// sinon, ajouter le caractère à la mémoire tampon (cmd)
      {
        if(cmdm = String("M")
        {
          cmdmval += String(SerialInByte);
        }
        else// sinon, ajouter le caractère à la mémoire tampon (cmd)
        {
          cmd += String(SerialInByte);
        }
      }
    }// Fin de boucle ELSE 'retour chariot'
  }// Fin de boucle SERIAL.AVIABLE
}// Fin de boucle LOOP
Logged

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

Mon idée étant de décomposer le message reçu afin de pouvoir l’explorer facilement par le reste du programme
Logged

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

Dans la méthode sur laquelle je travail, je traite (j’essaie de traiter) les caractères reçues au fur et à mesure de leur réception pour enregistrer chaque valeur indépendamment.
Cette méthode me semble compliqué en terme de structure if imbriqué !?
J’aurais aimé pouvoir enregistrer la chaine reçu et la décomposer plus simplement par la suite.
Logged

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

J'ai avancé sur ma question, j'ai terminé la lecture du port série (voir ci dessous).
Le code fonctionne mais est il possible de prioriser la communication (serie via l'USB) sur le reste du code qui tourne en boucle ?
La commande attachInterrupt (interruption, fonction, mode) ne concerne que les broche non le port USB !?
Code:
void ReadSerial()
{
  char SerialInByte;// Variable temporaire pour copier le caractère lu
  SerialInByte = Serial.read();// Lire un caractère (un Byte)
  if(SerialInByte==13)// Si 'retour chariot' traite la commande
  {// Début de boucle IF 'retour chariot'
    ProcessCmd();// traitement de la ou des commande(s)
  }// Fin de boucle IF 'retour chariot'
  else if(SerialInByte==77)// Si 'M' traite la commande
  {// Début de boucle ELSE IF 'M'
    cmdm = String(SerialInByte);
  }// Fin de boucle Si 'M'
  else// sinon, ajouter le caractère à la mémoire tampon
  {// Debut d'ajouter le caractère à la mémoire tampon
    if (cmdm=="M" && SerialInByte!=46)
    {
      cmdmval += String(SerialInByte);
    }
    else if (cmdm=="M" && SerialInByte==46)
    {
      cmdm= String("");
      cmd1= String(".");
    }
    else if (cmd1=="." && SerialInByte!=46)
    {
      cmd1val += String(SerialInByte);
    }
    else if (cmd1=="." && SerialInByte==46)
    {
      cmd1= String("");
      cmd2= String(".");
    }
    else if (cmd2=="." && SerialInByte!=46)
    {
      cmd2val += String(SerialInByte);
    }
    else if (cmd2=="." && SerialInByte==46)
    {
      cmd2= String("");
      cmd3= String(".");
    }
    else if (cmd3=="." && SerialInByte!=46)
    {
      cmd3val += String(SerialInByte);
    }
    else if (cmd3=="." && SerialInByte==46)
    {
      cmd3= String("");
    }
    else
    {
      cmd += String(SerialInByte);
    }
  }// Fin de boucle ELSE 'retour chariot'
}
Logged

Pages: [1]   Go Up
Jump to: