Utilisation d'encoder

Bonjour,

Je fais ce poste suite a mes recherche sans succès. Je suis actuellement en train de me créer un mixeur audio pour mon ordinateur, pour cela j'utilise 5 encodeurs branchés du pin0 ou pin9 sur mon arduino mega.

Le code fonctionne bien le seul problème est que le seul encodeur qui marche correctement est celui branché sur le pin 2 et 3 ou 1 et 2 si je décale d'un pin tous les encodeurs.
Pour faire un diagnostique j'ai essayé de changer pour d'autre pin les 4 qui marchais mal mais rien n'y fais.
Les autres encodeurs ne font que de faire bougé le slider de volume sur windows de quelque pourcent, ou alors je doit tourner l'encodeur extrêmement lentement

Ici le code pour vous permettre de comprendre ce que je veux faire



/* Encoder Library - TwoKnobs Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

#include <Encoder.h>
#include <Adafruit_NeoPixel.h>
const int NUM_SLIDERS = 5;
#define NUMPIXELS 13
#define PIN 11  
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int analogSliderValues[NUM_SLIDERS];
// Change these pin numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder knobMaster(0,1);
Encoder knobDiscord(2,3);
Encoder knobOpera(4,5);
Encoder knobGaming(6,7);
Encoder knobMusic(8,9);
int Master, Discord, Opera, Gaming, Music;
int masterMute, discordMute, operaMute, gamingMute, musicMute;
int masterDebounceTime;
//   avoid using pins with LEDs attached
//buttons: (A7, A6, A5, A4, A3)
const int masterButton=A7;
const int discordButton=A6;
const int operaButton=A5;
const int gamingButton=A4;
const int musicButton=A3;
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 0;    // the debounce time; increase if the output flickers

int masterState=0;
int discordState=0;
int operaState=0;
int gamingState=0;
int musicState=0;





void setup() {
  
  Serial.begin(9600);
  pinMode(masterButton, INPUT_PULLUP);
  pinMode(discordButton, INPUT_PULLUP);
  pinMode(operaButton, INPUT_PULLUP);
  pinMode(gamingButton, INPUT_PULLUP);
  pinMode(musicButton, INPUT_PULLUP);
  
analogSliderValues[0]  = 1023;
knobMaster.write(100);
analogSliderValues[1] = 1023;
knobDiscord.write(100);
analogSliderValues[2] = 1023;
knobOpera.write(100);
analogSliderValues[3] = 1023;
knobGaming.write(100);
analogSliderValues[4] = 1023;
knobMusic.write(100);
pixels.begin();
pixels.clear(); 
masterMute=0;
discordMute=0;
operaMute=0;
gamingMute=0;
musicMute=0;
}



void loop() {
  
  
  Master = knobMaster.read();
  Discord = knobDiscord.read();
  Opera = knobOpera.read();
  Gaming = knobGaming.read();
  Music = knobMusic.read();



checkButtons();
checkEncoders();
sendSliderValues();
//printSliderValues();//debug
pixels.show();   
 

}

void sendSliderValues() {
  String builtString = String("");

  for (int i = 0; i < NUM_SLIDERS; i++) {
    builtString += String((int)analogSliderValues[i]);

    if (i < NUM_SLIDERS - 1) {
      builtString += String("|");
    }
  }
  
  Serial.println(builtString);
}
void printSliderValues() {
  for (int i = 0; i < NUM_SLIDERS; i++) {
    String printedString = String("Slider #") + String(i + 1) + String(": ") + String(analogSliderValues[i]) + String(" mV");
    Serial.write(printedString.c_str());

    if (i < NUM_SLIDERS - 1) {
      Serial.write(" | ");
    } else {
      Serial.write("\n");
    }
  }
}
void checkButtons(){ // Verifie l'état muet d'un bouton
  
if (digitalRead(masterButton)==0 && masterState ==0){
masterMute = !masterMute ;
masterState =1;
delay(25);
}
 if (digitalRead(masterButton)==1){
  masterState=0;
 }
if (digitalRead(discordButton)==0 && discordState ==0){
discordMute = !discordMute ;
discordState =1;
delay(25);
}
 if (digitalRead(discordButton)==1){
  discordState=0;
 }
 if (digitalRead(operaButton)==0 && operaState ==0){
operaMute = !operaMute ;
operaState =1;
delay(25);
}
 if (digitalRead(operaButton)==1){
  operaState=0;
 }
 if (digitalRead(gamingButton)==0 && gamingState ==0){
gamingMute = !gamingMute ;
gamingState =1;
delay(25);
}
 if (digitalRead(gamingButton)==1){
  gamingState=0;
 }
 if (digitalRead(musicButton)==0 && musicState ==0){
musicMute = !musicMute ;
musicState =1;
delay(25);
}
 if (digitalRead(musicButton)==1){
  musicState=0;
 }
}
void checkEncoders(){ //verifie si le volume est a zero alume la led en rouge
  
      if (Master > 0 && Master < 102 && masterMute==0){
        analogSliderValues[0]=Master*10;
        pixels.setPixelColor(4, pixels.Color(0, 150, 0));
     
    }
    else if (masterMute==0 && (Master > 102 || Master==102)){
        analogSliderValues[0]=102*10;
        knobMaster.write(102);
        pixels.setPixelColor(4, pixels.Color(0, 150, 0));
        
    }
    else if (masterMute==1){
      analogSliderValues[0]=0;
        pixels.setPixelColor(4, pixels.Color(150, 0, 0));
        
    }
    
    else {
        analogSliderValues[0]=0;
        knobMaster.write(0);
        pixels.setPixelColor(4, pixels.Color(150, 0, 0));
        
    }
  
    if (Discord > 0 && (Discord < 102 && discordMute==0)){
        analogSliderValues[1]=Discord*10;
        pixels.setPixelColor(3, pixels.Color(0, 150, 0));
    }
    else if (discordMute==0 && Discord > 102 || Discord==102){
        analogSliderValues[1]=102*10;
        knobDiscord.write(102);
        pixels.setPixelColor(3, pixels.Color(0, 150, 0));
    }
    else if (discordMute==1){
        analogSliderValues[1]=0;
        pixels.setPixelColor(3, pixels.Color(150, 0, 0));
    }
    else {
        analogSliderValues[1]=0;
        knobDiscord.write(0);
        pixels.setPixelColor(3, pixels.Color(150, 0, 0));
    }
    if (operaMute==0 && Opera > 0 && Opera < 102){
        analogSliderValues[2]=Opera*10;
        pixels.setPixelColor(2, pixels.Color(0, 150, 0));
    }
    else if (operaMute ==0 && (Opera > 102 || Opera==102)){
        analogSliderValues[2]=102*10;
        knobOpera.write(102);
        pixels.setPixelColor(2, pixels.Color(0, 150, 0));
    }
    else if (operaMute==1){
        analogSliderValues[2]=0;
        pixels.setPixelColor(2, pixels.Color(150, 0, 0));
    }
    else {
        analogSliderValues[2]=0;
        knobOpera.write(0);
        pixels.setPixelColor(2, pixels.Color(150, 0, 0));
    }
        if (gamingMute==0 && Gaming > 0 && Gaming < 102){
        analogSliderValues[3]=Gaming*10;
        pixels.setPixelColor(1, pixels.Color(0, 150, 0));
        
    }
    else if (gamingMute==0 && (Gaming > 102 || Gaming==102)){
        analogSliderValues[3]=102*10;
        knobGaming.write(102);
        pixels.setPixelColor(1, pixels.Color(0, 150, 0));
    }
    else if (gamingMute==1){
        analogSliderValues[3]=0;
        pixels.setPixelColor(1, pixels.Color(150, 0, 0));
    }
    else {
        analogSliderValues[3]=0;
        knobGaming.write(0);
        pixels.setPixelColor(1, pixels.Color(150, 0, 0));
    }
    if (musicMute==0 && Music > 0 && Music < 102){
      analogSliderValues[4]=Music*10;
      pixels.setPixelColor(0, pixels.Color(0, 150, 0));
   }
    else if (musicMute ==0 && (Music > 102 || Music==102)){
        analogSliderValues[4]=102*10;
        knobMusic.write(102);
        pixels.setPixelColor(0, pixels.Color(0, 150, 0));
    }
    else if (musicMute==1){
        analogSliderValues[4]=0;
        pixels.setPixelColor(0, pixels.Color(150, 0, 0));
    }
    else {
        analogSliderValues[4]=0;
        knobMusic.write(0);
        pixels.setPixelColor(0, pixels.Color(150, 0, 0));
    }

}

Merci d'avoir pris le temps de lire jusqu'au bout :bowing_man:

Bonjour,

La doc de la librairie me semble pourtant assez claire

Encoders have 2 signals, which must be connected to 2 pins. There are three options.

  1. Best Performance: Both signals connect to interrupt pins.
  2. Good Performance: First signal connects to an interrupt pin, second to a non-interrupt pin.
  3. Low Performance: Both signals connect to non-interrupt pins, details below.
|      Board   |       Interrupt         |
|   .....
| Arduino Mega | 2, 3, 18, 19, 20, 21 13 |

Pour avoir de bonnes performances il faut avoir au moins l'une des broches des encodeurs connectée à une interruption, ce qui n'est pas le cas de ta configuration.
Sinon, il faut appeler la méthode read le plus souvent possible.

1 Like

l'usage des pins 0 et 1 sur MEGA

et de la liaison Série n'est sans doute pas recommandé

évitez si vous pouvez la classe String, par exemple ce code

void sendSliderValues() {
  String builtString = String("");

  for (int i = 0; i < NUM_SLIDERS; i++) {
    builtString += String((int)analogSliderValues[i]);

    if (i < NUM_SLIDERS - 1) {
      builtString += String("|");
    }
  }
  
  Serial.println(builtString);
}

sera bien plus efficace comme cela (ce qui laissera plus de temps pour lire les encodeurs)

const byte NUM_SLIDERS = 5; // pas la peine d'un int

void sendSliderValues() {
  for (byte i = 0; i < NUM_SLIDERS; i++) {
    Serial.print(analogSliderValues[i]);
    if (i != NUM_SLIDERS - 1) Serial.write('|');
  }
  Serial.println();
}

pareil pour printSliderValues()

void printSliderValues() {
  for (byte i = 0; i < NUM_SLIDERS; i++) {
    Serial.print(F("Slider #"));
    Serial.print(i + 1);
    Serial.print(F(": "));
    Serial.print(analogSliderValues[i]);
    Serial.print(F(" mV"));
    if (i != NUM_SLIDERS - 1) Serial.print(F(" | "));
  }
  Serial.println();
}

➜ quand il s'agit juste d'envoyer une chaîne de caractères sur le port série, il n'y a généralement aucun intérêt à la construire d'abord pour l'envoyer ensuite en une seule commande. Le port série envoie chaque octet séparément de toutes façons, donc pour le côté réception ça ne change rien. Et vous gagnez de la mémoire et de la vitesse...

➜ en utilisant juste un const byte pour le nombre de sliders (ça va jusqu'à 255) vous ferez des comparaisons/opérations sur un seul octet au lieu de 2 avec un int et sur un processeur 8 bit c'est plus efficace.

Merci bcp je vais essayé tous ça, jai besoin des com du port série car le arduino communique avec un logiciel qui interprète les Serial.print

J'ai lu dans la doc que le arduino mega peux avoir des soucis de communication et que le mettre a jour pourrais aidé ça peux être une autre solution ?
Surtout que le code n'utilise pas d'interrupt, donc connecter les encoder sur les ports qui le support est t'il utile ?

Lors ce que je tourne le premier encodeur qui est sur le port 1 et 2, il ce passe ca

13:36:04.258 -> 1010|1020|1000|1000|1000
13:36:04.293 -> 1010|1020|1000|1000|1000
13:36:04.327 -> 1?000|1000|1000
13:36:04.327 -> 10???000|1000
13:36:04.361 -> 1010?000|1000
13:36:04.395 -> 1010|1020|10001020|1020|1000|1000|1000
13:36:04.429 -> 1020|1020|10
13:36:04.462 -> 1010|1020|1000|1000|0|1020|1000|100??020|1000|1000|1000
13:36:04.565 -> 10?000|1000
13:36:04.565 -> 1010|1020|100H(?????020|1000|1000|10&??000|1000|1000
13:36:04.666 -> 1010|102???j
13:36:04.700 -> 1010|1020|1000|1000|1000

Jai remplacer les "?" car sur la console ce sont des "?" a l'envers que je ne peux même pas copier coller

Bonjour edgarmoe

Tu ne peut pas utiliser le port 1, c'est le Tx du Serial, c'est le pourquoi des ? à l'envers. Cela vient du fait que ton encodeur envoie des impulsions "par dessus" le Tx du Serial.
Suis les indications de @fdufnews, choisis Good Performance, c'est à dire choisi au moins un port avec interrupt par codeur et n'utilises pas les ports 0 et 1.

Tu devrait essayer cette config:

Encoder knobMaster(2,4);
Encoder knobDiscord(3,5);
Encoder knobOpera(18,6);
Encoder knobGaming(19,7);
Encoder knobMusic(20,8);

Cordialement
jpbbricole

Voici ma config



/* Encoder Library - TwoKnobs Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */
#define  ENCODER_OPTIMIZE_INTERRUPTS
#include <Encoder.h>
#include <Adafruit_NeoPixel.h>
const byte NUM_SLIDERS = 5;
#define NUMPIXELS 13
#define PIN 11  
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int analogSliderValues[NUM_SLIDERS];
// Change these pin numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder knobMaster(20,21);
Encoder knobDiscord(19,17);
Encoder knobOpera(2,4);
Encoder knobGaming(3,5);
Encoder knobMusic(18,16);
int Master, Discord, Opera, Gaming, Music;
int masterMute, discordMute, operaMute, gamingMute, musicMute;
int masterDebounceTime;
//   avoid using pins with LEDs attached
//buttons: (A7, A6, A5, A4, A3)
const int masterButton=A7;
const int discordButton=A6;
const int operaButton=A5;
const int gamingButton=A4;
const int musicButton=A3;
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 0;    // the debounce time; increase if the output flickers

int masterState=0;
int discordState=0;
int operaState=0;
int gamingState=0;
int musicState=0;





void setup() {
  
  Serial.begin(9600);
  pinMode(masterButton, INPUT_PULLUP);
  pinMode(discordButton, INPUT_PULLUP);
  pinMode(operaButton, INPUT_PULLUP);
  pinMode(gamingButton, INPUT_PULLUP);
  pinMode(musicButton, INPUT_PULLUP);
  
analogSliderValues[0]  = 1023;
knobMaster.write(100);
analogSliderValues[1] = 1023;
knobDiscord.write(100);
analogSliderValues[2] = 1023;
knobOpera.write(100);
analogSliderValues[3] = 1023;
knobGaming.write(100);
analogSliderValues[4] = 1023;
knobMusic.write(100);
pixels.begin();
pixels.clear(); 
masterMute=0;
discordMute=0;
operaMute=0;
gamingMute=0;
musicMute=0;
}



void loop() {
  
  
  Master = knobMaster.read();
  Discord = knobDiscord.read();
  Opera = knobOpera.read();
  Gaming = knobGaming.read();
  Music = knobMusic.read();



checkButtons();
checkEncoders();
sendSliderValues();
//printSliderValues();//debug
pixels.show();   
 

}

void sendSliderValues() {
  for (byte i = 0; i < NUM_SLIDERS; i++) {
    Serial.print(analogSliderValues[i]);
    if (i != NUM_SLIDERS - 1) Serial.write('|');
  }
  Serial.println();
}

