마이크로 컨트롤러 프로그래밍을 처음 접하는데 문제가 있습니다.
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 ("%s\n", ent->d_name[0]);
}
}
이제이 코드는 USB에있는 내용을 표시합니다. 장치의 버튼을 사용하여 USB의 파일을 탐색하려면 어떻게합니까? 탐색 할 수 있도록 특정 노래에 특정 번호를 할당하는 방법이 있는지 알고 싶습니다. dirent.h
너무 오랫동안 파일을 연구했는데 dirent
파일 순서를 저장하는 위치 를 찾을 수 없습니다 (있는 경우).
당신은 dirent.h의 목적을 혼란스럽게 할 수 있습니다. 요컨대 나무를 위해 숲을 보는 것이 어려울 수 있습니다.
정보 (ent-> d_name, ent-> d_name은 문자 배열에 대한 포인터이며 종종 '문자열'이라고 함)를 데이터 구조 (예 : 배열 또는 목록)로 읽은 다음 해당 구조를 사용할 수 있습니다. 버튼 누름을 감지하는 코드를 사용하여 인덱스를 배열 정보로 위 또는 아래로 이동합니다 (더 크거나 작은 인덱스로 인덱스가 범위 또는 구조를 벗어나지 않는지 확인하십시오). 또는 while 루프가 버튼을 누를 때까지 기다렸다가 파일 이름 만 읽는 코드를 만들 수 있습니다 (seekdir을 사용하여 뒤로 이동).
UPDATE (댓글에 대한 응답) : 파일 시스템은 다음과 같은 트리 구조임을 명심하십시오.
/ (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 ("%s\n", 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
}
}
}
이제 배열 '이름'에 이름이 있고 색인으로 주소를 지정할 수 있습니다. 값 'ix-1'은 성이고 0은 이름입니다. 버튼을 누르면 원하는 이름을 식별하는 이름 배열의 인덱스를 증가 / 감소시킬 수 있습니다. 이러한 이름 중 일부는 파일 이름이 아닌 디렉토리 이름 일 수 있습니다.
물론 이것은 단순한 생각입니다. 고정 된 값을 사용하는 대신 배열을 할당하고 싶을 수 있습니다 (실제로 'names'배열을 호출 함수에 전달하려면해야합니다). strcpy의 "보안"버전이 있습니다. (메모리 오버플로 손상을 방지하는 데 도움이 됨) 등이지만 이름을 메모리에 유지하는 방법에 대한 아이디어를 제공해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다