Transmettre en VB.Net et reception des bytes par Arduino via USB

Bonjour a tous,

Voici mon problème, j'ai réaliser un petit logiciel en VB.Net qui a pour but de contrôler trois LED rgb en utilisent des trackBar dans VB et une plateforme Arduino.

Mon problème est que je parviens a contrôler une seule des trois LED. Je pence que je ne comprend pas bien la réception dans Arduino des bytes. :confused:

Je vous fournie le code Arduino parce que je voudrais de l'aide pour comprendre comment recevoir plusieurs variable en bytes Arduino car le code que j'ai réaliser quant je tente de le compiler des erreurs sons générer .
voici les erreurs:

E:\Arduino Projets\Arduino VB.NET Projets\Arduino LED Dimmer\Arduino_LED_Dimmer\Arduino_LED_Dimmer.ino: In function 'void loop()':

Arduino_LED_Dimmer:26: error: invalid types 'int[int]' for array subscript

    Rouge = tab[0];

                 ^

Arduino_LED_Dimmer:28: error: invalid types 'int[int]' for array subscript

    Vert = tab[1];

                ^

Arduino_LED_Dimmer:30: error: invalid types 'int[int]' for array subscript

    Bleu = tab[2];

                ^

exit status 1
invalid types 'int[int]' for array subscript

Voici mon code:

int RougePin = 9;
int VertPin = 10;
int BleuPin = 11;
int Rouge = 0;
int Vert = 0;
int Bleu = 0;
int index =0;
int tab = new int[3];

void setup() {
  // initialize serial:
  Serial.begin(9600);
  pinMode(RougePin, OUTPUT);
  pinMode(VertPin, OUTPUT);
  pinMode(BleuPin, OUTPUT);
}

void loop() {

   
  
  if (Serial.available() > 0) {   
 
   Rouge = tab[0];
   analogWrite(RougePin, Rouge);
   Vert = tab[1];
   analogWrite(VertPin, Vert);
   Bleu = tab[2];
   analogWrite(BleuPin, Rouge);
  }
   
}


void serialEvent(){
  int index =0;
  int tab = new int[3];
   
  while (Serial.available() & index < 3) {
  index = (int)Serial.read();
  index++;
     
  }

Merci a tous de votre aide.

Chris

Pourquoi new() ?

int tab[3]; // suffit

A aucun moment tab ne subit d'affectation, et la ligne série n'est jamais lue : Serial - Arduino Reference

D'autre part on ne sait pas comment le PC transmet les 3 valeurs :

  • en binaire
  • en ascii avec séparateurs
  • autre ?
    Réponse impossible.

Bonjour,
il manque un } à la fin

Bonjour hbachetti,
Pour répondre à votre question le PC transmet les 3 valeurs en binaire, et pourquoi int tab = new int pour que chaque byte soient bien lu, mais je pense que ce n’est pas la bonne façon.

J'ai essayé juste avec int tab[3];malheureusement ça ne fonctionne pas c’est comme si les bytes transmis ne sont pas lu, je pense que mon programme ne fonctionne pas :cry:

Normal, Serial.available() ne suffit pas.

Pour lire un int : Serial.parseInt()

Mais ce n'est certainement pas la meilleure manière de procéder. Souvent une transmission de données nécessite un protocole, et une transmission ASCII est plus facile à implémenter.

Exemple : STXr;g;bETX

STX et ETX = 0x02 et 0x03
Le code doit lire la ligne série jusqu'à recevoir STX, lire les données en éliminant les séparateurs, puis attendre ETX.
Une transmission binaire est plus complexe car les caractères 0x02 et 0x03 peuvent faire partie des données.

Pour faire très simple il est possible d'utiliser une transmission du type :

"r g b\n" ou le caractère \n sert de terminateur.
Exemple : "255 255 127\n" = jaune

Lire la ligne avec :

char buffer[15];
Serial.readBytesUntil('\n', buffer, 15);

Ensuite décortiquer les données (parsing).

Le parser peut être écrit avec sscanf() :

int r, g, b;
int n = sscanf(buffer, "%d %d %d", &r, &g, &b);

Si n vaut 3 cela veut dire que trois valeurs ont été trouvées. Sinon, jeter les données et continuer la lecture.

On peut aussi transmettre les données en hexa, ce qui peut permettre de transmettre moins d'octets. :
Exemple : "FF FF 7F\n" = jaune

Le parser (%x au lieu de %d") :
int n = sscanf(buffer, "%x %x %x", &r, &g, &b);

On peut aussi transmettre les données en hexa sans séparateur, ce qui peut permettre de transmettre encore moins d'octets :
Exemple : "FFFF7F\n" = jaune

Essaie ceci :

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

void loop() {
  char color[15];
  int r, g, b;

  if (Serial.available()) {
    memset(color, 0, sizeof(color));
    Serial.readBytesUntil('\n', color, sizeof(color));
    if (sscanf(color, "%02x%02x%02x", &r, &g, &b) == 3) {
      Serial.print("R ");
      Serial.println(r);
      Serial.print("G ");
      Serial.println(g);
      Serial.print("B ");
      Serial.println(b);
    }
    else {
      Serial.println("what's up doc ?");
    }
  }
}

Par contre pour transmettre 2 5 7 il faudra envoyer "020507\n"
Je suppose que sous VB.net tu sais faire ?

L'intérêt de transmettre en clair est de pouvoir tester avec le moniteur série :slight_smile:
Avec du binaire c'est impossible.

Bonjour a tous,

Voici j’ai trouver sur le web ce code et je l’ai tester est ça fonctionne très bien. Cela me permet de valider a partir serial moniteur de Arduino la réception des trois bytes envoyez a partir de logiciel VB.Net.

Mais je voudrais savoir comment je peux extraire les trois valeurs et les stocker dans trois variables?

Merci

#include <SoftwareSerial.h>

SoftwareSerial gtSerial(8, 7); // Arduino RX, Arduino TX
int RougePin = 9;
int VertPin = 10;


void setup() {
  Serial.begin(9600);    // serial / USB port / software serial port
 
}

byte rxbyte = 0;        // stores received byte


void loop() {
  // check if byte available from USB port
  if (Serial.available() ) {
     rxbyte = Serial.read();
     Serial.print(" Data:");
     Serial.println(rxbyte);
     
  }
  }

Ma solution en #6 ne convient pas ?

Bonjour hbachetti,

Pour votre solution #6 malheureusement elle ne convient pas.

Je veux juste lire les trois bytes que j’envoie de mon programme VB et les stocker dans une variable est ensuite les transmettre exemple a analogWrite(RougePin,Rouge);

Merci

Je ne vois pas pourquoi cette solution ne conviendrait pas. Si tu maîtrises VB il ne doit pas être difficile d'envoyer une chaîne de caractères composée de 3 bytes convertis en hexa, suivis de '\n'.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.