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