티스토리 뷰

이번에는 SD 메모리 카드에 기록되어 있는 파일들 중 하나를 선택하여 끝까지 읽어 오는 방법에 대해서 설명하도록 하겠다.

파일을 읽어 오기 위해서는 먼저 어떤 파일을 읽어 올것인지 지정해 주어야 하는데, 이를 위하여 fat32_openfile() 함수를 이용한다.

앞의 글에서 설명하였던 fat32_opendir()과 비슷한 모양을 하고 있는데, 다른 점은 파일이 위치하고 있는 디렉토리를 찾아 가는 부분과 원하는 파일을 찾는 부분으로 분리되어 있다는 점이다.

26~34번 줄이 디렉토리를 찾는 부분이고, 36~45번줄이 파일을 찾았을 때의 코드이다.

파일을 찾게되면 해당 파일이 시작되는 클러스터 인덱스를 알아내고 섹터 인덱스와 파일을 어디까지 읽어 왔는지 기록해 두기 위한 file_ptr값을 0으로 초기화 한다.

에러없이 파일을 찾을 경우 리턴값으로 파일의 시작 클러스터 인덱스값을 돌려 주도록 하였다.

fa32_openfile()로 원하는 파일의 위치를 찾아 냈으면, 해당 위치로 부터 파일을 읽어 오기 위하여 fat32_readfile()을 이용하면 된다.

메모리(RAM)의 크기가 충분하다면 전체 파일을 한번에 읽어 올수도 있겠지만, 대부분의 MCU의 메모리는 수킬로바이트에서 수십킬로바이트이므로 메모리가 허용하는 범위내에서 조금씩 읽어 와야 한다.  이런 제약사항을 지원할 수 있도록 read 함수를 만들어야 한다.

13번 줄은 이미 파일을 끝까지 읽은 상태에서 계속 파일 읽기 동작을 수행하는 경우에 대비하여 에러처리를 하는 부분이다.

16~17번 줄은 아직 읽지 않고 남아 있는 파일의 데이터 크기보다 더 많은 데이터를 읽고자 할 때, 남아 있는 데이터 크기만큼만 읽을 수 있도록 크기를 조정하는 부분이다.

20번 줄은 읽고자 하는 파일의 섹터 번호를 찾기 위한 계산 식이다.

27번 줄은 마지막으로 읽은 데이터의 위치가 읽어 들인 섹터를 기준으로 어디인지 그 offset값을 알아내기 위한 코드이다.

28~36은 읽어 들일 데이터 영역이 섹터 경계선을 넘어 가는 경우에 일단은 현재 섹터의 끝까지만 읽은 다음, 나머지 데이터는 다음 섹터에서 읽기 위한 코드이다.

38~44번 줄은 읽어야 할 데이터가 현재 섹터내에서 존재하는 경우의 코드이다.

47~59는 file_ptr값이 섹터 경계인 경우 다음에 데이터 읽기 동작을 수행할 것에 대비해 섹터와 클러스터 값을 옮겨 주는 코드이다.

원하는 크기만큼의 데이터를 정상적으로 읽은 경우 읽은 크기를 리턴해 주도록 하였다.

그럼 이제, fat32_openfile()과 fat32_readfile() 함수를 이용하여 특정 파일을 읽어 보는 예제 코드를 만들어서 두개의 API가 제대로 만들어 졌는지 확인해 보도록 하겠다.

콘솔창에서 "fread"명령을 수행하여 파일을 읽어 오도록 하였다.

16번 줄에서 openfile()을 불러 원하는 파일을 열도록 한다.  리턴값이 0이면 해당 파일이 없다는 뜻이므로 read 동작을 수행하지 않도록 한다.

28~34번줄은 파일에서 데이터를 특정 크기만큼 반복해서 읽어 오는 코드이다.  리턴값이 0보다 작을때까지 파일을 읽어오면 된다.  예제코드는 ASCII로 된 파일을 선택하여 화면에 출력하여 파일이 제대로 읽혀 왔는지 확인할 수 있도록 하였다.

파일 읽기가 끝나면 몇바이트를 읽어 왔는지 출력하여 파일의 읽기 동작이 정상적으로 완료되었는지 확인하게 된다.  참고로 이 예제에서는 100바이트 단위로 데이터를 읽어 오도록 만들었다.  다양한 시험을 위하여 이 값을 다르게 설정하여 시험해 보도록 한다.

위의 그림은 adc 디렉토리안에 있는 malloc.c 파일을 읽어 와서 파일 읽기 동작을 시험해 보는 것이다.  malloc.c 파일의 크기가 228KB이므로 6개의 클러스터에 기록되어 있을것이며, 시작 클러스터는 288이다.

빨간색으로 표시된 부분을 보면 fat32_openfile()함수가 제대로 파일을 찾았다는 것을 알 수 있다.

fat32_readfile()을 통해 읽어 들인 데이터를 화면에 출력해 보면 실제 malloc.c 파일이 보이게 된다.

파일이 끝까지 정상적으로 읽혀진 것을 위의 그림을 보고 확인할 수 있다.  빨간색으로 표시된 부분을 보면 "ls" 명령으로 보여진 디렉토리에 있는 파일크기와 동일한 것을 알 수 있다.  즉, 끝까지 읽었다는 뜻이 된다.

실제 malloc.c 파일을 열어서 시작과 끝부분이 동일한 것인지 확인해 보거나 테라텀의 로그 기능을 이용하여 화면에 표시되는 것들을 파일로 저장한 다음 두개의 파일을 비교해 보아서 데이터가 에러없이 읽혔는지 확인해 볼 수도 있다.



fat32.zip


'프로젝트 > FAT32' 카테고리의 다른 글

FAT32 - 응용(MP3 player)  (0) 2017.09.26
FAT32 - fat32_opendir(), fat32_readdir()  (0) 2017.09.20
FAT32 -FAT Entry  (0) 2017.09.18
FAT32 - Directory Entry  (0) 2017.09.14
FAT32 - BPB(BIOS Parameter Block)  (0) 2017.09.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함