Arduino 将 String 复制到 char * 并使用外部函数
Arduino copy String to char * and use outside function
我正在使用 ESP32 WIFI 微控制器开发程序,我需要扫描附近可用的 WiFi 网络并将它们存储在列表中,以便稍后在函数外使用它们。我最初设法使用 String 类型变量轻松完成所有事情,但我听到很多关于在 Arduino 中使用 String 的坏话,所以我现在尝试使用 char* 做所有事情,我发现它比 String 更具挑战性。
我找到了一篇描述如何将 String 转换为 char 数组的文章:
https://circuits4you.com/2018/03/08/arduino-convert-string-to-character-array/
// Define
String str = "This is my string";
// Length (with one extra character for the null terminator)
int str_len = str.length() + 1;
// Prepare the character array (the buffer)
char char_array[str_len];
// Copy it over
str.toCharArray(char_array, str_len);
在我的代码中:
我初始化了一个全局变量 char 数组,我想在其中存储我的信息。
char* list_strings[10];
然后调用函数扫描网络:
int scan_wifi_networks(){
Serial.println("scan start");
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
int str_len = WiFi.SSID(i).length() + 1; // this is to know the the length of the string +1
char temp_buffer[str_len]; // create a temporary storage to copy the string to char array
WiFi.SSID(i).toCharArray(temp_buffer, str_len); // converts string to char array
Serial.print("temp buffer is set to=");
Serial.println(temp_buffer);
list_strings[i] = temp_buffer;
}
}
Serial.print("list of strings inside scanning function");
for(int i=0 ; i<=n ; i++){
Serial.println(list_strings[i]); // prints a lot of garbage??
}
return n;
}
上面的函数将扫描网络并假设将字符串变量 (WiFi.SSID) 转换为 char 数组,然后我将其存储到我的列表中:
list_strings[i] = temp_buffer;
我的串行监视器:
serial monitor image
它能够在 for 循环中正确打印出 wifi 名称,但是一旦退出 for 循环,它就会打印一些垃圾。
感谢任何帮助
更新1
我正在尝试打印 temp_buffer:
的地址
char temp_buffer[str_len]; // create a temporary storage to copy the string to char array
int ptr = &temp_buffer;
Serial.print("Pointer :" );
Serial.println(ptr);
但运气不好。我得到了从 char* 到 int 的无效转换错误
更新2
我已经将我的 temp_buffer 转换为 int 并且可以编译,但是,我不知道这是否正确。
char temp_buffer[str_len]; // create a temporary storage to copy the string to char array
int ptr = (int)&temp_buffer;
Serial.print("Pointer :" );
Serial.println(ptr);
串行监视器:
Pointer :1073422080
temp buffer is set to=Telia-33F8A3-Greitas
Pointer :1073422080
temp buffer is set to=HUAWEI-STOLYARCHUK
Pointer :1073422080
temp buffer is set to=Telia-E619A5-Greitas
Pointer :1073422080
temp buffer is set to=Telia-ED7E29-Greitas
Pointer :1073422096
temp buffer is set to=MEZON_1156F3
Pointer :1073422080
temp buffer is set to=Carolyne’s iPhone
Pointer :1073422080
temp buffer is set to=Teo-E6A379-Greitasis
Pointer :1073422096
temp buffer is set to=HH40V_BE2F
Pointer :1073422096
temp buffer is set to=Fishman
Pointer :1073422096
temp buffer is set to=MEZON_9EE8
Pointer :1073422096
temp buffer is set to=4G-Gateway-4981
Pointer :1073422080
temp buffer is set to=HUAWEI-B525-C466
Pointer :1073422096
temp buffer is set to=DGD
Pointer :1073422096
temp buffer is set to=4G-Gateway-D29C
Pointer :1073422096
temp buffer is set to=WIFI 2021
Pointer :1073422080
temp buffer is set to=Telia-E79C95-Greitas
Pointer :1073422080
temp buffer is set to=Telia-E5E1B9-Greitas
Pointer :1073422096
temp buffer is set to=#Telia-1E6E7A
list of strings inside scanning function
由于某些奇怪的原因,指针时不时地从 1073422080 变为 1073422096
问题是char temp_buffer[str_len];
。这会在堆栈上分配内存(在 for 循环的每次迭代中几乎肯定是相同的内存位。我很惊讶这个编译,因为我希望得到一个错误抱怨 str_len 不是一个常量。
在任何情况下,您都在保存堆栈区域的地址,该区域可在每次迭代中以及退出循环后重复使用。
在每次迭代中打印 temp_buffer 的地址可能会提供信息。
您可以改为使用 new() 在堆上分配内存,并记得在完成后使用 delete() 释放它。
更好的方法是使用来自 STL 的字符串和向量。
我正在使用 ESP32 WIFI 微控制器开发程序,我需要扫描附近可用的 WiFi 网络并将它们存储在列表中,以便稍后在函数外使用它们。我最初设法使用 String 类型变量轻松完成所有事情,但我听到很多关于在 Arduino 中使用 String 的坏话,所以我现在尝试使用 char* 做所有事情,我发现它比 String 更具挑战性。
我找到了一篇描述如何将 String 转换为 char 数组的文章: https://circuits4you.com/2018/03/08/arduino-convert-string-to-character-array/
// Define
String str = "This is my string";
// Length (with one extra character for the null terminator)
int str_len = str.length() + 1;
// Prepare the character array (the buffer)
char char_array[str_len];
// Copy it over
str.toCharArray(char_array, str_len);
在我的代码中: 我初始化了一个全局变量 char 数组,我想在其中存储我的信息。
char* list_strings[10];
然后调用函数扫描网络:
int scan_wifi_networks(){
Serial.println("scan start");
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
int str_len = WiFi.SSID(i).length() + 1; // this is to know the the length of the string +1
char temp_buffer[str_len]; // create a temporary storage to copy the string to char array
WiFi.SSID(i).toCharArray(temp_buffer, str_len); // converts string to char array
Serial.print("temp buffer is set to=");
Serial.println(temp_buffer);
list_strings[i] = temp_buffer;
}
}
Serial.print("list of strings inside scanning function");
for(int i=0 ; i<=n ; i++){
Serial.println(list_strings[i]); // prints a lot of garbage??
}
return n;
}
上面的函数将扫描网络并假设将字符串变量 (WiFi.SSID) 转换为 char 数组,然后我将其存储到我的列表中:
list_strings[i] = temp_buffer;
我的串行监视器: serial monitor image
它能够在 for 循环中正确打印出 wifi 名称,但是一旦退出 for 循环,它就会打印一些垃圾。
感谢任何帮助
更新1
我正在尝试打印 temp_buffer:
的地址char temp_buffer[str_len]; // create a temporary storage to copy the string to char array
int ptr = &temp_buffer;
Serial.print("Pointer :" );
Serial.println(ptr);
但运气不好。我得到了从 char* 到 int 的无效转换错误
更新2
我已经将我的 temp_buffer 转换为 int 并且可以编译,但是,我不知道这是否正确。
char temp_buffer[str_len]; // create a temporary storage to copy the string to char array
int ptr = (int)&temp_buffer;
Serial.print("Pointer :" );
Serial.println(ptr);
串行监视器:
Pointer :1073422080
temp buffer is set to=Telia-33F8A3-Greitas
Pointer :1073422080
temp buffer is set to=HUAWEI-STOLYARCHUK
Pointer :1073422080
temp buffer is set to=Telia-E619A5-Greitas
Pointer :1073422080
temp buffer is set to=Telia-ED7E29-Greitas
Pointer :1073422096
temp buffer is set to=MEZON_1156F3
Pointer :1073422080
temp buffer is set to=Carolyne’s iPhone
Pointer :1073422080
temp buffer is set to=Teo-E6A379-Greitasis
Pointer :1073422096
temp buffer is set to=HH40V_BE2F
Pointer :1073422096
temp buffer is set to=Fishman
Pointer :1073422096
temp buffer is set to=MEZON_9EE8
Pointer :1073422096
temp buffer is set to=4G-Gateway-4981
Pointer :1073422080
temp buffer is set to=HUAWEI-B525-C466
Pointer :1073422096
temp buffer is set to=DGD
Pointer :1073422096
temp buffer is set to=4G-Gateway-D29C
Pointer :1073422096
temp buffer is set to=WIFI 2021
Pointer :1073422080
temp buffer is set to=Telia-E79C95-Greitas
Pointer :1073422080
temp buffer is set to=Telia-E5E1B9-Greitas
Pointer :1073422096
temp buffer is set to=#Telia-1E6E7A
list of strings inside scanning function
由于某些奇怪的原因,指针时不时地从 1073422080 变为 1073422096
问题是char temp_buffer[str_len];
。这会在堆栈上分配内存(在 for 循环的每次迭代中几乎肯定是相同的内存位。我很惊讶这个编译,因为我希望得到一个错误抱怨 str_len 不是一个常量。
在任何情况下,您都在保存堆栈区域的地址,该区域可在每次迭代中以及退出循环后重复使用。
在每次迭代中打印 temp_buffer 的地址可能会提供信息。
您可以改为使用 new() 在堆上分配内存,并记得在完成后使用 delete() 释放它。
更好的方法是使用来自 STL 的字符串和向量。