Ok. Je comprends un peu mieux 
mais je peux aussi faire
MSComm1.Output = "a" & "," & "b" & "," & "c"
oui, c'est comme ça qu'il faut envoyer tes valeurs, avec un séparateur. Je vais même te suggérer d'ajouter un caractère de fin de chaîne car ta chaine n'aura jamais la même longueur : tu peux aussi bien envoyer "0,0,0" (5 caractères) que "10,10,10" (8 caractères). Le caractère de fin de chaîne confirmera que tu as bien tout envoyé.
Donc
MSComm1.Output = "a" & "," & "b" & "," & "c" & chr(10)
Le chr(10) est le retour chariot. Voilà pour le côté VB.
Côté C++ il faut donc décoder cette chaîne.
Je vais déjà fixer une limite à la longueur de cette chaine. La documentation Adafruit indique que la fonction setPWMadmet 3 paramètres : channel, on et off.
- Channel : voie de l'arduino, deux caractères pour des voies de "0" à "15".
- On et off : sont des valeurs qui vont de 0 à 4096 donc maximum 4 caractères.
- et on ajoute 2 séparateurs (la virgule) et le caractère de fin de chaine (chr(10) ou \n en C++).
La chaîne la plus courte sera donc de la forme "X,X,X\n" soient 6 caractères
La chaîne la plus longue sera donc de la forme "XX,XXXX,XXXX\n" soient 13 caractères
Donc ton code Arduino est :
Variables
1 2 3 4 5 6
|
char buf[13]; // taille du buffer de lecture (max 13 caractères).
byte n;
String strA, strB, strC;
int A, B, C;
char *pch; |
loop :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
void loop
{
if (Serial.available() > 0) // nouvelles données sur le port série ?
{
// Lecture de la donnée reçue (max 13 caractères)
n = Serial.readBytesUntil('\n', buf, 13);
if (n > 0) // pas d'erreur ?
{
pch = strtok(buf, ","); // découper la chaîne reçue
strA = pch;
pch = strtok(NULL, ",");
strB = pch;
pch = strtok(NULL, ",");
strC = pch;
A = strA.toInt(); // conversion vers entier
B = strB.toInt();
C = strC.toInt();
// Debug (activer le moniteur Arduino)
Serial.println("Code=");
Serial.println(buf);
Serial.println(A);
Serial.println(B);
Serial.println(C);
// exécuter la fonction avec les paramètres voulus
pwm.setPWM(A,B,C);
}
}
} |
documentation sur la fonction strtok.
-----
Je doute juste sur un point : chr(10) est le code ASCII du retour chariot (LF), mais je ne sais pas si cela correspond bien au \n de C++.
Éventuellement tu peux choisir un autre caractère pour terminer ta chaine : "#" par exemple.
Du coup en VB :
MSComm1.Output = "a" & "," & "b" & "," & "c" & "#"
et dans le code C++ :
n = Serial.readBytesUntil('#', buf, 13);
-----
Attention dans la fonction readBytesUntil le paramètre est entre simples quotes : '#', mais pour strtock() ce sont des doubles quotes : ","
Partager