void printSliderValues() {
  for (byte i = 0; i < NUM_SLIDERS; i++) {
    Serial.print(F("Slider #"));
    Serial.print(i + 1);
    Serial.print(F(": "));
    Serial.print(analogSliderValues[i]);
    Serial.print(F(" mV"));
    if (i != NUM_SLIDERS - 1) Serial.print(F(" | "));
    else {
      Serial.write("\n");
    }
  }
  Serial.println();
}
void checkButtons(){ // Verifie l'état muet d'un bouton
  
if (digitalRead(masterButton)==0 && masterState ==0){
masterMute = !masterMute ;
masterState =1;
delay(25);
}
 if (digitalRead(masterButton)==1){
  masterState=0;
 }
if (digitalRead(discordButton)==0 && discordState ==0){
discordMute = !discordMute ;
discordState =1;
delay(25);
}
 if (digitalRead(discordButton)==1){
  discordState=0;
 }
 if (digitalRead(operaButton)==0 && operaState ==0){
operaMute = !operaMute ;
operaState =1;
delay(25);
}
 if (digitalRead(operaButton)==1){
  operaState=0;
 }
 if (digitalRead(gamingButton)==0 && gamingState ==0){
gamingMute = !gamingMute ;
gamingState =1;
delay(25);
}
 if (digitalRead(gamingButton)==1){
  gamingState=0;
 }
 if (digitalRead(musicButton)==0 && musicState ==0){
musicMute = !musicMute ;
musicState =1;
delay(25);
}
 if (digitalRead(musicButton)==1){
  musicState=0;
 }
}
void checkEncoders(){ //verifie si le volume est a zero alume la led en rouge
  
      if (Master > 0 && Master < 102 && masterMute==0){
        analogSliderValues[0]=Master*10;
        pixels.setPixelColor(4, pixels.Color(0, 150, 0));
     
    }
    else if (masterMute==0 && (Master > 102 || Master==102)){
        analogSliderValues[0]=102*10;
        knobMaster.write(102);
        pixels.setPixelColor(4, pixels.Color(0, 150, 0));
        
    }
    else if (masterMute==1){
      analogSliderValues[0]=0;
        pixels.setPixelColor(4, pixels.Color(150, 0, 0));
        
    }
    
    else {
        analogSliderValues[0]=0;
        knobMaster.write(0);
        pixels.setPixelColor(4, pixels.Color(150, 0, 0));
        
    }
  
    if (Discord > 0 && (Discord < 102 && discordMute==0)){
        analogSliderValues[1]=Discord*10;
        pixels.setPixelColor(3, pixels.Color(0, 150, 0));
    }
    else if (discordMute==0 && Discord > 102 || Discord==102){
        analogSliderValues[1]=102*10;
        knobDiscord.write(102);
        pixels.setPixelColor(3, pixels.Color(0, 150, 0));
    }
    else if (discordMute==1){
        analogSliderValues[1]=0;
        pixels.setPixelColor(3, pixels.Color(150, 0, 0));
    }
    else {
        analogSliderValues[1]=0;
        knobDiscord.write(0);
        pixels.setPixelColor(3, pixels.Color(150, 0, 0));
    }
    if (operaMute==0 && Opera > 0 && Opera < 102){
        analogSliderValues[2]=Opera*10;
        pixels.setPixelColor(2, pixels.Color(0, 150, 0));
    }
    else if (operaMute ==0 && (Opera > 102 || Opera==102)){
        analogSliderValues[2]=102*10;
        knobOpera.write(102);
        pixels.setPixelColor(2, pixels.Color(0, 150, 0));
    }
    else if (operaMute==1){
        analogSliderValues[2]=0;
        pixels.setPixelColor(2, pixels.Color(150, 0, 0));
    }
    else {
        analogSliderValues[2]=0;
        knobOpera.write(0);
        pixels.setPixelColor(2, pixels.Color(150, 0, 0));
    }
        if (gamingMute==0 && Gaming > 0 && Gaming < 102){
        analogSliderValues[3]=Gaming*10;
        pixels.setPixelColor(1, pixels.Color(0, 150, 0));
        
    }
    else if (gamingMute==0 && (Gaming > 102 || Gaming==102)){
        analogSliderValues[3]=102*10;
        knobGaming.write(102);
        pixels.setPixelColor(1, pixels.Color(0, 150, 0));
    }
    else if (gamingMute==1){
        analogSliderValues[3]=0;
        pixels.setPixelColor(1, pixels.Color(150, 0, 0));
    }
    else {
        analogSliderValues[3]=0;
        knobGaming.write(0);
        pixels.setPixelColor(1, pixels.Color(150, 0, 0));
    }
    if (musicMute==0 && Music > 0 && Music < 102){
      analogSliderValues[4]=Music*10;
      pixels.setPixelColor(0, pixels.Color(0, 150, 0));
   }
    else if (musicMute ==0 && (Music > 102 || Music==102)){
        analogSliderValues[4]=102*10;
        knobMusic.write(102);
        pixels.setPixelColor(0, pixels.Color(0, 150, 0));
    }
    else if (musicMute==1){
        analogSliderValues[4]=0;
        pixels.setPixelColor(0, pixels.Color(150, 0, 0));
    }
    else {
        analogSliderValues[4]=0;
        knobMusic.write(0);
        pixels.setPixelColor(0, pixels.Color(150, 0, 0));
    }

}

