我试图从Arduino上的字符串中提取几个整数。我使用的Bluefruit蓝牙模块已经链接到我的手机上。
我的手机上的应用程序通过Bluefruit的TX / RX向Arduino发送一串数据。
我成功地从应用程序接收数据,我可以在计算机上的串行监视器中看到它。字符串采用以下格式:x:xxx,xxx,xxx
,第一个数字为1到6,其他数字为3到0-255。
例如:1:171,54,201
该字符串还包括一个回车符,因为下一个字符串总是从一个新行开始。
任何人都可以帮我提取这些整数并将它们设置为变量吗?
答案 0 :(得分:1)
您可以使用C sscanf()
功能:
#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
}
或C ++包装器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
}
如果您有可用的STL(显然Arduino没有),您可以使用STL std::istringstream
类代替:
#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
}
可替换地:
#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
}
答案 1 :(得分:0)
通过快速谷歌搜索类似的问题,我发现an example如何使用以下代码将字符串IP地址转换为数字:
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;
但是,由于您的问题“略有”不同,您可以执行以下操作:
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;
但是,如果将第一个示例与第二个示例进行比较,则ip字符串的格式与示例几乎相同:4个以字符分隔的整数。所以两者都会起作用,取决于哪一个对你更有意义。
至于你将如何读取数据(处理回车),这取决于你从Arduino收到的串行数据流的接口。