在 Arduino 编程中,String 类提供了一系列用于操作和处理字符串的函数。本文将详细介绍这些函数的用法,并结合实际示例,展示如何在 Arduino 项目中有效地使用这些函数。
目录
charAt()
substring()
toInt()
indexOf()
length()
toFloat()
- 三元运算符
- 综合示例:解析 G 代码
1. charAt()
charAt()
函数用于获取字符串中指定位置的字符。
语法:
char charAt(unsigned int index);
参数:
index
:要获取字符的位置,从 0 开始。
返回值:
- 返回指定位置的字符。
示例:
String line = "G1 X10 Y20";
char cmd = line.charAt(0); // cmd == 'G'
在上述示例中,charAt(0)
获取了字符串 line
的第一个字符,即命令类型 'G'。
2. substring()
substring()
函数用于从字符串中提取指定范围的子字符串。
语法:
String substring(unsigned int beginIndex);
String substring(unsigned int beginIndex, unsigned int endIndex);
参数:
beginIndex
:子字符串的起始索引(包含)。endIndex
:子字符串的结束索引(不包含)。
返回值:
- 返回从
beginIndex
到endIndex
的子字符串。
示例:
String line = "G1 X10 Y20";
String sub1 = line.substring(2); // sub1 == " X10 Y20"
String sub2 = line.substring(2, 5); // sub2 == " X1"
在第一个示例中,substring(2)
提取从索引 2 开始到字符串末尾的子字符串。在第二个示例中,substring(2, 5)
提取从索引 2 开始到索引 5 之前的子字符串。
3. toInt()
toInt()
函数用于将字符串转换为整数。
语法:
int toInt();
返回值:
- 返回字符串的整数值。如果字符串不包含有效的整数,将返回 0。
示例:
String str = "12345";
int num = str.toInt(); // num == 12345
在上述示例中,toInt()
将字符串 "12345" 转换为整数 12345。
4. indexOf()
indexOf()
函数用于查找字符串中指定字符或子字符串的位置,并返回其索引值。
语法:
int indexOf(char ch);
int indexOf(char ch, unsigned int fromIndex);
int indexOf(const String &str);
int indexOf(const String &str, unsigned int fromIndex);
参数:
ch
:要查找的字符。str
:要查找的子字符串。fromIndex
:开始查找的位置索引(可选)。如果未指定,则从字符串开头开始查找。
返回值:
- 找到时返回第一个匹配字符或子字符串的索引。
- 如果未找到,返回 -1。
示例:
String text = "Hello, Arduino!";
int index1 = text.indexOf('A'); // index1 == 7
int index2 = text.indexOf('o', 5); // index2 == 8
int index3 = text.indexOf("Arduino"); // index3 == 7
int index4 = text.indexOf('z'); // index4 == -1
在上述示例中,indexOf('A')
返回字符 'A' 在字符串中的位置,indexOf('o', 5)
从索引 5 开始查找字符 'o',indexOf("Arduino")
查找子字符串 "Arduino",indexOf('z')
返回 -1,因为字符串中没有字符 'z'。
5. length()
length()
函数用于获取字符串的长度(字符数)。
语法:
unsigned int length();
返回值:
- 返回字符串中的字符数。
示例:
String str = "Hello";
unsigned int len = str.length(); // len == 5
在上述示例中,length()
返回字符串 "Hello" 的长度,即 5。
6. toFloat()
toFloat()
函数用于将字符串转换为浮点数。
语法:
float toFloat();
返回值:
- 返回字符串的浮点数值。如果字符串不包含有效的浮点数,将返回 0.0。
示例:
String str = "123.45";
float num = str.toFloat(); // num == 123.45
在上述示例中,toFloat()
将字符串 "123.45" 转换为浮点数 123.45。
7.(补充)三元运算符
三元运算符(? :
)是一个条件运算符,允许在一行代码中简洁地表达条件判断和选择。
语法:
condition ? expression_if_true : expression_if_false;
参数:
condition
:要评估的条件表达式。expression_if_true
:条件为真时执行的表达式。expression_if_false
:条件为假时执行的表达式。
示例:
int a = 10;
int b = 20;
int max = (a > b) ? a : b; // max == 20
在上述示例中,三元运算符检查条件 a > b
是否为真。如果为真,则返回 a
的值;否则,返回 b
的值。
8. 综合示例:解析 G 代码
以下示例展示了如何结合使用 Arduino String 类函数和三元运算符来解析一行 G 代码并提取其中的参数:
void setup() {
Serial.begin(9600);
String line = "G1 X10 Y20 Z30";
char cmd = line.charAt(0); // 获取命令类型 'G'
int value = line.substring(1).toInt(); // 获取命令值 1
float x = 0.0, y = 0.0, z = 0.0, f = 0.0;
int spaceIndex = line.indexOf(' ');
while (spaceIndex != -1) {
char param = line.charAt(spaceIndex + 1);
int nextSpaceIndex = line.indexOf(' ', spaceIndex + 1);
String paramValue = (nextSpaceIndex == -1) ? line.substring(spaceIndex + 2) : line.substring(spaceIndex + 2, nextSpaceIndex);
float paramVal = paramValue.toFloat();
switch (param) {
case 'X':
x = paramVal;
break;
case 'Y':
y = paramVal;
break;
case 'Z':
z = paramVal;
break;
case 'F':
f = paramVal;
break;
}
spaceIndex = nextSpaceIndex;
}
if (cmd == 'G') {
switch (value) {
case 0:
// 处理 G0 指令
break;
case 1:
// 处理 G1 指令
break;
}
} else if (cmd == 'M') {
switch (value) {
case 3:
// 处理 M3 指令
break;
case 5:
// 处理 M5 指令
break;
}
}
}
void loop() {
// 空循环
}
在这个综合示例中,parse_line
函数通过解析一行 G 代码,提取命令类型、命令值以及参数,并根据命令类型和值执行相应的操作。该函数展示了如何使用 charAt()
、substring()
、toInt()
、indexOf()
和 toFloat()
函数,以及如何使用三元运算符来简化条件判断。