# Arduino學習筆記(翔&慈常用語法)
網址:http://bit.ly/3U43G4h
```
// --
// --
void loop(){
if (Serial.available() > 0) { // 检查是否有可读取的字節(bytes)
String str = Serial.readString(); // 读取串行端口中的所有字节
Serial.print("讀取到的字串:");
Serial.println(str);
while (myString.length()) {
int delimiterIndex = myString.indexOf(delimiter);
if (delimiterIndex == -1) {
delimiterIndex = myString.length();
}
tokens[index] = myString.substring(0, delimiterIndex);
index++;
myString.remove(0, delimiterIndex + 1);
}
} // end of if (Serial.available() > 0)
Serial.println(".");
delay(1000);
}
// 延遲1秒
delay(1000);
// 印出字串
Serial.print(".");
// 印出一行
Serial.println(".");
// 怎麼宣告陣列
String s_ary[];
char str[] = "1,2,3";
// -- 取得陣列長度的寫法
int myArray[] = {1, 2, 3, 4, 5};
int arrayLength = sizeof(myArray) / sizeof(myArray[0]);
// -- 分割"1,2,3"字串到s_ary陣列,並印出來
String delimiter = ","; // 要切割的字元
String s_ary[10]; // 字串切割後的值存放陣列
int index=0; // 字串切割後的值存放陣列的索引
if (Serial.available() > 0) { // 检查是否有可读取的字節(bytes)
String str = Serial.readString(); // 读取串行端口中的所有字节
Serial.println("讀取到的字串:" + str);
//int commaIndex = str.indexOf(","); //逗號索引 [-1(找不到搜尋的字)|>=0(找到字的索引]
//Serial.println(commaIndex); // 印出搜尋的字的索引
while (str.length()) { // 如果字串仍有值時,就繼續切割
int delimiterIndex = str.indexOf(delimiter); //逗號索引 [-1(找不到搜尋的字)|>=0(找到字的索引]
if (delimiterIndex == -1) {
delimiterIndex = str.length();
}
s_ary[index] = str.substring(0, delimiterIndex);
index++;
str.remove(0, delimiterIndex + 1);
}
int arrayLength = sizeof(s_ary) / sizeof(s_ary[0]); // 計算字串陣列的長度
Serial.println("切割後的字串陣列長度:" + (String)arrayLength + "---");
for (int i = 0; i < index; i++) {
Serial.println( s_ary[i] );
} // end of for (int i = 0; i < index; i++) {
} // end of if (Serial.available() > 0)
//-- 動態陣列
在Arduino中,数组的大小必须在编译时确定,并且不能在运行时更改。因此,您不能动态更改数组的大小,但是您可以使用动态分配内存的方法来模拟动态数组。这可以通过使用malloc()和free()函数来实现。以下是一个示例代码:
int *myArray;
int arraySize = 5;
// 动态分配内存
myArray = (int*)malloc(arraySize * sizeof(int));
// 将值分配给数组元素
for (int i = 0; i < arraySize; i++) {
myArray[i] = i + 1;
}
// 输出数组元素
for (int i = 0; i < arraySize; i++) {
Serial.println(myArray[i]);
}
// 动态更改数组大小
arraySize = 10;
myArray = (int*)realloc(myArray, arraySize * sizeof(int));
// 将新值分配给新元素
for (int i = 5; i < arraySize; i++) {
myArray[i] = i + 1;
}
// 输出更改后的数组元素
for (int i = 0; i < arraySize; i++) {
Serial.println(myArray[i]);
}
// 释放内存
free(myArray);
在此示例中,我们首先使用malloc()函数动态分配一个大小为5的整数数组,并使用for循环将其初始化。然后,我们输出数组元素,并使用realloc()函数将数组大小更改为10。然后,我们使用另一个for循环分配新值给新元素,并再次输出数组元素。最后,我们使用free()函数释放内存。
请注意,在动态分配内存时,您需要非常小心,以避免出现内存泄漏或不必要的内存使用。此外,动态分配内存也会消耗一些RAM,因此在使用时需要谨慎。
// 計算字串"1,2,3"切割後的長度, strtok()函数
// 怎麼宣告回傳字串陣列的函式
void setup() {
Serial.begin(9600);
char str[] = "one,two,three,four,five";
int count;
char** array = splitString(str, ',', count);
for (int i = 0; i < count; i++) {
Serial.println(array[i]);
}
}
// ★★ C++不支持直接返回数组,您需要使用指针来模拟返回数组
//-- 回傳字串組(★★★c++無法回傳字串陣列,字串組)
void setup() {
Serial.begin(9600);
char str[] = "one,two,three,four,five";
int count;
char** array = splitString(str, ',', count);
for (int i = 0; i < count; i++) {
Serial.println(array[i]);
}
}
// 字串怎麼轉char陣列
在C++中,字符串可以转换为字符数组(char数组),这可以通过调用字符串对象的c_str()方法来完成。该方法返回一个指向字符数组的指针,该数组包含了字符串中所有字符的副本,以及一个null终止符。以下是一个示例代码:
String myString = "Hello, World!";
char myCharArray[20];
myString.toCharArray(myCharArray, 20);
// 字串切成字元陣列, 如 "1,2,3" -> char[]{'1','2','3'}
#include <string.h>
// char **splitString(String str, char separator, int *count);
char **splitString(String str, char separator, int *count) {
int capacity = 5;
char **result = (char **)malloc(capacity * sizeof(char *));
char *tok;
int i = 0;
tok = strtok(str.c_str(), &separator);
while (tok != NULL) {
if (i >= capacity) {
capacity += 5;
result = (char **)realloc(result, capacity * sizeof(char *));
}
result[i] = (char *)malloc(strlen(tok) + 1);
strcpy(result[i], tok);
i++;
tok = strtok(NULL, &separator);
}
*count = i;
return result;
} //
void setup() {
Serial.begin(9600); // 开始串口通信,波特率为9600
String str = "1,2,3,4,5,6,7,8,9,10";
int count = 0;
char **array = splitString(str, ',', &count);
// 输出分割后的子字符串
for (int i = 0; i < count; i++) {
Serial.println(array[i]);
}
// 释放内存
for (int i = 0; i < count; i++) {
free(array[i]);
}
free(array);
}
//
if (Serial.available() > 0) { // 检查是否有可读取的字節(bytes)
String str = Serial.readString(); // "1,2,3", 读取串行端口中的所有字节
int count = 0;
char **array = splitString(str, ',', &count);
for (int i = 0; i < count; i++) { // 输出分割后的子字符串
Serial.println(array[i]);
}
for (int i = 0; i < count; i++) { // 释放内存
free(array[i]);
}
free(array);
} // end of if (Serial.available() > 0) {
// Serial最多只能傳送32英文字+31個逗號,共63個字元
//1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2
//0001,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1
// -- 動態分割"1,2,3"字串到s_ary陣列,並印出來
String delimiter = ","; // 要切割的字元
String s_ary[10]; // 字串切割後的值存放陣列
int index=0; // 字串切割後的值存放陣列的索引
if (Serial.available() > 0) { // 检查是否有可读取的字節(bytes)
String str = Serial.readString(); // 读取串行端口中的所有字节
Serial.println("讀取到的字串:" + str);
//int commaIndex = str.indexOf(","); //逗號索引 [-1(找不到搜尋的字)|>=0(找到字的索引]
//Serial.println(commaIndex); // 印出搜尋的字的索引
while (str.length()) { // 如果字串仍有值時,就繼續切割
int delimiterIndex = str.indexOf(delimiter); //逗號索引 [-1(找不到搜尋的字)|>=0(找到字的索引]
if (delimiterIndex == -1) {
delimiterIndex = str.length();
}
s_ary[index] = str.substring(0, delimiterIndex);
index++;
str.remove(0, delimiterIndex + 1);
}
int arrayLength = sizeof(s_ary) / sizeof(s_ary[0]); // 計算字串陣列的長度
Serial.println("切割後的字串陣列長度:" + (String)arrayLength + "---");
for (int i = 0; i < index; i++) {
Serial.println( s_ary[i] );
} // end of for (int i = 0; i < index; i++) {
} // end of if (Serial.available() > 0)
```