le code fonctionne parfaitement, effectivement le port 0 et 1 semble donner des erreurs, si non comment puis je changé le port com utilisé ?

As-tu explicitement désactivé les interruptions?
La librairie les actives elle-même sauf si on lui demande de ne pas le faire.

#if defined(ENCODER_USE_INTERRUPTS) || !defined(ENCODER_DO_NOT_USE_INTERRUPTS)
#define ENCODER_USE_INTERRUPTS
#define ENCODER_ARGLIST_SIZE CORE_NUM_INTERRUPT
#include "utility/interrupt_pins.h"
#ifdef ENCODER_OPTIMIZE_INTERRUPTS
#include "utility/interrupt_config.h"
#endif
#else
#define ENCODER_ARGLIST_SIZE 0
#endif

globalement, si on ne définit pas ENCODER_DO_NOT_USE_INTERRUPTS et qu'au moins une pin par encodeur est connectée sur une entrée générant une IT alors les interruptions sont actives.
On peut aussi définir ENCODER_OPTIMIZE_INTERRUPTS qui autorise une optimisation de la gestion des interruptions au détriment de l'utilisation de attachInterrupt par une autre librairie ou par ton code lui-même.
A noter, il est aussi indiqué que l'utilisation de Serial.print() peut causer des problèmes. Il faut utiliser un débit élevé et limiter la longueur des chaines transmises. Il va sans dire que le problème touche Serial.write() de la même manière.

