J'utilise Arduino et Visual Studio C++ et essaye de construire une communication série bidirectionnelle en temps réel. Ce que j'utilise c'est win 10 (dans VMware Fusion), système 32 bits, visual studio 2013, Arduino IDE 1.8.0 et Arduino board Uno.arduino et visual studio C++, communication série bidirectionnelle
J'ai utilisé les fichiers de bibliothèque de http://playground.arduino.cc/Interfacing/CPPWindows, qui sont deux fichiers: SerialClass.h et Serial.cpp. Et j'utilise readData() et WriteData() fonction dans ma main.
Je veux l'exécuter encore quelques fois, l'utilisateur peut donner une entrée dans la console et Arduino va générer une sortie en conséquence. Mais quand j'ai ajouté la boucle while, cela ne fonctionne pas correctement.
Ci-dessous mon main.cpp: (avec boucle while en ligne de commentaire)
int main() {
Serial* port = new Serial("COM3");
if (port->IsConnected()) cout << "Connected!" << endl;
char data[4] = "";
char command[2] = "";
int datalength = 4; //length of the data,
int readResult = 0;
int n;
for (int i = 0; i < 4; ++i) { data[i] = 0; } //initial the data array
//read from user input
//this is where I added while loop
// while(1){
std::cout << "Enter your command: ";
std::cin.get(command, 2); //input command
int msglen = strlen(command);
if (port->WriteData(command, msglen)); //write to arduino
printf("\n(writing success)\n");
//delay
Sleep(10);
//read from arduino output
n = port->ReadData(data, 4);
if (n != -1){
data[n] = 0;
cout <<"arduino: " data << endl;
}
// }
system("pause");
return 0;
}
et mon code arduino:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial.available() > 0) {
char c = Serial.read();
if (c == '1')
Serial.write("10");
else if (c == '2')
Serial.write("20");
else if (c == '3')
Serial.write("30");
else
Serial.write("Invalid");
}
}
Et si je lance mon code sans en boucle, je peux obtenir ce que je veux:
Connection established!!!
Enter your command: 1
arduino: 10
Mais quand ajouter en boucle, il passe pour demander une entrée, et ma sortie devient:Après avoir essayé quelques solutions, je pense que ce pourrait être des données de tampon [] et de la commande [], je ne l'ai pas vide avant la prochaine exécution. Mais je l'ai essayé avec
memset(data,0,4);
ou
data[4]='\0';
Mais il ne fonctionne toujours pas et sauter pour demander l'entrée. Toute suggestion comment puis-je le résoudre? Merci!
Merci! Ça marche!! – Vera
Encore un problème ... Quand j'ai essayé de connecter arduino en utilisant bluetooth, HC-05, ça marche bien sur le moniteur série Arduino ,, mais si j'utilise visual studio pour se connecter (même si j'ai choisi le bon port COM), ne peut pas donner une sortie correcte, et montre également une erreur: _Exception non gérée à 0x00CD7037 dans Arduino2.exe: Le code d'instrumentation RangeChecks a détecté un accès au tableau hors de portée._ N'avez-vous aucune idée de pourquoi cela se produit? Merci d'avance ... – Vera
Dans le code source fourni, il y a 'char data [4] =" ";' suivi de 'n = port-> ReadData (data, 4);' et data [n] = 0; 'ce qui signifie que dans le cas de' n = 4', la dernière 'data [n] = 0;' est hors limites ... Alors essayez de changer la taille de la chaîne de données ==> 'char data [5] ] = ""; '. –