2017-03-21 14 views
-3

Ich versuche, ein paar ganze Zahlen aus einer Zeichenfolge auf Arduino zu extrahieren. Ich verwende ein Bluefruit-Bluetooth-Modul, das ich mit meinem Mobiltelefon verbunden habe.Ints aus einer Zeichenfolge extrahieren

Eine Anwendung auf meinem Telefon sendet eine Zeichenfolge von Daten an den Arduino über den TX/RX der Bluefruit.

Ich erhalte erfolgreich die Daten von der Anwendung, und ich kann es in meinem seriellen Monitor auf meinem Computer sehen. Die Zeichenfolgen haben folgendes Format: x:xxx,xxx,xxx, wobei die erste Zahl 1 bis 6 ist und die anderen Zahlen drei 0-255.

So zum Beispiel: 1:171,54,201

Die Zeichenfolge enthält auch einen Wagenrücklauf, da die nächste Saite auf eine neue Zeile beginnt immer.

Kann mir jemand helfen, diese ganzen Zahlen zu extrahieren und sie auf Variablen zu setzen?

+3

Was haben Sie bisher versucht? – Trevor

Antwort

1

Sie können die C sscanf() Funktion:

#include <stdio.h> 

char line[] = "1:171,54,201"; // read a line from Bluetooth 
int num1, num2, num3, num4; 

if (sscanf(line, "%d:%d,%d,%d", &num1, &num2, &num3, &num4) == 4) 
{ 
    // use numbers as needed 
} 

oder die C++ Wrapper, std::sscanf():

#include <cstdio> 

char line[] = "1:171,54,201"; // read a line from Bluetooth 
int num1, num2, num3, num4; 

if (std::sscanf(line, "%d:%d,%d,%d", &num1, &num2, &num3, &num4) == 4) 
{ 
    // use numbers as needed 
} 

Wenn Sie eine STL zur Verfügung haben (was anscheinend Arduino nicht), könnten Sie die STL std::istringstream Klasse stattdessen:

#include <string> 
#include <sstream> 

std::string line = "1:171,54,201"; // read a line from Bluetooth 
int num1, num2, num3, num4; 

std::istringstream iss(line); 
char ignore; 

if (iss >> num1 >> ignore >> num2 >> ignore >> num3 >> ignore >> num4) 
{ 
    // use numbers as needed 
} 

Alternativ:

#include <string> 
#include <sstream> 

bool readInt(std::istream &in, char delim, int &value) 
{ 
    std::string temp; 
    if (!std::getline(in, temp, delim)) return false; 
    return (std::istringstream(temp) >> value); 
} 

std::string line = "1:171,54,201"; // read a line from Bluetooth 
int num1, num2, num3, num4; 

std::istringstream iss(line); 

if (readInt(iss, ':', num1) && readInt(iss, ',', num2) && readInt(iss, ',', num3) && readInt(iss, '\n', num4)) 
{ 
    // use numbers as needed 
} 
+0

Das scheint eine gute Lösung zu sein. Ich versuche es gerade jetzt, aber ich habe das Problem, dass es sagt, dass String nicht ein Teil von Std ist. Auch ich kann nicht einschließen Ich aktualisiere Arduino IDE, um zu sehen, ob das das Problem löst. –

+0

@Lucavanderknaap Arduino "C++" ist nicht wirklich "C++" es ist eher wie eine eingeschränkte Teilmenge/Dialekt. Die STL ist nicht auf Arduino von den Anbietern verfügbar, es gibt jedoch kleine, eingeschränkte Implementierungen für Mikrocontroller da draußen. – user2176127

+0

@RemyLebeau Ich habe .h zu string hinzugefügt und jetzt enthält es es, aber ich habe immer noch den Fehler, dass "string ist kein Mitglied von Std" –

0

Mit einer schnellen Google-Suche von einem ähnlichen Problem, entdeckte ich an example, wie eine Zeichenfolge IP-Adresse in Zahlen mit dem folgenden Code konvertieren:

std::string ip ="192.168.1.54"; 
std::stringstream s(ip); 
int a,b,c,d; //to store the 4 ints 
char ch; //to temporarily store the '.' 
s >> a >> ch >> b >> ch >> c >> ch >> d; 

Da jedoch Ihr Problem

std::string givenExample = "1:171,54,201" 

//Since it is known that the value will be 1-6, just take 
//the ASCII value minus 30 hex (or '0') to get the actual value. 
int firstNumber = ((int)givenExample.at(0) - 0x30); //or minus '0' 

givenExample.erase(0, 2); //Remove "1:" from the string 

std::stringstream s(givenExample); 
int secondNumber, thirdNumber, fourthNumber; 
char ch; 
s >> secondNumber >> ch >> thirdNumber >> ch >> fourthNumber; 

wenn Sie jedoch das erste Beispiel mit dem zweiten vergleichen, ist das IP-String in fast th: ist „etwas“ anders, könnten Sie folgendes tun Das gleiche Format wie in Ihrem Beispiel: 4 Zeichen getrennt durch Zeichen. Also werden beide funktionieren, je nachdem, was dir mehr Sinn macht.

So weit, wie Sie diese Daten lesen werden (Umgang mit dem Wagenrücklauf), hängt das von Ihrer Schnittstelle zu dem seriellen Datenstrom ab, der von Arduino empfangen wird.

+0

'int firstNumber = (int) givenExample.at (0);' wird firstNumber 49 enthalten ist das erste Zeichen '1'. Extrahieren Sie die Nummer '48' daraus (oder '0') – Fureeish

+0

Guten Ruf, danke! Ich habe meine Antwort aktualisiert. – Trevor

+0

Leider gibt es keine AWL auf Arduino, also kann ich das nicht verwenden. Danke trotzdem –

Verwandte Themen