2016-12-30 1 views
0

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!

Répondre

0

Comme suggèrent que le message "How do I flush the cin buffer?", le problème se trouve après votre code std::cin.get(command, 2);. Les caractères supplémentaires restent dans le std::cin et sont réutilisés directement lors du prochain appel. Et le premier caractère supplémentaire est '\n' (touche Entrée) et le std::cin.get() renverra 0.

La meilleure solution est d'ignorer les caractères supplémentaires après l'obtention de la commande.

std::cout << "Enter your command: "; 
std::cin.get(command, 2);  //input command 
std::cin.clear(); // to reset the stream state 
std::cin.ignore(INT_MAX,'\n'); // to read and ignore all characters except 'EOF' 
int msglen = strlen(command); 

Au lieu de

std::cout << "Enter your command: "; 
std::cin.get(command, 2);  //input command 
int msglen = strlen(command); 
+0

Merci! Ça marche!! – Vera

+0

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

+0

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] ] = ""; '. –