2016-04-22 20 views
0

ich in einer Bibliothek der folgende Methode verwenden Daten zu lesen von einem Bluetooth-Gerät kommen:Konsolenausgabe stoppt auf scanf() Methode in C++

BTSerialPortBinding::Read(buffer, length) 

Reads data from the bluetooth device, returns number of bytes read 

buffer: pointer to buffer to hold received data 
length: maximum namber of bytes to read 

Die Methode funktioniert gut, wenn ich printf("%s", incomingData); zur Ausgabe der Daten zur Konsole.

Allerdings, wenn ich (scanf(incomingData, "6,%d,%d,%d\r\n", &x, &y, &z) == 3) verwende, scheint die Konsole offen zu bleiben, gibt aber nichts aus, sobald sie diese Zeile versucht.

Die Daten stammen in kontinuierlich und sind in dieser Form als Beispiel:

6, 211, 233, 232; 
6, 392, 29, 93; 
6, 42, 82, 94; 

Ich suche die letzten drei Werte und speichern sie jeweils in einem int-Variable zu scannen und zu extrahieren. Unten ist mein Code, ich bin mit Windows 10 auf Visual Studio laufen 2015.

 char incomingData[256] = "";  
     int dataLength = 255; 
     int readResult = 0; 

     while (1) 
     { 
      readResult = bt->Read(incomingData, dataLength); 
      incomingData[readResult] = 0; 

      // this prints fine 
      printf("%s", incomingData); 

      int x, y, z; 

      //stuck here 
      if (scanf(incomingData, "6,%d,%d,%d\r\n", &x, &y, &z) == 3) { 

       printf("x:%d,y:%d,z:%d\n", x, y, z); 
      } 
      Sleep(500); 
     } 

Antwort

0

Sie sscanf() möchten, wenn Sie eine Zeichenfolge übergeben zu analysieren beabsichtigen, nicht scanf(), die funktioniert ein lesen aus dem Terminal, das heißt blockiert dass bis zu diesem Zeitpunkt nichts anderes passieren wird - was wahrscheinlich nicht der Fall ist, da Sie nicht erwartet haben, Daten auf dem Terminal zu liefern.

Eventuell müssen Sie auch plattformspezifisch einige Zeilenendezeichen berücksichtigen.

+0

'einige Gedanken in Linie Terminatoren, in einer plattformspezifischen Art und Weise.Was meinst du damit? Wenn ich das sowohl auf Mac als auch auf Windows kompilieren möchte wäre der obige Code mit sscanf() passend? Die Bibliothek, die ich verwende, unterstützt mehrere Plattformen. – Als

+0

Ich meine, dass es nicht nur Unterschiede in den Zeilenenden gibt, sondern Sie müssen auch auf Situationen achten, in denen niedrigere Ebenen versuchen, Ihnen "zu helfen", indem Sie diese Unterschiede verbergen. Nun, da ich mehr darüber nachdenke, ist es auch nicht klar, ob dein bt-> Read() - Aufruf dir notwendigerweise eine Zeile zurückgibt, nicht mehr und nicht weniger, und wenn dies nicht geschieht, kann das deine Analyse drastisch erschweren , auch. Normalerweise bekommt man, wenn man eine serielle Schnittstelle liest, alles, was angekommen ist, was das Ende einer alten Linie und einen Teil einer neuen beinhalten kann ... –