📄 udisk.c
字号:
{
if (rwdisk.cmds == 0)
{
ret = 0;
}
else
{
ret = rwdisk.cmds;
}
}
else
{
ret = 0xff; // 设备没响应
}
return (ret);
}
/*********************************************************************************************************
** 函数名称: GetFCB
** 功能描述: 获取文件控制块
** 输入参数: 无
** 输出参数: 若当前文件控制块空闲, 则返回当前文件控制块的指针,否则返回NULL
********************************************************************************************************/
FileCB *GetFCB(void)
{
if (CurFileCB.fh == HANDLE_AVAILABLE)
{
return (&CurFileCB);
}
else
{
return (NULL);
}
}
/*********************************************************************************************************
** 函数名称: FreeFCB
** 功能描述: 释放当前文件控制块,令当前文件控制块的句柄空闲
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void FreeFCB(void)
{
CurFileCB.fh = HANDLE_AVAILABLE;
CurFileCB.fsize = 0;
}
/*********************************************************************************************************
** 函数名称: FileOpen
** 功能描述: 打开文件.若该文件不存在,则建立一个
** 输入参数: fileName: 文件名或文件路径
** 输出参数: 文件控制块指针,NULL为不能打开文件, 非零值为当前文件控制块的指针
********************************************************************************************************/
FileCB *FileOpen(char *fileName)
{
uint8 reqbuff[6]; // 请求帧控制信息缓存,仅存储请求帧前6个字节的信息
uint8 framedat_rcvbuf[13]; // 应答帧数据域接收缓存
FileCB *FileCBPt;
rwdisk.write_ptr = framedat_rcvbuf; // 设定接收应答帧数据域中数据的接收缓存
/* 获取文件控制块,若没有则返回 */
FileCBPt = GetFCB();
if (NULL == FileCBPt)
{
return (NULL);
}
/* 获取了文件控制块,初始化请求帧控制信息缓存 */
reqbuff[0] = 'U';
reqbuff[1] = ':';
reqbuff[2] = 0x10;
reqbuff[3] = 0xff;
reqbuff[4] = strlen(fileName);
reqbuff[5] = 0;
/* 发送打开文件请求帧 */
SendRequest(reqbuff, 6); // 发送请求帧的前6字节
SendRequest((uint8*)fileName, strlen(fileName));// 发送请求帧的数据域数据(文件名或目录名)
/* 接收应答帧 */
if (Wait_Ack() == TRUE)
{
if (rwdisk.cmds == CMD_SUCCESS)
{
FileCBPt->fh = framedat_rcvbuf[0];
FileCBPt->fsize = framedat_rcvbuf[1] + framedat_rcvbuf[2] * 0x100 + framedat_rcvbuf[3] * 0x10000 + framedat_rcvbuf[4] * 0x1000000;
}
else
{
FileCBPt = NULL;
}
}
else
{
FileCBPt = NULL;
}
return (FileCBPt);
}
/*********************************************************************************************************
** 函数名称: FileClose
** 功能描述: 关闭已打开的文件
** 输入参数: 无
** 输出参数: NO_RESPONSE为没有应答, 否则返回指令执行的状态
********************************************************************************************************/
uint8 FileClose(void)
{
uint8 reqbuff[6];
uint8 framedat_rcvbuf[6]; // 应答帧数据域接收缓存
/* 初始化关闭文件请求帧缓存 */
reqbuff[0] = 'U';
reqbuff[1] = ':';
reqbuff[2] = 0x12;
reqbuff[3] = 0;
reqbuff[4] = 0;
reqbuff[5] = 0;
FreeFCB();
rwdisk.write_ptr = framedat_rcvbuf; // 设定接收应答帧数据域中数据的接收缓存
SendRequest(reqbuff, 6); // 发送命令请求帧
/* 等待文件关闭 */
if (Wait_Ack() == TRUE)
{
return (rwdisk.cmds);
}
else
{
return (NO_RESPONSE);
}
}
/*********************************************************************************************************
** 函数名称: RemoveFile
** 功能描述: 删除指定的文件
** 输入参数: FileName: 文件名或文件路径
** 输出参数: 为0表示正常删除文件,
** 非零值为删除文件失败
********************************************************************************************************/
uint8 RemoveFile(char *FileName)
{
uint8 reqbuff[6];
uint8 framedat_rcvbuf[6]; // 应答帧数据域接收缓存
uint8 namelen;
uint8 ret;
reqbuff[0] = 'U';
reqbuff[1] = ':';
reqbuff[2] = 0x13;
reqbuff[3] = 0xff;
namelen = strlen(FileName);
reqbuff[4] = namelen;
reqbuff[5] = 0;
rwdisk.write_ptr = framedat_rcvbuf;
SendRequest(reqbuff, 6);
SendRequest((uint8*)FileName, namelen);
if (Wait_Ack() == TRUE) // 等待应答完毕
{
if (rwdisk.cmds == CMD_SUCCESS)
{
ret = 0;
}
else
{
ret = rwdisk.cmds;
}
}
else
{
ret = 0xff; // 设备没响应
}
return (ret);
}
/*********************************************************************************************************
** 函数名称: S_FileWrite
** 功能描述: 将小于512字节的数据写入文件
** 输入参数: Buf : 要写的数据所在缓存的地址
** Size : 要写入文件的字节数, 但最大不能超过512字节
** FileCBPt: 文件控制块指针
** 输出参数: 若操作成功则返回实际写入的字节数, 否则返回0
********************************************************************************************************/
uint16 S_FileWrite(void *Buf, uint16 Size, FileCB *FileCBPt)
{
uint8 reqbuff[10];
if (NULL == FileCBPt)
{
return (0);
}
rwdisk.write_ptr = &reqbuff[6]; // 设定接收应答帧数据域中数据的接收缓存
reqbuff[0] = 'U';
reqbuff[1] = ':';
reqbuff[2] = 0x20;
/* 若输入的文件控制块句柄空闲则进一步操作,否则直接返回 */
if (FileCBPt->fh != HANDLE_AVAILABLE)
{
reqbuff[3] = FileCBPt->fh;
}
else
{
return (0);
}
reqbuff[4] = (uint8)Size;
reqbuff[5] = (uint8)(Size / 0x100);
/* 发送写文件请求帧 */
SendRequest(reqbuff, 6);
SendRequest((uint8*)Buf, Size);
/* 等待写文件操作完成 */
if (Wait_Ack() == TRUE)
{
if (rwdisk.cmds != CMD_SUCCESS)
{
return (0);
}
}
else
{
return (0);
}
return (uint16)(reqbuff[6] + reqbuff[7] * 0x100);
}
/*********************************************************************************************************
** 函数名称: S_FileRead
** 功能描述: 读取文件
** 输入参数: Buf :保存所读回数据的缓存地址
** Size :要读入的字节数
** FileCBPt:文件控制块指针
** 输出参数: 实际读到的字节数,但若操作出错或失败则返回0
********************************************************************************************************/
uint16 S_FileRead(void *Buf, uint16 Size, FileCB *FileCBPt)
{
uint8 reqbuff[10];
if (NULL == FileCBPt)
{
return (0);
}
/* 若输入的文件控制块的文件句柄有效则进一步操作,否则直接返回 */
if (FileCBPt->fh != HANDLE_AVAILABLE)
{
reqbuff[3] = FileCBPt->fh;
}
else
{
return (0);
}
rwdisk.write_ptr = (uint8*)Buf; // 设置接收应答帧数据域数据的缓存地址
reqbuff[0] = 'U';
reqbuff[1] = ':';
reqbuff[2] = 0x30;
reqbuff[4] = 4;
reqbuff[5] = 0;
reqbuff[6] = (uint8)Size;
reqbuff[7] = (uint8)(Size / 0x100);
reqbuff[8] = 0;
reqbuff[9] = 0;
SendRequest(reqbuff, 10);
/* 等待应答帧发送完毕 */
if (Wait_Ack() == TRUE)
{
if (rwdisk.cmds != CMD_SUCCESS)
{
return 0;
}
}
else
{
return (0);
}
return ((uint16)rwdisk.wlen); // 返回接收数据的字节数
}
/*********************************************************************************************************
** 函数名称: FileWrite
** 功能描述: 可将字节数大于512的数据块写入文件
** 输入参数: Buf : 要写的数据所在缓存的地址
** Size : 要写入文件的字节数
** FileCBPt: 文件控制块指针
** 输出参数: 实际写的字节数
********************************************************************************************************/
uint32 FileWrite(uint8 *Buf, uint32 Size, FileCB *FileCBPt)
{
uint32 alreadywr_N = 0; // 用于指示已经写入的数据字节数
uint16 bewritten_N = 0; // 每次写操作所实际写入的数据字节数
/* 单次写文件操作所能写入的数据块长度是有限的,所以若写入数据长度超过单次最大写数据长度,就需要分批进行操作 */
while ((Size / MAX_FILE_SIZE) > 0)
{
Size -= MAX_FILE_SIZE;
bewritten_N = S_FileWrite(Buf + alreadywr_N, MAX_FILE_SIZE, FileCBPt);
if (bewritten_N == MAX_FILE_SIZE)
{
alreadywr_N += bewritten_N;
}
else // 写文件出错
{
return (alreadywr_N);
}
}
/* 所需写入的数据少于MAX_FILE_SIZE时的最后一次写操作 */
bewritten_N = 0;
if (Size != 0)
{
bewritten_N = S_FileWrite(Buf+alreadywr_N, (uint16)Size, FileCBPt);
}
return (alreadywr_N+bewritten_N);// 返回已经写入的数据数目
}
/*********************************************************************************************************
** 函数名称: FileRead
** 功能描述: 读取文件
** 输入参数: Buf :保存读回的数据
** Size :要读的字节数
** FileCBPt:文件控制块指针
** 输出参数: 实际读到的字节数
********************************************************************************************************/
uint32 FileRead(uint8 *Buf, uint32 Size, FileCB *FileCBPt)
{
uint32 alreadyrd_N = 0;
uint16 beread_N = 0;
while((Size / MAX_FILE_SIZE) > 0)
{
Size -= MAX_FILE_SIZE;
beread_N = S_FileRead( Buf + alreadyrd_N, MAX_FILE_SIZE, FileCBPt);
if (beread_N == MAX_FILE_SIZE)
{
alreadyrd_N += beread_N;
}
else // 写文件出错
{
return (alreadyrd_N);
}
}
beread_N = 0;
if (Size != 0)
{
beread_N = S_FileRead(Buf + alreadyrd_N, (uint16) Size, FileCBPt);
}
return (alreadyrd_N + beread_N);
}
/*********************************************************************************************************
** 函数名称: FileSeek
** 功能描述: 移动文件读\写位置
** 输入参数: FileCBPt : 文件控制块指针
** offset : 移动偏移量
** move_mode : 移动模式
** SEEK_SET 文件的读写指针移动至文件头位置,并从此处开始移动
** SEEK_CUR 文件的读写指针移动至当前位置,并从此处开始移动
** SEEK_END 文件的读写指针移动至至文件尾,并从此处开始移动
** 输出参数: 成功返回0
** 出错返回非0值
********************************************************************************************************/
uint8 FileSeek(FileCB *FileCBPt, int32 offset, uint8 move_mode)
{
uint8 reqbuff[11];
uint8 framedat_rcvbuf[11]; // 应答帧数据域接收缓存
if (NULL == FileCBPt)
{
return (PARAMETER_ERR);
}
if (FileCBPt->fh != 0xff)
{
reqbuff[3] = FileCBPt->fh;
}
else
{
return (PARAMETER_ERR);
}
rwdisk.write_ptr = framedat_rcvbuf;
reqbuff[0] = 'U';
reqbuff[1] = ':';
reqbuff[2] = 0x40;
reqbuff[4] = 5;
reqbuff[5] = 0;
reqbuff[6] = offset & 0xff;
reqbuff[7] = (offset >> 8) & 0xff;
reqbuff[8] = (offset >> 16) & 0xff;
reqbuff[9] = (offset >> 24) & 0xff;
reqbuff[10] = move_mode;
SendRequest(reqbuff, 11); // 发送命令请求帧
/* 等待应答完毕 */
if (Wait_Ack() == TRUE)
{
return (rwdisk.cmds);
}
else
{
return (0xff);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -