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;
}