Skocz do zawartości

Karta SD odczyt z pic16


Pomocna odpowiedź

Napisano

hey

mam pic16 ktory zapisuje/odczytuje dane z karty sd, jak te dane zapisac/odczytac w pc ??

chodzi o odczyt/zapis sektorow, bez systemu FAT/FAT32/NTFS

z odczytem sobie poradzilem (Matlab)

SD = fopen('\\.\G:','r')   % tworzenie uchwytu "pliku" do odczytu, uchwytu do fizycznego dysku
dane=fread(SD, 16);        % odczyt 16 bajtow
fclose(SD);                % zamkniecie "pliku"

natomiast jak zapisac cos w sektorach ??

SD = fopen('\\.\G:','w')         % nie dziala, zwraca blad:Invalid argument 
fwrite(SD,dane)                                           
fclose(SD);

SD = fopen('\\.\G:','r+')        % nie dziala, brak bledu ale nie ma efektow na karcie sd
fwrite(SD,dane)
fclose(SD);

prosze o wskazowki 🙂

z gory dziekuje

spróbuj open i write i close zamist fopen fclose i fwrite. Na linuksie mogloby wygladac to tak:

int sd = open("/dev/sdb", O_APPEND);

write(sd, buff, sizeof(buff));

close(sd);

poszukaj odpowiednich wywołań systemowych pod windowsem.

p.s. literka A... literka G...

probowalem uzyc plikow tymczasowych, konsoli i komendy dd

D:\acclog\reader>dd if=\\.\G: of=temp.txt count=1
1+0 records in
1+0 records out

D:\acclog\reader>dd if=temp.txt of=\\.\G:
dd: \\.\G:: Invalid argument

i tez lipa :| 1 komenda prawidlowo dziala !! w pliku jest odczytany 1 sektor, natomiast zapis nie dziala 🙁

jakis pomysl ??

p.s. literka H ... jak AGH 😃

Pomysł jest taki, że musisz zapisywać jednocześnie ilości danych będące wielokrotnością rozmiaru sektora.

Obczaj tutaj: http://support.microsoft.com/kb/100027 i daj znać czy coś pomogło.

Spróbuj napisać jakiś mały program w C, który wywoła CreateFile() z tymi flagami o których piszą w powyższym artykule i koniecznie zapisuj całe sektory danych.

[ Dodano: 03-01-2011, 21:55 ]

Tutaj gość ma podobny problem:

http://www.eggheadcafe.com/software/aspnet/31520519/direct-disk-access-write-to-system-areas.aspx

  • Lubię! 1

rozwiazanie w Matlabie:

dane(512)           % DANE MUSZA BYC WIELOKROTNOSCIA SEKTORA, MIN. 512b
SD = fopen('\\.\G:','r+')  
fwrite(SD,dane);
fclose(SD);

inne rozwiazania w C za pomoca CreateFile tez dzialaja

Ciesze się, że udało mi się pomóc, ale przyznać muszę, że sam nie miałem pojęcia w czym problem, natomiast rozwiązanie wydaje się całkiem sensowne. Dziwne tylko że odczyt nie failuje tylko dociąga do pełnego sektora.

Nie polegałbym raczej na tym, że sektor ma zawsze 512b. zmienisz kartę na inną i się okaże że sektory są po 1024k i będzie kicha. Lepiej programowo sprawdzić jaki duży jest sektor:

Call DeviceIoControl() using IOCTL_DISK_GET_DRIVE_GEOMETRY to get the bytes per sector, number of sectors, sectors per track, and so forth, so that you can compute the size of the buffer that you will need.

Kto jest boski?! Samogłoski! 🙂 Ach te "stare czasy"

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...