FatFs文件系统:f_forward

网站作者5个月前FatFs294

读取文件数据并将其转发到数据流设备。

FRESULT f_forward (   
    FIL* FileObject, /* 文件对象 */   
    UINT (*Func)(const BYTE*,UINT), /* 数据流函数 */   
    UINT ByteToFwd, /* 要转发的字节数 */   
    UINT* ByteFwd /* 已转发的字节数 */  
);


参数:

FileObject 打开的文件对象的指针。 

Func 用户定义的数据流函数的指针。详情参考示例代码。 

ByteToFwd 要转发的字节数,UINT 范围内。 

ByteFwd 返回已转发的字节数的 UINT 变量的指针。 


返回值:

FR_OK (0)函数成功。 

FR_DENIED 由于文件已经以非读模式打开,而导致函数失败。 

FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。 

FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。 

FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。 

FR_INVALID_OBJECT 文件对象无效。 


描述:

f_forward 函数当_USE_FORWARD == 1 并且_FS_TINY == 1 时可用。 

f_forward 函数从文件中读取数据并将数据转发到输出流,而不使用数据缓冲区。这适用于小存储系统, 因为它在应用模块中不需要任何数据缓冲区。文件对象的文件指针以转发的字节数增加。如果*ByteFwd <  ByteToFwd 并且没有错误,则意味着由于文件结束或在数据传输过程中流忙,请求的字节不能被传输。 


示例(音频播放):

*-----------------------------------------------------------------------*/  
/* 示例代码:数据传输函数,将被 f_forward 函数调用 */  
/*-----------------------------------------------------------------------*/  
UINT out_stream ( /* 返回已发送字节数或流状态 */   
    const BYTE *p, /* 将被发送的数据块的指针 */   
    UINT btf /* >0: 传输调用(将被发送的字节数)。0: 检测调用 */  
)  
{   
    UINT cnt = 0;   
    if (btf == 0) 
    { /* 检测调用 */   
        /* 返回流状态(0: 忙,1: 就绪) */   
        /* 当检测调用时,一旦它返回就绪,那么在后续的传输调用时,它必须接收至少一个字节,或者 f_forward 将以 FR_INT_ERROR 而失败。 */  
        if (FIFO_READY) cnt = 1;   
    }   
    else 
    { /* 传输调用 */   
        do 
        { /* 当有数据要发送并且流就绪时重复 */
            FIFO_PORT = *p++;  
            cnt++;   
        } 
        while (cnt < btf && FIFO_READY);   
     }  
       return cnt;  
}  
/*-----------------------------------------------------------------------*/  
/* 示例代码:使用 f_forward 函数 */  
/*-----------------------------------------------------------------------*/  
FRESULT play_file (   
    char *fn /* 待播放的音频文件名的指针 */  
)  
{   
    FRESULT rc;   
    FIL fil;   
    UINT dmy;   /* 以只读模式打开音频文件 */  
    rc = f_open(&fil, fn, FA_READ);   
    /* 重复,直到文件指针到达文件结束位置 */  
    while (rc == FR_OK && fil.fptr < fil.fsize) 
    {   /* 任何其他处理... */   
        /* 定期或请求式填充输出流 */  
        rc = f_forward(&fil, out_stream, 1000, &dmy);   
    }   
    /* 该只读的音频文件对象不需要关闭就可以被丢弃 */  
    return rc; 
}


相关文章

FatFs文件系统:f_lseek

移动一个打开的文件对象的文件读/写指针。也可以被用来扩展文件大小(簇预分配)。FRESULT f_lseek (      FIL* FileObject, /* 文件对象结构指针 */     ...

FatFs文件系统:f_mkfs

在驱动器上创建一个文件系统。FRESULT f_mkfs (        BYTE Drive, /* 逻辑驱动器号 */        BYTE PartitioningRule, /* 分区...

FatFs文件系统:f_putc

f_putc 函数向文件中写入一个字符。int f_putc (        int Chr, /* 字符 */        FIL* FileObject /* 文件对象 */   );参...

FatFs文件系统:f_open

创建/打开一个用于访问文件的文件对象。FRESULT f_open (      FIL* FileObject, /* 空白文件对象结构指针 */      const XCHAR* FileN...

FatFs文件系统:f_tell

获取一个文件的当前读/写指针。DWORD f_tell (        FIL* FileObject /* File object */   );参数:FileObject——指向打开文件对象...

FatFs文件系统:f_sync

冲洗一个写文件的缓存信息。FRESULT f_sync (      FIL* FileObject /* 文件对象结构的指针 */ );参数:FileObject 待冲洗的打开的文件对象的指针。...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。