Bonjour edgarmoe

Si c'est pour changer le port qui "sort" sur la console c'est fixé, Rx = D0 et Tx = D1. c'est câblé sur la carte.

Cordialement
jpbbricole

Tu utilises une mega donc tu disposes de 4 liaisons série il suffit d'utiliser Serial1, 2 ou 3.
Mais attention, certaines des IOs sont communes avec celles générant des interruptions voir ici

Oui j'ai vue cela, après il n'y a pas bcp d'info transmise

Je l'ai défini au début du code comme vue plus haut sur mon dernier post.

Encore merci de ton aide, ainsi qu'a @jpbbricole et J-M-L.
Je vais mettre en résolu :slight_smile:

Pour le port com, changer de com3 a com1 est t'il utile, la est ma question

Boinjour edgarmoe

Avec ta configuration

Encoder knobMaster(20,21); //  i2C SDA SCL
Encoder knobDiscord(19,17); //  Rx1 Rx2
Encoder knobOpera(2,4);
Encoder knobGaming(3,5);
Encoder knobMusic(18,16); //  Tx1 Tx2

Il ne te reste plus que com3 de libre. Regardes le pinout du Mega.

Cordialement
jpbbricole

ATTENTION, il faut appeler les choses par leur nom.
Sur les cartes Arduino les liaisons série s'appellent Serial, Serial1, ....
COM c'est plutôt réservé pour les liaisons série sur les PC.
Donc il faudrait éclaircir la question

De quel com parles-tu?

Je parle de celui pour le pc

Bonsoir

Pour moi, c'est encore un peu ambigu!
Quand tu parles de COM3 c'est le Serial3 (Rx3 et Tx3) du Mega ou le port dans le PC, sur lequel est reconnu ton Arduino Mega?

Cordialement
jpbbricole

Je parle du port com3 que j'utilise pour que le Arduino communique avec l'application de bureau
com3 baud rate 9600

Le port COM du PC n'a à priori aucune importance.