我是微控制器编程的新手,遇到了一个问题。
我正在尝试制作一个从USB播放音乐的设备。我可以从USB读取,但我不知道如何选择某个文件。我正在使用dirent
。
到目前为止我的代码:
while (true) {
USBHostMSD msd("usb");
//setup PWM hardware for a Class D style audio output
PWMout.period(1.0/400000.0);
// wait until connected to a USB device
while(!msd.connect()) {
Thread::wait(500);
}
FILE *wave_file;
lcd.cls();
lcd.locate(0,3);
DIR *dir;
struct dirent *ent;
int i=0;
int stevilo_datotek =0;
dir = opendir ("/usb/");
if (dir != NULL)
{
while ((ent = readdir (dir)) != NULL)
{
lcd.printf ("%sn", ent->d_name[0]);
}
}
现在,此代码显示USB上的内容。如何使用设备上的按钮浏览USB上的文件?我想知道是否有办法为某首歌指定一个特定的编号,这样我就可以导航了。我已经研究了dirent.h
文件很长时间了,但我找不到dirent
将文件顺序保存在哪里(如果有的话)。
你可能混淆了dirent的目的。h简而言之,很难看到森林中的树木。
您可以将信息(ent->d_name,注意ent->d_name是指向字符数组的指针,通常称为"字符串")读取到数据结构(如数组或列表)中,然后将该结构与检测按下按钮的代码一起使用,将索引向上或向下移动到数组信息中(到较大或较小的索引,请确保检查索引是否超出范围或结构)。或者,您可以创建代码,while循环等待按下按钮,然后只读取文件名(使用seekdir返回)。
更新(回复评论):请记住,文件系统是这样的树结构:
/ (root) +--- dir1 ----------------------------+- dir1.1 ---- dir2 (empty) -- file1.1 ---- dir3 ---- dir3.1 +--- file3.1 ---- file1 ---- file3.2 ---- file2
你必须决定如何处理,你是只支持一个目录(让他们把所有音乐文件放在一个地方),允许他们浏览目录,还是浏览所有目录,只选择你知道如何播放的文件?
文件(或子目录)没有继承顺序,在某些系统中,可以随时添加或删除文件。
下面是一个非常简单的例子,说明了一种保存目录条目列表的方法:
char *names[400]; // make space for 400 names
int ix;
ix = 0;
if (dir != NULL)
{
while ((ent = readdir (dir)) != NULL)
{
lcd.printf ("%sn", ent->d_name[0]);
// allocate memory to store the name
names[ix] = (char*) malloc(strlen(ent->d_name)); // strlen from string.h
// malloc from stdlib.h
// copy the name from the directory entry
strcpy(names[ix], ent->d_name); // strcpy from string.h
ix++;
if (ix >= 400)
{
// do something because your array isn't big enough
}
}
}
现在,您的名字在数组"names"中,可以通过索引对它们进行寻址。值"ix-1"是您的姓氏,0是您的名字。按下按钮可以增加/减少名称数组中的索引,该数组标识您想要的名称。请记住,其中一些名称可能是目录名,而不是文件名。
诚然,这很简单,您可能希望分配数组,而不是使用固定值(事实上,如果您想将"names"数组传递给调用函数,则必须这样做),还有"安全"版本的strcpy(旨在帮助防止内存溢出损坏)等,但它应该让您了解如何将名称保留在内存中。