# 6. 其他常用库 ## 6.1 Arduino String.h 字符串解析函数库 ### API参考 #### String() - 构造String类的实例 有多种版本可以从不同的数据类型构造字符串(即,将它们格式化为字符序列),包括: - 常量字符串,用双引号引起来(即char数组) - 单个常量字符,用单引号引起来 - String对象的另一个实例 - 常数整数或长整数 - 一个常数整数或长整数,使用指定的基数 - 整数或长整数变量 - 整数或长整数变量,使用指定的底数 - 浮点数或双精度数,使用指定的小数位 根据数字构造字符串会导致包含该数字的ASCII表示形式的字符串。默认值为十进制,因此 ```c++ String thisString = String(13); ``` 获得字符串“ 13”。但是,您可以使用其他基准。例如, ```c++ String thisString = String(13, HEX); ``` 获得字符串“ D”,它是十进制值13的十六进制表示形式。或者,如果您希望使用二进制, ```c++ String thisString = String(13, BIN); ``` 获得字符串“ 1101”,它是13的二进制表示形式。 **语法** ```c++ String(val) String(val, base) String(val, decimalPlaces) ``` **例子代码** ```c++ String stringOne = "Hello String"; // using a constant String String stringOne = String('a'); // converting a constant char into a String String stringTwo = String("This is a string"); // converting a constant string into a String object String stringOne = String(stringTwo + " with more"); // concatenating two strings String stringOne = String(13); // using a constant integer String stringOne = String(analogRead(0), DEC); // using an int and a base String stringOne = String(45, HEX); // using an int and a base (hexadecimal) String stringOne = String(255, BIN); // using an int and a base (binary) String stringOne = String(millis(), DEC); // using a long and a base String stringOne = String(5.698, 3); // using a float and the decimal places ``` **参数** | 参数 | 说明 | 值范围 | | :-----------: | :----------------------------------------------------------: | :----: | | val | 要格式化为字符串的变量。允许的数据类型:字符串,字符,字节,整数,长整数,无符号整数,无符号长整数,浮点数,双精度数。 | | | base | (可选)格式化整数值的基础 | | | decimalPlaces | 仅当val为float或double时。所需的小数位。 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------: | :----: | | String | String类的一个实例 | | #### charAT() - 获取字符串的第n个字符 **语法** ```c++ myString.charAt(n) ``` **参数** | 参数 | 说明 | 值范围 | | :--: | :-----------------------------------------: | :----: | | n | 第n个字符的索引,数据类型:`unsigned int`。 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :---------------: | :----: | | | 字符串的第n个字符 | | #### compareTo() - 比较两个字符串 比较两个字符串,测试一个字符串在另一个字符串之前还是之后,或者它们是否相等。使用字符的ASCII值逐个字符地比较字符串。例如,这意味着“ a”在“ b”之前但在“ A”之后。数字先于字母。 **语法** ```c++ myString.compareTo(myString2) ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :----------: | :----: | | myString | 第一个字符串 | | | str2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | | `正数`: 如果myString在myString2之前。
`0`: if 如果myString等于myString2.
`负数`: 如果myString在myString2之后. | | compareTo()的返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度。 #### concat() - 字符串拼接 字符串拼接,其实在C++语言中字符串拼接可以直接让前字符串 + 后字符串 **语法** ```c++ myString.concat(parameter) ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------------------------------------------------------: | :----: | | myString | 类型的变量`String` | | | parameter | 允许的数据类型:`String`,`string`,`char`,`byte`,`int`,`unsigned int`,`long`,`unsigned long`,`float`,`double`,`__FlashStringHelper`(`F()` macro)。 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`: 成功
`false`: 失败(在这种情况下,字符串保持不变)。 | | #### c_str() - 将String的内容转换为C样式 将String的内容转换为C样式,以null终止的字符串。请注意,这可以直接访问内部String缓冲区,因此应谨慎使用。特别是,永远不要通过返回的指针修改字符串。当您修改String对象或将其销毁时,以前由c_str()返回的任何指针都将变为无效,并且不应再使用。 **语法** ```c++ myString.c_str() ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------------: | :----: | | myString | `String`类型的变量。 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :-------------------------------- | ------ | | | 指向调用字符串的C样式版本的指针。 | | #### endsWith() - 字符串尾部判断对比 字符串尾部判断对比,判断str1尾部是否是字符串str2,当然你也可以用它来判断'\n' **语法** ```c++ myString.endsWith(myString2) ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------: | :----: | | myString | 第一个字符串 | | | myString2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`:如果myString以myString2的字符结尾。
`false`: 除此以外 | | #### equals() - 判断字符串是否相等 比较两个字符串是否相等。比较是区分大小写的,这意味着字符串“ hello”不等于字符串“ HELLO”。 **语法** ```c++ myString.equals(myString2) ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------: | :----: | | myString | 第一个字符串 | | | myString2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :------------------------------------------------------- | :----: | | bool | `true`:如果string等于string2。
`false`: 除此以外。 | | #### equalslgnoreCase() - 判断字符串是否相等,忽略大小写 **语法** ```c++ myString.equalsIgnoreCase(myString2) ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------: | :----: | | myString | 第一个字符串 | | | myString2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`:如果myString等于myString2(忽略大小写)。
`false`: 除此以外。 | | #### str1.getBytes() - 字符串的复制 将字符串的字符复制到提供的缓冲区中。和函数 toCharArray()功能非常相识。 参数 string1:原本的字符串 buf:要搬移的目的变量 len:字符串长度 **语法** ```c++ myString.getBytes(buf, len) ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------------------------------------------: | :----: | | myString | 原本的字符串 | | | buf | 将字符复制到的缓冲区。允许的数据类型:`byte`数组。 | | | len | 缓冲区的大小。允许的数据类型:`unsigned int`。 | | **返回** 无 #### indexOf() - 在字符串中选择特定的字符 在另一个字符串中找到一个字符或字符串。默认情况下,搜索从String的开头开始,但也可以从给定的索引开始。如果你想在一个很长的字符串中查找这个特别的关键字,可以使用这个函数。 **语法** ```c++ myString.indexOf(val) myString.indexOf(val, from) ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------------------------------------------------: | :----: | | myString | 原本的字符串 | | | val | 要搜索的值。允许的数据类型:`char`,`String`。 | | | from | 选择性参数,你可以特别指定从那个位置开始寻找这个关键字。 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :------------------------------------ | :----: | | | 字符串中val的索引,如果未找到则为-1。 | | #### lastlndexOf() - 另一个字符串中找到一个字符或字符串 在另一个字符串中找到一个字符或字符串。默认情况下,搜索从String的末尾开始,但是也可以从给定的索引向后进行搜索,从而可以定位字符或String的所有实例。和indexOf一样,只不过是反向查找。 **语法** ```c++ myString.lastIndexOf(val) myString.lastIndexOf(val, from) ``` **参数** | 参数 | 说明 | 值范围 | | :--: | :------------------------------------------------------: | :----: | | val | 要搜索的值。允许的数据类型:`char`,`String` | | | from | 选择性参数,你可以特别指定从那个位置开始寻找这个关键字。 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :------------------------------------ | :----: | | | 字符串中val的索引,如果未找到则为-1。 | | #### length() - 测量字符串长度 测量字符串长度,返回字符串的长度(以char为单位)。(请注意,这不包括结尾的空字符。) 参数 str1:被测字符串变量 返回值 字符串长度 **语法** ```c++ myString.length() ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------: | :----: | | myString | 被测字符串变量 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------- | :----: | | | 字符串长度,以char为单位 | | #### remove() - 修改字符串 修改字符串,从提供的索引到字符串的末尾或从提供的索引到索引加计数的字符除去字符。 **语法** ```c++ myString.remove(index) myString.remove(index, count) ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :----------------------------------------------------------: | :----: | | myString | String类型变量 | | | index | 开始删除过程的位置(零索引)。允许的数据类型:`unsigned int`。 | | | count | 要删除的字符数。允许的数据类型:`unsigned int`。 | | **返回** 无 #### replace() - 字符串替换 字符串replace()函数允许您将给定字符的所有实例替换为另一个字符。您也可以使用replace将String的子字符串替换为其他子字符串。 **语法** ```c++ myString.replace(substring1, substring2) ``` **参数** | 参数 | 说明 | 值范围 | | :--------: | :------------------------: | :----: | | myString | 原本的字符串 | | | substring1 | 在字符串中欲被替换的字符串 | | | substring2 | 要替换之后的新字符串 | | **返回** 无 #### reserve() - 预定缓冲区 字符串reserve()函数使您可以在内存中分配一个缓冲区来处理字符串。 **语法** ```c++ myString.reserve(size) ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :----------------------------------------------------------: | :----: | | myString | String类型变量 | | | size | 要为String操作保存的内存中的字节数。允许的数据类型:`unsigned int`。 | | **返回** 无 #### setCharAt() - 字符替换 **语法** ```c++ myString.setCharAt(index, c) ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :--------------------------------------------: | :----: | | myString | 原本的字符串。 | | | index | 字符串中欲被换掉的字符的位置。 | | | c | 要替换的字符,注意只有一个字符,而不是字符串。 | | **返回** 无 #### startsWith() - 判断字符串是否已某个特殊的字符串开始的 **语法** ```c++ myString.startsWith(myString2) ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :--------------------------: | :----: | | myString | 原本的字符串。 | | | myString2 | 判断是不是已这个字符串开始。 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`:如果myString以myString2的字符开头。
`false`: 除此以外 | | #### substring() - 截取字符串 用来截取字符串中间的某一位置。起始索引是包含的(相应的字符包含在子字符串中),但可选的结束索引是专有的(相应的字符不包含在子字符串中)。如果省略了结束索引,则子字符串将继续到String的末尾。 **语法** ```c++ myString.substring(from); // 返回 from 之后的 myString.substring(from, to); // 返回 from 和 to 之间的 ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :----------------------------: | :----: | | myString | 原本的字符串 | | | from | 开始于子字符串的索引 | | | to | (可选):结束子字符串的索引。 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :------- | :----: | | | 子字符串 | | #### toCharArray() - 将字符串的字符复制到提供的缓冲区中 将字符串的字符复制到提供的缓冲区中。toCharArray函数是字符串处理中常用的一个函数,你可以把他当成string转char[]的转换函数,或者复制文字的函数,他的功能和getBytes()非常相似,toCharArray()函数转换后是呈现文字,而getBytes()函数转换后是呈现数字。 **语法** ```c++ myString.toCharArray(buf, len) ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :----------------------------------------------------------: | :----: | | myString | 原本的字符串。 | | | buf | 将字符复制到的缓冲区。允许的数据类型:`char`数组。
注意char[]的空间,一定要等于或大于复制的大小,不然存储器和程序都会产生不可预期的问题。 | | | len | 缓冲区的大小。允许的数据类型:`unsigned int`。 | | **返回** 无 #### toDouble() - 将有效的String转换为double 将有效的String转换为double。输入的字符串应以数字开头。如果字符串包含非数字字符,则该函数将停止执行转换。例如,字符串“ 123.45”,“ 123”和“ 123fish”分别转换为123.45、123.00和123.00。注意,“ 123.456”近似于123.46。还要注意,浮点数的精度只有6-7个十进制数字,较长的字符串可能会被截断。 **语法** ```c++ myString.toDouble() ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------: | :----: | | myString | 待转换的字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | double | double浮点数。如果由于字符串不是以数字开头而无法执行有效的转换,则返回零。 | | #### toInt() - 字符串转成int整数 将有效的String转换为整数。输入的String应该以整数开头。如果字符串包含非整数,则该函数将停止执行转换。 **语法** ```c++ myString.toInt() ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------: | :----: | | myString | 待转换的字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | long | long型整数,如果由于字符串不是以整数开头而无法执行有效的转换,则返回零。 | | #### toFloat() - 将有效的String转换为float 将有效的String转换为float。输入的字符串应以数字开头。如果字符串包含非数字字符,则该函数将停止执行转换。例如,字符串“ 123.45”,“ 123”和“ 123fish”分别转换为123.45、123.00和123.00。注意,“ 123.456”近似于123.46。还要注意,浮点数的精度只有6-7个十进制数字,较长的字符串可能会被截断。 **语法** ```c++ myString.toFloat() ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------: | :----: | | myString | 待转换的字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | float | float型浮点数,如果由于字符串不是以数字开头而无法执行有效的转换,则返回零。 | | #### toLowerCase() - 把英文全部转换成小写 直接在原字符串上进行修改。 **语法** ```c++ myString.toLowerCase() ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------: | :----: | | myString | 待转换的字符串 | | **返回** 无 #### toUpperCase() - 把英文全部转换成大写 直接在原字符串上进行修改。 **语法** ```c++ myString.toUpperCase() ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------: | :----: | | myString | 待转换的字符串 | | **返回** 无 #### trim() - 清除字符串空格 自动清除字符串中最前面和最后面的空格数据。 **语法** ```c++ myString.trim() ``` **参数** | 参数 | 说明 | 值范围 | | :------: | :------------: | :----: | | myString | 待转换的字符串 | | **返回** 无 ### 字符串运算符 #### 运算符 [](元素访问) 允许您访问字符串的各个字符。 **语法** ```c++ char thisChar = myString1[n] ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------------------: | :----: | | thisChar | 允许的数据类型:字符。 | | | myString1 | 允许的数据类型:字符串。 | | | n | `n`:数字变量。 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :------------------------------------ | :----: | | | 字符串的第n个字符。与charAt()相同。 | | #### 运算符 +(串联) 将两个字符串组合或连接成一个新的字符串。第二个String附加到第一个String,结果放置在新的String中。与string.concat()相同。 **语法** ```c++ myString3 = myString1 + myString2 ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :------------------------: | :----: | | myString1 | 第一个字符串 | | | myString2 | 第二个字符串 | | | myString3 | 第三个字符串,相加后的结果 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------- | :----: | | | 新字符串,它是原始两个字符串的组合。 | | #### 运算符 + =(追加) 它将字符串与其他数据连接在一起。 **语法** ```c++ myString1 += data ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :------------: | :----: | | myString1 | 一个String变量 | | **返回** 无 #### 运算符 ==(比较) 比较两个字符串是否相等。比较是区分大小写的,这意味着字符串“ hello”不等于字符串“ HELLO”。在功能上与string.equals()相同 **语法** ```c++ myString1 == myString2 ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------: | :----: | | myString1 | 第一个字符串 | | | myString2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`:如果myString1等于myString2。
`false`: 除此以外。 | | #### 运算符 >(大于) 测试左侧的字符串是否大于右侧的字符串。该运算符在两个不同的第一个字符上按字母顺序评估字符串。因此,例如“ b”>“ a”和“ 2”>“ 1”,但是“ 999”>“ 1000”,因为9在1之后。 注意:比较数字字符串时,字符串比较运算符可能会造成混淆,因为数字被视为字符串而不是数字。如果需要数字比较数字,则将它们比较为int,float或long,而不要比较为String。 **语法** ```c++ myString1 > myString2 ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------: | :----: | | myString1 | 第一个字符串 | | | myString2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`:如果myString1大于myString2。
`false`: 除此以外。 | | #### 运算符 > =(大于或等于) 测试左侧的String是否大于或等于右侧的String。该运算符在两个不同的第一个字符上按字母顺序评估字符串。因此,例如“ b”> =“ a”和“ 2”> =“ 1”,但是“ 999”> =“ 1000”因为9在1之后。 注意:比较数字字符串时,字符串比较运算符可能会造成混淆,因为数字被视为字符串而不是数字。如果需要数字比较数字,则将它们比较为int,float或long,而不要比较为String。 **语法** ```c++ myString1 >= myString2 ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------: | :----: | | myString1 | 第一个字符串 | | | myString2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`:如果myString1大于或等于myString2。
`false`: 除此以外。 | | #### 运算符 <(小于) 测试左侧的字符串是否小于右侧的字符串。该运算符在两个不同的第一个字符上按字母顺序评估字符串。因此,例如“ a” <“ b”和“ 1” <“ 2”,但是“ 999”>“ 1000”因为9在1之后。 注意:比较数字字符串时,字符串比较运算符可能会造成混淆,因为数字被视为字符串而不是数字。如果需要数字比较数字,则将它们比较为int,float或long,而不要比较为String。 **语法** ```c++ myString1 < myString2 ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------: | :----: | | myString1 | 第一个字符串 | | | myString2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`:如果myString1小于myString2。
`false`: 除此以外。 | | #### 运算符 <=(小于或等于) 测试左侧的String是否小于或等于右侧的String。该运算符在两个不同的第一个字符上按字母顺序评估字符串。因此,例如“ a” <“ b”和“ 1” <“ 2”,但是“ 999”>“ 1000”因为9在1之后。 注意:比较数字字符串时,字符串比较运算符可能会造成混淆,因为数字被视为字符串而不是数字。如果需要数字比较数字,则将它们比较为int,float或long,而不要比较为String。 **语法** ```c++ myString1 ⇐ myString2 ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------: | :----: | | myString1 | 第一个字符串 | | | myString2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`:如果myString1小于或等于myString2。
`false`: 除此以外。 | | #### 运算符 !=(不同于) 比较两个字符串的差异。比较是区分大小写的,这意味着字符串“ hello”不等于字符串“ HELLO”。在功能上与string.equals()相同 **语法** ```c++ myString1 != myString2 ``` **参数** | 参数 | 说明 | 值范围 | | :-------: | :----------: | :----: | | myString1 | 第一个字符串 | | | myString2 | 第二个字符串 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :----------------------------------------------------------- | :----: | | bool | `true`:如果myString1与myString2不同。
`false`: 除此以外。 | | ### 例程:字符串操作 可参考[Arudino 字符串相关例程](https://www.arduino.cc/en/Tutorial/BuiltInExamples#strings) ## 6.2 random() - 随机数发生器 Edge101WE 主板包含一个硬件随机数生成器(RNG),可以使用esp_random()函数获取一个随机的32位值。 启用Wi-Fi或蓝牙后,可以将硬件随机数发生器(RNG)返回的数字视为真实的随机数。如果未启用Wi-Fi或蓝牙,则硬件RNG是伪随机数生成器。 #### esp_random() - 随机数发生器 **语法** ```c++ data = esp_random(); ``` **返回** | 返回值 | 说明 | 值范围 | | :----: | :------: | :----: | | long | 真随机数 | | **例程** ```c++ void setup() { Serial.begin(115200); } void loop() { Serial.println("-----------"); Serial.println(esp_random()); delay(1000); } ``` 也可用Arduino自带的随机函数生成伪随机数。 #### random() - 随机函数生成伪随机数 **语法** ```c++ random(max) random(min, max) ``` **参数** | 传入值 | 说明 | 值范围 | | :----: | :------------------------: | :----: | | min | 随机值的下限(含)(可选) | | | max | 随机值的上限,不包括在内 | | **返回** | 返回值 | 说明 | 值范围 | | :----: | :--------------------: | :----: | | long | min和max-1之间的随机数 | | **例程** 该代码生成随机数并显示它们。 ```c++ long randNumber; void setup() { Serial.begin(115200); // if analog input pin 37 is unconnected, random analog // noise will cause the call to randomSeed() to generate // different seed numbers each time the sketch runs. // randomSeed() will then shuffle the random function. randomSeed(analogRead(37)); } void loop() { // print a random number from 0 to 299 randNumber = random(300); Serial.println(randNumber); // print a random number from 10 to 19 randNumber = random(10, 20); Serial.println(randNumber); delay(50); } ``` **注意和警告** 如果重要的是要使生成的值序列random()不同,可使用randomSeed()具有相当随机性的输入(例如analogRead()在未连接的引脚上)初始化随机数生成器。 相反,偶尔使用精确重复的伪随机序列会很有用。这可以通过randomSeed()在启动随机序列之前使用固定号码进行调用来实现。 该max参数应该根据其中的值被存储在可变的数据类型来选择。在任何情况下,绝对最大值是long型,取决于所生成值的性质(32位-2,147,483,647)。设置max为较高的值不会在编译过程中产生错误,但是在代码执行过程中,生成的数字将不会符合预期。