sd卡驱动+FAT文件系统(三)

 4、测试和使用
   移植好以后,经过测试,可以顺利读出sd卡中的文件,在使用过程中遇到两个问题:
   1>怎么读写SD卡子目录里面的文件?
   在FatFS文件系统中,文件目录相关的函数有
   FRESULT f_opendir (DIR*, const char*);                /* Open an existing directory */
     FRESULT f_readdir (DIR*, FILINFO*);                    /* Read a directory item */
   但是没有提供切换当前目录的函数。
   在C语言中,转换当前目录的办法有几种:
   1)使用库函数中的chdir()函数,但是编译器的库不支持这个函数
   2)fp=fopen("123",使用方式)。这种方式不知道在PC上能否这样使用,在这里也不可行
   
   这个问题稍头疼了一下,看过ff.c的源码之后,才算明白
   FatFS文件系统没有切换目录的函数,也没有此功能,但是可以使用绝对路径进行文件读写。
   要读写子目录下面的文件,只需在文件名前加上路径。如"/test/test.dat"
   
   2>文件的写入
   根据FatFS网站提供的Document,测试了一个文件复制的函数:
      static int copy_file(char *dst,char *src)
        {
            FATFS fs;            // Work area (file system object) for logical drive
            FIL fsrc, fdst;      // file objects
            BYTE buffer[4096];   // file copy buffer
            FRESULT res;         // FatFs function common result code
            UINT br, bw;         // File R/W count
        
            // Register a work area for logical drive 0
            f_mount(0, &fs);
        
            // Open source file
            res = f_open(&fsrc, src, FA_OPEN_EXISTING | FA_READ);
            if (res)
                return 1;
        
            // Create destination file
            res = f_open(&fdst, dst, FA_CREATE_ALWAYS | FA_WRITE);
            if (res)
                return 1;
        
            // Copy source to destination
            for (;;) {
                res = f_read(&fsrc, buffer, sizeof(buffer), &br);
                if (res || br == 0) break;   // error or eof
                res = f_write(&fdst, buffer, br, &bw);
                if (res || bw < br) break;   // error or disk full
            }
        
            // Close all files
            f_close(&fsrc);
            f_close(&fdst);
        
            // Unregister a work area before discard it
            f_mount(0, NULL);
        
            return 0;    
        }
        
        运行结果,SD卡的文件读出正确,但是写入异常,可以正确建立文件,但是里面没有内容。经过单步跟踪,发现是sd_raw.c文件的sd_raw_write()函数的问题。
        在执行到
            if(length == write_length)
                return 1;
    语句时,总会直接返回,而没有发送后续的写SD卡的命令。
    问题找到了,解决起来就很容易,把这句话注释掉,文件写入就正常了。这应该是sd_raw.c文件的一个bug。
    
    整理之后,会把相关源代码上传。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章