FatFs文件系统:f_forward
读取文件数据并将其转发到数据流设备。
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; }