?? udisk.c
字號(hào):
//#include "stdafx.h"
//#include "CommPort.h"
//extern CCommPort Comm;
//#define SendResponse(buff,len) Comm.SendData(buff, NULL, len, 10000, 1, 0, FALSE); //發(fā)送數(shù)據(jù)
#include "config.h"
#include "string.h"
#include "udisk.h"
#ifndef NULL
#define NULL 0
#endif
#define MAX_FILE_SIZE 512
#define WAIT_TIME_OUT 0x2fff
FHANDLE g_handle={0xff,0};
CONTR_DISK rwdisk;
void SendResponse(uint8 *buff,uint16 len);
void FreeFHandle(void);
void ReceOneChar(uint8 ReceChar);
/*********************************************************************************************************
** 函數(shù)名稱: wait_ack
** 功能描述: 等待應(yīng)答幀
**
** 輸 入: 無(wú)
** 輸 出: 正常應(yīng)答返回:TRUE,超時(shí)出錯(cuò)返回:FALSE
********************************************************************************************************/
uint8 wait_ack(void)
{
uint32 i;
rwdisk.state = 0;
for(i=0;i<WAIT_TIME_OUT;i++) // 軟件延時(shí)等待
{
if(0xff==rwdisk.state)
return TRUE;
}
return FALSE;
}
/*
uint8 wait_ack(void)
{
uint8 rt = TRUE ,ret;
uint32 i;
rwdisk.state = 0;
uint8 tempbuff[512];
while(0xff!=rwdisk.state)
{
ret = Comm.ReadBlock(tempbuff, 6,500); // 讀出數(shù)據(jù)
if(ret==0)
{
for(i=0;i<6;i++)
ReceOneChar(tempbuff[i]);
}
else
{
rt = FALSE;
break;
}
if(rwdisk.rlen==0)
break;
ret = Comm.ReadBlock(tempbuff, rwdisk.rlen,500); // 讀出數(shù)據(jù)
if(ret==0)
{
for(i=0; i<rwdisk.rlen; i++)
ReceOneChar(tempbuff[i]);
}
else
{
rt = FALSE;
break;
}
}
return rt;
}
*/
//********************************************************************************************************
// 函數(shù)名稱:ReceOneChar
// 輸入?yún)?shù):ReceCharacter
// 輸出參數(shù):無(wú)
// 功能描述:接收一個(gè)字符處理
// 要求:接收到一個(gè)字符后立即傳入該函數(shù)處理。
//********************************************************************************************************
void ReceOneChar(uint8 ReceChar)
{
static uint8 HFNumber = 0;
static uint8 HFBuffer[6];
static uint16 DataLen;
static uint8 state=0;
if(rwdisk.state!=0)
return;
switch(state)
{
case 0:
HFBuffer[HFNumber++] = ReceChar;
if(HFBuffer[0]!='S') //
if( HFNumber == 2 )
if(HFBuffer[1]!=':')
HFNumber = 0;
if( HFNumber == 6 )
{ HFNumber = 0;
rwdisk.cmd = HFBuffer[2];
rwdisk.cmds = HFBuffer[3];
DataLen = HFBuffer[4] + HFBuffer[5]*0x100;
rwdisk.rlen = DataLen;
rwdisk.wlen = 0;
if(DataLen!=0)
{
state = 1;
}
else
{
rwdisk.state = 0xff; // 設(shè)置狀態(tài)
}
}
break;
case 1:
rwdisk.write_ptr[rwdisk.wlen++] = ReceChar;
if(DataLen==rwdisk.wlen)
{
rwdisk.state = 0xff; // 設(shè)置狀態(tài)
state = 0;
}
break;
default :
break;
}
}
void DriverIni(void)
{
FreeFHandle(); // 釋入文件句柄
rwdisk.state = 0xff; // 不接收串口數(shù)據(jù)
}
/*********************************************************************************************************
** 函數(shù)名稱: GetFHandle
** 功能描述: 獲取文件操作包柄
**
** 輸 入: 無(wú)
** 輸 出: 無(wú)
********************************************************************************************************/
FHANDLE *GetFHandle(void)
{
if(g_handle.fh==0xff)
return &g_handle;
else
return NULL;
}
/*********************************************************************************************************
** 函數(shù)名稱: FreeFHandle
** 功能描述: 釋放文件操作句柄
**
** 輸 入: 無(wú)
** 輸 出: 無(wú)
********************************************************************************************************/
void FreeFHandle(void)
{
g_handle.fh = 0xff;
g_handle.fsize = 0;
}
/*********************************************************************************************************
** 函數(shù)名稱: GetDiskInfo
** 功能描述: 獲取系統(tǒng)信息
**
** 輸 入: sysinfptr:系統(tǒng)信息數(shù)據(jù)結(jié)構(gòu)指針
** 輸 出: 正常設(shè)置返回:TRUE,出錯(cuò)返回:FALSE
********************************************************************************************************/
uint8 GetDiskInfo(SYSINF *sysinfptr)
{
uint8 reqbuff[14];
reqbuff[0] = 'U'; reqbuff[1]= ':'; reqbuff[2] = 0x00;
reqbuff[3] = 0; reqbuff[4] = 0; reqbuff[5] = 0;
SendResponse(reqbuff,6); // 發(fā)送命令請(qǐng)求幀
sysinfptr->DiskIn = 0; // 標(biāo)記U盤(pán)不存在
rwdisk.write_ptr = reqbuff;
if(wait_ack()) // 等待應(yīng)答
{
if(rwdisk.cmds==0)
{ sysinfptr->Baud = reqbuff[0];
sysinfptr->Year = reqbuff[1];
sysinfptr->Month= reqbuff[2];
sysinfptr->Dom = reqbuff[3];
sysinfptr->Hour = reqbuff[4];
sysinfptr->Min = reqbuff[5];
sysinfptr->Sec = reqbuff[6];
sysinfptr->DiskIn= reqbuff[7];
sysinfptr->FH.fh= reqbuff[8];
sysinfptr->FH.fsize= reqbuff[9]+
reqbuff[10]*0x100+
reqbuff[11]*0x10000+
reqbuff[12]*0x1000000;
sysinfptr->version = reqbuff[13];
return TRUE;
}
}
return FALSE;
}
/*********************************************************************************************************
** 函數(shù)名稱: SetDiskInfo
** 功能描述: 設(shè)置系統(tǒng)信息
**
** 輸 入: sysinfptr:系統(tǒng)信息數(shù)據(jù)結(jié)構(gòu)指針
** 輸 出: 正常設(shè)置返回:TRUE,出錯(cuò)返回:FALSE
********************************************************************************************************/
uint8 SetDiskInfo(SYSINF *sysinfptr)
{
uint8 reqbuff[13];
reqbuff[0] = 'U'; reqbuff[1]= ':'; reqbuff[2] = 0x01;
reqbuff[3] = 0; reqbuff[4] = 7; reqbuff[5] = 0;
reqbuff[6] = sysinfptr->Baud ;
reqbuff[7] = sysinfptr->Year ;
reqbuff[8] = sysinfptr->Month;
reqbuff[9] = sysinfptr->Dom;
reqbuff[10] = sysinfptr->Hour;
reqbuff[11] = sysinfptr->Min;
reqbuff[12] = sysinfptr->Sec;
SendResponse(reqbuff,13); // 發(fā)送命令請(qǐng)求幀
rwdisk.write_ptr = reqbuff;
if(wait_ack())// 等待應(yīng)答
{
if(rwdisk.cmds==0)
{
return TRUE;
}
}
return FALSE;
}
/*********************************************************************************************************
** 函數(shù)名稱: FileOpen
** 功能描述: 以指定方式打開(kāi)文件
**
** 輸 入: DirFileName:用戶使用的文件名
** 輸 出: 文件句柄,NULL為不能打開(kāi)
** 非零值為打開(kāi)文件的指針
**
********************************************************************************************************/
FHANDLE *FileOpen(char *DirFileName)
{
uint8 reqbuff[6];
uint8 namelen;
FHANDLE *handle;
handle = GetFHandle();
if(handle==NULL) // 沒(méi)有可用的包柄
return handle;
reqbuff[0] = 'U';reqbuff[1]= ':';
reqbuff[2] = 0x10;reqbuff[3] = 0xff;
namelen = strlen(DirFileName); // 獲取文件名字符串長(zhǎng)度
reqbuff[4] = namelen; reqbuff[5] = 0;
SendResponse(reqbuff,6); // 發(fā)送命令請(qǐng)求幀
SendResponse((uint8*)DirFileName,namelen); // 發(fā)送命令請(qǐng)求幀
rwdisk.write_ptr = reqbuff;
if(wait_ack())// 等待應(yīng)答
{
if(rwdisk.cmds==0)
{ handle->fh = reqbuff[0];
handle->fsize = reqbuff[1]+
reqbuff[2]*0x100+
reqbuff[3]*0x10000+
reqbuff[4]*0x1000000;
}
else
handle = NULL;
}
else
handle = NULL;
return handle;
}
/*********************************************************************************************************
** 函數(shù)名稱: FileClose
** 功能描述: 關(guān)閉指定文件
**
** 輸 入: Handle:文件句柄
**
** 輸 出: RETURN_OK:成功
** 其它參考fat.h中關(guān)于返回值的說(shuō)明
********************************************************************************************************/
uint8 FileClose(void)
{
uint8 reqbuff[6];
reqbuff[0] = 'U'; reqbuff[1]= ':'; reqbuff[2] = 0x12;
reqbuff[3] = 0; reqbuff[4] = 0; reqbuff[5] = 0;
FreeFHandle();
rwdisk.write_ptr = reqbuff;
SendResponse(reqbuff,6); // 發(fā)送命令請(qǐng)求幀
if(wait_ack())// 等待應(yīng)答
{
return rwdisk.cmds;
}
else
return 0xf0; // 沒(méi)應(yīng)答
}
/*********************************************************************************************************
** 函數(shù)名稱: S_FileWrite
** 功能描述: 寫(xiě)文件
**
** 輸 入: Buf:要寫(xiě)的數(shù)據(jù)
** Size:要寫(xiě)的字節(jié)數(shù)
** Handle:文件句柄
** 輸 出: 實(shí)際寫(xiě)的字節(jié)數(shù)
********************************************************************************************************/
uint16 S_FileWrite(void *Buf, uint16 Size, FHANDLE *Handle)
{
uint8 reqbuff[10];
if(Handle==NULL) return 0;
reqbuff[0] = 'U';reqbuff[1]= ':'; reqbuff[2] = 0x20;
if(Handle->fh!=0xff) reqbuff[3] = Handle->fh;
else return 0;
reqbuff[4] = (uint8)Size;
reqbuff[5] = (uint8)(Size/0x100);
rwdisk.write_ptr = &reqbuff[6];
SendResponse(reqbuff,6); // 發(fā)送命令請(qǐng)求幀
SendResponse((uint8*)Buf,Size); // 發(fā)送命令請(qǐng)求幀
/*
uint8 tempbuf[512+6];
memcpy(tempbuf,reqbuff,6);
memcpy(tempbuf+6,Buf,Size);
SendResponse(tempbuf,6+Size);
*/
if(wait_ack())// 等待應(yīng)答
{ if(rwdisk.cmds!=0)
return 0;
}
else
return 0;
return (uint16)(reqbuff[6]+reqbuff[7]*0x100); // reqbuff[8],reqbuff[9] 不處理
}
/*********************************************************************************************************
** 函數(shù)名稱: FileWrite
** 功能描述: 寫(xiě)文件
**
** 輸 入: Buf:要寫(xiě)的數(shù)據(jù)
** Size:要寫(xiě)的字節(jié)數(shù)
** Handle:文件句柄
** 輸 出: 實(shí)際寫(xiě)的字節(jié)數(shù)
********************************************************************************************************/
uint32 FileWrite(uint8 *Buf, uint32 Size, FHANDLE *Handle)
{
uint32 allwrite=0;
uint16 bewrite;
while((Size/MAX_FILE_SIZE)>0)
{
Size -= MAX_FILE_SIZE;
bewrite = S_FileWrite( Buf+allwrite,MAX_FILE_SIZE,Handle);
if(bewrite == MAX_FILE_SIZE)
{
allwrite += bewrite;
}
else // 寫(xiě)文件出錯(cuò)
{
return allwrite;
}
}
bewrite = 0;
if(Size)
{
bewrite = S_FileWrite(Buf+allwrite,(uint16) Size,Handle);
}
return allwrite+bewrite;
}
/*********************************************************************************************************
** 函數(shù)名稱: FileRead
** 功能描述: 讀取文件
**
** 輸 入: Buf:保存讀回的數(shù)據(jù)
** Size:要讀的字節(jié)數(shù)
** Handle:文件句柄
** 輸 出: 實(shí)際讀到的字節(jié)數(shù)
********************************************************************************************************/
uint16 S_FileRead(void *Buf, uint16 Size, FHANDLE *Handle)
{
uint8 reqbuff[10];
if(Handle==NULL) return 0;
reqbuff[0] = 'U';reqbuff[1]= ':'; reqbuff[2] = 0x30;
if(Handle->fh!=0xff) reqbuff[3] = Handle->fh;
else return 0;
reqbuff[4] = 4;
reqbuff[5] = 0;
reqbuff[6] = (uint8)Size;
reqbuff[7] = (uint8)(Size/0x100);
reqbuff[8] = 0;
reqbuff[9] = 0;
rwdisk.write_ptr = (uint8*)Buf;
SendResponse(reqbuff,10); // 發(fā)送命令請(qǐng)求幀
if(wait_ack())// 等待應(yīng)答
{ if(rwdisk.cmds!=0)
return 0;
}
else return 0;
return (uint16)rwdisk.wlen;
}
/*********************************************************************************************************
** 函數(shù)名稱: FileRead
** 功能描述: 讀取文件
**
** 輸 入: Buf:保存讀回的數(shù)據(jù)
** Size:要讀的字節(jié)數(shù)
** Handle:文件句柄
** 輸 出: 實(shí)際讀到的字節(jié)數(shù)
********************************************************************************************************/
uint32 FileRead(uint8 *Buf, uint32 Size, FHANDLE *Handle)
{
uint32 allread=0;
uint16 beread;
while((Size/MAX_FILE_SIZE)>0)
{
Size -= MAX_FILE_SIZE;
beread = S_FileRead( Buf+allread,MAX_FILE_SIZE,Handle);
if(beread==MAX_FILE_SIZE)
{
allread += beread;
}
else // 寫(xiě)文件出錯(cuò)
{
return allread;
}
}
beread = 0;
if(Size)
{
beread = S_FileRead(Buf+allread,(uint16) Size,Handle);
}
return allread+beread;
}
/*********************************************************************************************************
** 函數(shù)名稱: FileSeek
** 功能描述: 移動(dòng)文件讀\寫(xiě)位置
**
** 輸 入: Handle:文件句柄
** offset:移動(dòng)偏移量
** Whence:移動(dòng)模式SEEK_SET:從文件頭計(jì)算SEEK_CUR:從當(dāng)前位置計(jì)算SEEK_END:從文件尾計(jì)算
** 輸 出: 成功返回0
** 出錯(cuò)返回非0值
********************************************************************************************************/
uint8 FileSeek(FHANDLE *Handle, int32 offset, uint8 Whence)
{
uint8 reqbuff[11];
if(Handle==NULL) return PARAMETER_ERR;
reqbuff[0] = 'U'; reqbuff[1]= ':'; reqbuff[2] = 0x40;
if(Handle->fh!=0xff)
reqbuff[3] = Handle->fh;
else
return PARAMETER_ERR;
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] = Whence;
rwdisk.write_ptr = reqbuff;
SendResponse(reqbuff,11); // 發(fā)送命令請(qǐng)求幀
if(wait_ack())// 等待應(yīng)答
{
return rwdisk.cmds;
}
else
return 0xff;
}
/*********************************************************************************************************
** 函數(shù)名稱: MakeDir
** 功能描述: 建立目錄
**
** 輸 入: Path:路徑名
**
** 輸 出: 成功返回0
** 出錯(cuò)返回非0值
********************************************************************************************************/
uint8 MakeDir(char *Path)
{
uint8 reqbuff[6];
uint8 namelen;
uint8 rt;
reqbuff[0] = 'U';reqbuff[1]= ':';
reqbuff[2] = 0x50;reqbuff[3] = 0xff;
namelen = strlen(Path); // 獲取文件夾名字符串長(zhǎng)度
reqbuff[4] = namelen; reqbuff[5] = 0;
SendResponse(reqbuff,6); // 發(fā)送命令請(qǐng)求幀
SendResponse((uint8*)Path,namelen); // 發(fā)送命令請(qǐng)求幀
rwdisk.write_ptr = reqbuff;
if(wait_ack()) // 等待應(yīng)答
{
rt = rwdisk.cmds;
}
else
rt = 0xff;
return rt;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -