# 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) ```