Problème communication USB Arduino Zero (Avec un peu de VB)

Salut tout le monde,

Je me suis procuré un Arduino Zero et je voudrais le faire communiquer avec une appli codé par mes soins en VB.

L'Arduino doit envoyer par USB (vers l'appli VB) le contenu de 2 tableaux remplies par un nombre d'échantillons (nbsamples) allant de 1 à 2000 choisit par l'utilisateur de l'application VB.
Le baudrate utilisé est de 115200 et j'utilise le port Native (SerialUSB) de la Zero.
Par exemple si le nbsamples est de 100, les deux tableaux auront une dimension 1 par 100;
La board doit aussi exécuter d'autres fonctions qui n'interviennent pas dans la création/remplissage de ce tableau. Il y a 15 fonctions enregistrées dont chacune a un nombre attribué dans un switch principale.
Le remplissage des tableau est la fonction "1" (donc case 1).

Voici le code du loop de l'arduino :

void loop() {
  nombreReception = USB_Read();

  if (nombreReception != 0) {
    switch (nombreReception) {

      /**utilisation fonction MESURE **/
      case 1 :
        nbsamples = 0;
        while (nbsamples == 0) {
          nbsamples = USB_Read();
        }

       MESURE(nbsamples );
        for (int i = 0; i < nbsamples ; i++) {
          SerialUSB.println(Tab1[i]);
          SerialUSB.println(tab2[i]);
        }

        nombreReception = 0;
        break;

      case 2 :
         break;

/******* autres case jusqu'à 15 *****/


      /* HARD RESET */
      case 15:
        systemReset();
        break;

      default :
        break;

    }   
   nombreReception = 0;
  }
}

La fonction mesure prend arguments le nbsamples et génère les tableaux Tab1 et Tab2. Je n'ai aucun problèmes avec cette fonction qui fonctionne très bien et affichent l'intégralité des tableaux dans le moniteur série de l'IDE lors de mes débogages.

Voici ma fonction de lecture USB (PC vers Arduino) pour ne pas être limité à un seul byte.

long USB_Read() {
  int octetRecu = 0; // variable pour octet recu
  int compt = 0; // variable locale comptage caracteres recus
  boolean signe = true; // variable locale signe nombre recu
  long nombreRecu = 0; // variable locale nombre recu

  while (SerialUSB.available() > 0) {
    octetRecu = SerialUSB.read();

    if ((octetRecu == '-') && (compt == 0))signe = false;
    compt = compt + 1;

    octetRecu = octetRecu - 48;

    if ((octetRecu >= 0) && (octetRecu <= 9)) nombreRecu = (nombreRecu * 10) + octetRecu;
    delay(1);
  } // fin tant que octet reception
  if (signe == false) nombreRecu = nombreRecu * (-1); // prise en compte signe negatif
  return (nombreRecu); // renvoie le nombre calcule
}

Enfin, voici les parties de mon code VB dont une pose problème :

'------BOUTON D'INITIALISATION DE LA COM

 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            SerialPort1.PortName = ComboBox1.Text
            SerialPort1.BaudRate = 115200
            SerialPort1.Encoding = System.Text.Encoding.Default
            SerialPort1.RtsEnable = True
            SerialPort1.DtrEnable = True
            SerialPort1.Parity = Parity.None
            SerialPort1.StopBits = StopBits.One
            SerialPort1.Open()          ' Opens the port 
    End Sub



'------BOUTON START DE LA COM
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

            Dim Tab_full(0, 1) As Double
            Dim Samples As Double = 5 'TextBox2.Text
            Dim j As Double = 0

                Try
                    SerialPort1.WriteLine(1) ' & vbCrLf)    ' Write data to the send buffer  
                    SerialPort1.WriteLine(5) ' & vbCrLf)    ' Write data to the send buffer
                Catch ex As Exception           ' Exception handling 
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                End Try

                j = 0

                Do
                    ReDim Tab_full(i * Samples + j + 1, 1)

                    Tab_full(i * Samples + j, 0) = GetTab1()
                    Tab_full(i * Samples + j, 1) = GetTab2()

                    j += 1
                Loop Until j >= Samples 

            Loop
            MessageBox.Show("Acquisition Complete !", "", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        End If
    End Sub



'------FUNCTION GetTab1 identique à GetTab2.
    Function GetTab1 () As Double
        Dim ReceivedData As String = 0        ' Declare variable for received data 
        Try
            ReceivedData = SerialPort1.ReadLine    ' Receive the data 
        Catch ex As Exception
            ReceivedData = ex.Message       ' Exception handling 
        End Try
        Return Convert.ToDouble(ReceivedData)
    End Function

Dans cette exemple je force le nombre de sample à 5 à la place d'une TextBox.
Donc dans l'ordre l'application envoie 1 pour choisir la fonction mesure de l'arduino, puis envoie un 5 pour lui donner une valeur d'échantillonnage.
Mais l'Arduino l'interprète comme un "15" plutôt qu'un "1" suivi d'un "5" et fait donc un Hard Reset (fonction numéro 15).

Sous Putty ou le moniteur série, cela fonctionne très bien, la saisie de nombre plus grand que 9 est bien pris en compte que ça soit 10 ou 2000, mais pas sous mon application VB.
J'espère avoir été claire.

Voyez-vous une petite erreur qui causerait ce problème d'interprétation de l'Arduino ?

Par ailleurs j'ai remarqué que le port Native et extrêmement plus lent que le port Programming de l'Arduino Zero, mais je n'ai rien trouvé sur le forum à propos de ce sujet...

Merci beaucoup de votre aide :slight_smile: