Go Down

Topic: Trier une liste UDP (Read 527 times) previous topic - next topic

Vinchiappetto

Bonjour,
j'utilise l'Arduino en priorité pour communiquer en temps réel avec un autre logiciel, Max/Msp.
A ce jour j'arrive à contrôler plusieurs modules en utilisant le port série.
Je voudrais basculer mes projets en utilisant une communication Ethernet et pour cela j'ai commencé à travailler avec un shield Ethernet. J'ai opté pour une communication donc en UDP entre mon ordinateur et l'Arduino.
J'arrive bien à envoyer une liste de chiffres à mon microcontrôleur, mais je n'arrive pas à trouver la meilleur façon de renvoyer par la suite ces chiffres aux sorties de l'Arduino.
Quand j'utilise par exemple ce code :
Code: [Select]

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

unsigned int localPort = 8888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet,
char  ReplyBuffer[] = "acknowledged";       // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  Serial.begin(9600);
}

void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // send a reply to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
  delay(10);
}


je reçois dans mon packetBuffer une liste comme par exemple "100 255 0 1". Comme puis-je envoyer chaque chiffre à une variable différente ? C'est à dire par exemple la valeur 100 et 255 à une sortie PWM, le 0 et le 1 ailleurs ?
J'imagine que dois utiliser les espaces pour pouvoir partager mes chiffres ?
Avec la connexion Serial j'utilisais un ParseInt, et du coup c'était bien pratique, mais avec cette configuration je suis un peu perdu ...
Merci d'avance d'un conseil pour me permettre d'avancer !

Vinchiappetto

fdufnews

Que les messages arrivent par Serial ou en UDP cela ne change rien à l'information transportée.
Si l'information transmise est la même dans les 2 cas, à l'arrivée tu recevras la même chose que tu traiteras de la même manière.

Vinchiappetto

Que les messages arrivent par Serial ou en UDP cela ne change rien à l'information transportée.
Si l'information transmise est la même dans les 2 cas, à l'arrivée tu recevras la même chose que tu traiteras de la même manière.
Merci fdufnews pour ta réponse.
Je ne suis pas trop fort en programmation (comme tu as pu imaginer), donc je ne savais pas que parseInt pouvais être utilisé aussi sous forme Udp.parseInt() (Je ne dis pas de connerie  :smiley-confuse: ?) !
Par contre avec le Serial je pouvais envoyer avec mon logiciel le "Carriage Return" (si j'ai bien compris, pour dire au parseInt d'arrêter de réfléchir, donc un espace), mais je ne trouve pas la solution avec l'Udp. J'envoie bien toute sorte de donnée après mes chiffres, mais j'ai une grosse latence.
Voici le nouveau code:
Code: [Select]
#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 11);

unsigned int localPort = 888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet,


// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  Serial.begin(9600);
}

void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);
    int V1, V2, V3;

    V1 = Udp.parseInt();
    V2 = Udp.parseInt();
    V3 = Udp.parseInt();


    // Sending the parts to Serial Monitor
    Serial.println(V1);
    Serial.println(V2);
    Serial.println(V3);

  }
  delay(10);
}

 MERCI POUR TA PATIENCE  :-* 

Vinchiappetto

 ... et avec un peu de recherche dans ma langue maternelle (langue du créateur Arduino Banzi   :-X !!!), j'ai pu trouver le bon compromis  8)
Pour info voici le nouveau code qui marche très bien:
Code: [Select]
#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008

char pacchetto [] = {};


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 11);

unsigned int localPort = 888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet,


// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  Serial.begin(57600);

}
void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {

    // read the packet into packetBufffer
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    // Serial.println("Contents:");
    // Serial.println(packetBuffer);

    //pacchetto  = (packetBuffer);
    // Create a new String object to be split
    char *p = (packetBuffer);
    char *str;
    int index = 0;
    String values[3];
    while ((str = strtok_r(p, " ", &p)) != NULL)
    {
      values[index] = str;
      index++;
    }

    String V1 = values[0];
    String V2 = values[1];
    String V3 = values[2];

    // Sending the parts to Serial Monitor
    Serial.println(V1);
    Serial.println(V2);
    Serial.println(V3);
  }
  //delay(10);
}



VIVA I FORUM !!!!!

Go Up