我正在尝试检索以字符串形式存储在 ESP32 SD 卡上的无线电 URL 链接列表,这些字符串位于引号内,并以逗号和新行分隔。 即每行一个 url。 我可以打开 URL_LIST.TXT 文件并将 URL 放入字符串数组中,
String url[100];
通过使用SD.H文件打开、读取和字符串解析命令。然而,我正在使用的 ESP32 音频套件需要通过 const char 指针连接的 url,
const char *urls[] = {http://urlstation1","http://urlstation2",...,http://lastStation"}
其中 url 是在代码内部定义的,而不是从 SD 卡读取。
我尝试创建一个字符数组 char u[100][255] 以允许最多 100 个 url 地址。每个长度最多可达 255 个字符。即使值的 Serial.Println 看起来没问题,下面的代码也会失败。
...
int readurls(String url[],char u[100][255]){
File url_list = SD.open("/URLs/URL_LIST.txt");
String str;
String a_url;
int count = 0;
while (url_list.available() && count < MAX_LINES) {
str= url_list.readStringUntil('\n');
//Serial.println(str);
int delim = str.indexOf(',');
//a_url=str.substring(0,delim);
//needed to eliminate the quotes from the strings
a_url=str.substring(3,delim-1);
url[count] = a_url;
// works to this point - that is String Array looks correct
a_url+="\0"; // tried to add a null pointer several ways
//Serial.println(url[count].c_str());
char ubuf[a_url.length()+1]="";
a_url.toCharArray(ubuf,a_url.length()+1);
strncpy(u[count],ubuf,sizeof(u[count]));
//u[count]=url[count].c_str();
urls[count]=u[count];
count++;
}
close(url_list);
return(count);
}
希望各位专家能告诉我我做错了什么。当使用初始化值在代码内部定义 url 时,使用 url 指针的驱动程序将播放音乐流。
当在文本文件中定义 url 并且指向 url 指针以从字符数组获取值时,该 url 不会播放音乐。 在这两种情况下打印单个站点的 urls[index] 会显示看起来相同的值,因此隐藏的内容丢失或未正确完成。
您的代码不起作用,因为您尝试将
String
的实例分配给 char 数组:
url[count] = a_url;
这不起作用 - char 数组只是字节的连续部分,而不是像
String
那样的类实例。
相反,您应该首先使用
String
方法将 .c_str()
转换为 char 数组,该方法返回一个以 null 结尾的 char 数组(基本上是一个 ascii 值数组),然后使用 将其复制到目标数组strcpy
。
以下是根据上述建议修改的代码(免责声明:我没有对此进行测试,因为我不方便访问适当的硬件)
int readurls(String url[],char u[100][255]){
File url_list = SD.open("/URLs/URL_LIST.txt");
String str;
String a_url;
int count = 0;
while (url_list.available() && count < MAX_LINES) {
str = url_list.readStringUntil('\n');
//Serial.println(str);
int delim = str.indexOf(',');
//a_url=str.substring(0,delim);
//needed to eliminate the quotes from the strings
a_url = str.substring(3,delim-1);
// Note: must copy the characters, cannot assign because array is not a class but a raw array
strcpy(url[count], a_url.c_str());
count++;
}
close(url_list);
return(count);
}