Détection port Série utilisé par arduino

Bonjour,

Je suis désolé si le problème a déjà été posé mais je n’ai pas trouvé de réponse.

Voila mon problème, j’essaye de détecter quel port série est utilisé par mon arudino sous processing.
Je test bien tous les ports ( mon i s’incrémente bien) cependant la led ne s’allume jamais.

merci de votre aide.

//**Code Processing: **//

int i=0;

void setup() 
{
   String[] portName = Serial.list();
   serialLength=portName.length;
   size(200, 200);
}

void draw() {
  try
  {
    if(i<serialLength)
     {//On essaye chaque port série
       String portName = Serial.list()[i];
       myPort = new Serial(this, portName, 9600);
       myPort.write(1);
    }else {
        i=0;//Des que nous avons testé tous les ports on réessaye depuis le début
    }
  }
  catch(Exception e)
   {
     i++; //Si un port série n'est pas utilisable on passe au suivant
     print(i);
  }
        
}

//Code Arduino//

 char val; // Data received from the serial port
 int ledPin = 13; // Set the pin to digital I/O 4
 
 void setup() {
    pinMode(ledPin, OUTPUT); // Set pin as OUTPUT
    Serial.begin(9600); // Start serial communication at 9600 bps
 }
 
 void loop() {
   if (Serial.available()) { // If data is available to read,
     val = Serial.read(); // read it and store it in val
   }
   if (val == 1) { // If H was received
     digitalWrite(ledPin, HIGH); // turn the LED on
   } else {
     digitalWrite(ledPin, LOW); // Otherwise turn it OFF
   }
    delay(100); // Wait 100 milliseconds for next reading
 }

Salut,

Il me semble que c’est forcement le même port qui a permis de téléverser le code dans l’arduino non ?

Oui mais le but est ici de créer une application processing "universelle" ou le port utilisé n'est pas écrit en dur dans le programme et l'application peut donc être utilisé sur plusieurs ordinateurs.

Je ne voudrais pas dire de bêtise mais il me semble que c'est le système d'exploitation qui gère les ports.

Je sais que sous Linux il faut écrire des règles "UDEV" pour maîtriser cette gestion. Il doit bien y avoir un équivalent sous Windows.

perthouse: Oui mais le but est ici de créer une application processing "universelle" ou le port utilisé n'est pas écrit en dur dans le programme et l'application peut donc être utilisé sur plusieurs ordinateurs.

Pourquoi pas un simple sélecteur ? Sinon apparemment sur Windows c'est WMI qu'il faudrait utiliser : interroger la machine, trouver l'ID correspondant et récupérer le port COM.

Je pense que je vais faire un sélecteur, mais le but est de faire une application pour un utilisateur lambda, qui ne connait pas forcement ce qu'est un port com et ne sait donc pas le port de son Arduino. Au pire il essayera toutes les possibilités :P.

Bonjour,

C'est quoi ce code java (processing) avec un try mixé avec un itérateur ...

Déplace ton try au bon endroit et fait une boucle classique :

void setup() {
}

void draw() {
  for (String portName : Serial.list()) {
    try {
       Serial myPort = new Serial(this, portName, 9600);
       // ...
    } catch(Exception e) {
       // ...
    }
  }       
}

Ps: le plus simple c'est d'ouvrir chaque port série ce qui entrainera un reboot de l'arduino (si il ya une carte arduino à l'autre bout) et d'attendre une chaine de caractère bien précise à ce moment là (envoyé par la carte dans le setup()). Si tu écris dans chaque port rien ne te dit que tu ne vas pas déclencher un truc c'est l'utilisateur avec ton myPort.write(1) !

C'est en effet plus pratique et efficace de recevoir un message du arduino merci bien skywodd!