Albo ja się trochę źle wyraziłem albo ty mnie trochę opacznie zrozumiałeś

Nie chodzi mi o to na jakiej zasadzie się odczytuje długie nazwy (skasowany plik ->E5h czy atrybut długich nazw 0Fh)

Ale o to jak to zrealizować

W jaki sposób poszczególne bajty ładować do tablicy

Mam nadzieję że teraz trochę bardziej sprecyzowałem mój problem
Dokładnie w jaki sposób to sprawdzasz skoro nazwa nie jest ciągiem bajtów tylko znajdują się w niej dodatkowe bajty danych
Coś udało mi się wykrzesać

Kod który pokaże działą (prawie) poprawnie :
unsigned long FindFileNr(unsigned int FileNr,unsigned char *name_buffer, unsigned char *buffer)
{
unsigned long index, index2, FirstCluster;
unsigned long index3=0;
unsigned int index4=0;
unsigned char in, index0;
NextClus=RootDirCluster;
while(1)
{
for(index2=0; index2<SectorPerCluster; index2++)
{
sd_read_sector((RootDirAddr+index2),buffer);
for(index=0; index<BytesPerSector; index+=32)
{
struct DirStruct *dir = (struct DirStruct*)&buffer[index];
struct LongName *ptr2 = (struct LongName*)&buffer[index];
if((dir->attrib) == 0x0F)
{
if(((dir->name[0]) >= 0x41) && ((dir->createDate) == 0x0000))
{
index3=0;
name_buffer[index3] = (ptr2->letter6a);
name_buffer[(index3+=1)] = (ptr2->letter5a);
name_buffer[(index3+=1)] = (ptr2->letter4a);
name_buffer[(index3+=1)] = (ptr2->letter3a);
name_buffer[(index3+=1)] = (ptr2->letter2a);
name_buffer[(index3+=1)] = (ptr2->letter1a);
goto next1;
}
name_buffer[(index3+=1)] = (ptr2->letter13a);
name_buffer[(index3+=1)] = (ptr2->letter12a);
name_buffer[(index3+=1)] = (ptr2->letter11a);
name_buffer[(index3+=1)] = (ptr2->letter10a);
name_buffer[(index3+=1)] = (ptr2->letter9a);
name_buffer[(index3+=1)] = (ptr2->letter8a);
name_buffer[(index3+=1)] = (ptr2->letter7a);
name_buffer[(index3+=1)] = (ptr2->letter6a);
name_buffer[(index3+=1)] = (ptr2->letter5a);
name_buffer[(index3+=1)] = (ptr2->letter4a);
name_buffer[(index3+=1)] = (ptr2->letter3a);
name_buffer[(index3+=1)] = (ptr2->letter2a);
name_buffer[(index3+=1)] = (ptr2->letter1a);
next1:
name_index = index3;
}
if((dir->name[0] != 0xE5) && (dir->name[0] != 0x00) && (dir->attrib != 0x0F))
index4++;
if(index4 == FileNr)
{
FirstCluster |=(dir->firstClusterHI);
FirstCluster<<=16;
FirstCluster |=(dir->firstClusterLO);
// transmitString(dir->name);
for(in=0;in<11;in++)
FileName[in] = dir->name[in];
// name_buffer[(index3+1)] = (dir->name[0]);
/***********************************wyswietlanie nazwy*******************************/
if(name_index <= 11)
{
for(index0=0; index0<11; index0++)
USART_Transmit(FileName[index0]);
name_index=0;
}
else
{
for(index0=(name_index+1);index0>0;index0--)
USART_Transmit(name_buffer[index0]);
name_index=0;
}
/**************************************************************************************/
return FirstCluster;
}
}
}
NextClus=(NextCluster(NextClus,buffer));
if(NextClus >= 0x0FFFFFF8) return 0;
RootDirAddr = (FirstClusterSector(NextClus));
}
read_fat_info(buffer);
}
Jedyne co robi źle to zamiast zapisywanie każdej nazwy od nowa w name_buffer to za każdym razem przesówa tablice o tyle bajtów ile zajmuje nowa nazwa (i niby ładnie działa ale do momentu zapełnienia się całej tablicy i wtedy program się wiesza

)