2017-07-07 4 views
0

Ich arbeite an einem C++ - Programm, um mit einem Arduino zu kommunizieren, das ein automatisiertes System ausführt. Ich benutze die serielle Bibliothek von dieser:Arduino zu C++ Seriell liest Gibberish [Gelöst]

https://playground.arduino.cc/Interfacing/CPPWindows

Ich versuche, die Arduino eine Zeichenfolge zu senden, die sie dann in einen Befehl analysieren, die es wird zeigen, wie das System bewegen soll. Der Code für den Befehl von der seriellen Lesen ist dies:

`Leere serialEvent() {

while (Serial.available()) { 
    char in = (char)Serial.read(); 
    input.concat(in); 
    } 
    int endChar = input.indexOf('\r'); 
    if (endChar != -1) { 
    //inputLog.concat(input); 
    //inputLog.concat('\n'); 
    String command = input.substring(0,endChar); 
    command.toLowerCase(); 
    input.remove(0, endChar+1); 
    String keyword = command.substring(0,4); 
    if(keyword == "move"){ 
      int i = command.indexOf('x'); 
      if (i != -1) { 
      endChar = command.indexOf(i, ','); 
      xMove = command.substring(i + 1, endChar).toFloat(); 
      } 
      i = command.indexOf('y'); 
      if (i != -1) { 
      endChar = command.indexOf(i, ','); 
      yMove = command.substring(i + 1, endChar).toFloat(); 
      } 
    } else if (keyword == "stop") { 
     xMove = 0; 
     yMove = 0; 
    } else if (keyword == "xpos") { 
     Serial.print("X: "); 
     Serial.println(xPos); 
    } else if (keyword == "ypos") { 
     Serial.print("Y: "); 
     Serial.println(yPos); 
    } else if (keyword == "getp") { 
     Serial.print("X: "); 
     Serial.print(xPos); 
     Serial.print(", Y: "); 
     Serial.println(yPos); 
    } else if (keyword == "setx") { 
     xPos = command.substring(4).toFloat(); 
    } else if (keyword == "sety") { 
     yPos = command.substring(4).toFloat(); 
    } else if (keyword == "setp") { 
     int i = command.indexOf('x'); 
      if (i != -1) { 
      endChar = command.indexOf(i, ','); 
      xPos = command.substring(i + 1, endChar).toFloat(); 
      } 
      i = command.indexOf('y'); 
      if (i != -1) { 
      endChar = command.indexOf(i, ','); 
      yPos = command.substring(i + 1, endChar).toFloat(); 
      } 
    } else if (keyword == "getl") { 
     Serial.println(inputLog); 
     inputLog = ""; 
    } else { 
     Serial.println("error: 1"); 
     return; 
    } 
    Serial.println("ok\r"); 
    //Serial.print(nc); 
    } 

}`

Dieser Teil richtig zu sein scheint laufen, weil ich es mit der laufen kann Arduino Serial Monitor und es funktioniert. Hier ist ein kurzer Test des Codes I in C geschrieben ++:

while (SP->IsConnected()) 
{ 
    string outputData = ""; 
    cin >> outputData; 
    outputData.append(pcr); 
    //outputData.append(pnc); 
    writeResult = SP->WriteData((char*)outputData.c_str(), outputData.length()); 
    //writeResult = writeResult && SP->WriteData(pnc, 1); 
    //writeResult = writeResult & SP->WriteData(pcr, 1); 

    while (true) { 
     Sleep(500); 
     char incomingData[256] = ""; 
     readResult = SP->ReadData(incomingData, dataLength); 
     //printf("Bytes read: (0 means no data available) %i\n", readResult); 
     //incomingData[readResult] = 0; 
     input.append(incomingData, 0, readResult); 

     check_ok = input.find(pcr); 
     check_error = input.find(error); 

     if (check_ok != string::npos || check_error != string::npos || readResult == 0) { 
      cout << "Receiving: " << input << '\n'; 
      input.clear(); 
      break; 
     } 
    } 
} 

Die Variable, pcr definiert ist früher in den Code als ein Zeiger auf den Wagenrücklaufzeichen, welche die Arduino verwendet das Ende eines Befehls zu identifizieren, . Meine Ergebnisse der Ausführung dieses Codes ist, dass der Arduino den ersten Befehl zu lesen und auszuführen scheint; Es liest jedoch auch mehrere Kauderwelsch-Zeichen aus, von denen die meisten als numerischer Wert -52 entsprechen. Alle folgenden Befehle scheinen nichts zu tun und der Arduino erhält weiterhin die Kauderwelsch-Zeichen. Außerdem scheint es, dass die ReadData-Funktion in C++ gut funktioniert. Weiß jemand, warum das passiert? Wird der serielle Puffer des Arduino von der WriteData-Funktion irgendwie beschädigt?

EDIT:

I erscheinen, um das Problem gefunden zu haben. Die Anweisung outputData (pcr) muss outputData (pcr, 0, 1) sein, da der Zeiger nicht null terminiert. Daher fügte die Zeichenfolge zusätzliche Zeichen hinzu, bis ein Nullzeichen erreicht wurde. Danke für die Kommentare und Antworten.

+0

Haben Sie die serielle Schnittstelle richtig eingerichtet? Korrekte Baudrate, Endzeichen, sowas? Normalerweise bedeutet ein Kauderwelse-Ausgang zu einem seriellen Monitor eine schlechte Baudrate –

+0

Nein, es ist keine schlechte Baudrate. Es liest immer noch alles kohärent vor. Es ist nur, dass es Kauderwelsch am Ende der Daten hinzufügt, dass ich das Arduino sende. –

+0

Okay, das ist gut. Haben Sie überprüft, ob die Stopp-Bit-, Paritäts- und Newline-Zeichen richtig konfiguriert sind? –

Antwort

0

Wie lang ist Ihre Datenleitung? Verwenden Sie TTL-Ebenen, um die Daten zu senden oder nicht? Wenn Ihre Leitung länger als mehrere Meter ist und Sie TTL-Level-Kommunikation (Routing-Leitungen direkt zwischen Geräten) verwenden, dann werden Sie auf jeden Fall Müll von anderen Geräten erhalten. Bei langen Kommunikationsleitungen sollten stattdessen RS232 oder RS485 verwendet werden, die speziell dafür ausgelegt sind.