⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _sft.cpp

📁 通过串口发送接受文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// *********************************************

void SFT_MakeFileName(char *buf,char *filename)
{
    char *p,*p1;
    strncpy( buf,filename,32 );
    strupr( buf );
    if( (p=strrchr(buf,'.'))==NULL )return;
    for( p1=p-1;p1>=buf;p1-- )
        {
        if( *p1 != ' ' )break;
        }
    strcpy( p1+1,p );
} 

void SFT_MakeFileInfo(char *buf,int numfiles,char *filenames[])
{
    int i;
    buf[0]=0;
    for( i=0;i<numfiles;i++ )
        {
        SFT_MakeFileName(buf+strlen(buf),filenames[i]);
        strcat(buf,";");
        }
}

int SFT_CheckFileInfo(char *buf,int numfiles,char *filenames[])
{
    int i;
    char filename[128];
    if( numfiles==-1 )return 0;
    for( i=0;i<numfiles;i++ )
        {
        SFT_MakeFileName(filename,filenames[i]);
        if( strstr(buf,filename)==NULL )return -1;
        }
    return 0;
}

// **********************************************

long SFT_GetFileTotalSize(int numfiles,char *filenames[])
{
    int i;
    long totalsize;
    FILE *fp;
    totalsize=0;
    for( i=0;i<numfiles;i++ )
        {
        fp = fopen( filenames[i],"rb" );
        if( fp==NULL )return -1;
        fseek( fp,0,SEEK_END );
        totalsize+=ftell(fp);
        fclose(fp);
        }
    return totalsize;
}

long SFT_GetFileSize(char *filename)
{
    long size;
    FILE *fp;
    fp = fopen( filename,"rb" );
    if( fp==NULL )return -1;
    fseek( fp,0,SEEK_END );
    size = ftell(fp);
    fclose(fp);
    return size;
}

long SFT_GetFileData(char *filename,char *buf,long pos,long len)
{
    long r;
    r=0;
/*    FILE *fp;
    fp = fopen( filename,"rb" );
    if( fp==NULL )return -1;
    fseek(fp,pos,SEEK_SET);
    r = fread(buf,1,len,fp);
    fclose(fp);
*/    return r;
}

long SFT_ClearFile(char *filename)
{
/*    FILE *fp;
    remove(filename);
    fp = fopen( filename,"w+b" );
    if( fp==NULL )return -1;
    fclose(fp);
*/    return 0;
}

long SFT_WriteFileData(char *filename,char *buf,long pos,long len)
{
/*    long r;
    FILE *fp;
    fp = fopen( filename,"r+b" );
    if( fp==NULL )return -1;
    if( fseek(fp,pos,SEEK_SET)!=0 ){ fclose(fp);return -1; };
    r = fwrite(buf,1,len,fp);
    fclose(fp);
    if( r!=len )return -1;
*/    
    return 0;

}

// **********************************************

int SFT_SendFiles(char *machinename,int numfiles,char *filenames[])
{
    U16 serial=0;
    int result=SFT_ERROR;
    int  filecount;
    long totalsize=0,totalprogress=0;
    char currentfile[64]="";
    long currentfilesize=0;
    long currentprogress=0;
    int i;
    char *shortfilenames[128];
    FILE *fp;

//    port=1;
//    SFT_SerialOpen();

    fp=NULL;
    for( i=0;i<numfiles;i++ )shortfilenames[i]=UploadShortFileNames[i];

    filecount = numfiles;
    totalsize = SFT_GetFileTotalSize(numfiles,filenames);
    if( totalsize==-1 ){ result = SFT_SENDFILEERROR; goto end; };

    SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);

    // Send TRANSMIT_REQ
    if( (result=SFT_SendPackage(serial++,TRANSMIT_REQ,machinename,strlen(machinename)+1))!=SFT_OK)goto end;
    // TRANSMIT_FILE_INFO
    *((short int *)SFT_BUF)=numfiles;
    *((long *)(SFT_BUF+2))= totalsize;
    SFT_MakeFileInfo( &SFT_BUF[6],numfiles,shortfilenames );
    if( (result=SFT_SendPackage(serial++,TRANSMIT_FILENAMES,SFT_BUF,6+strlen(SFT_BUF+6)+1))!=SFT_OK)goto end;

    // Transmit Files
    for( i=0;i<filecount;i++ )
        {
        long len;
        SFT_MakeFileName(currentfile,filenames[i]);
        currentprogress=0;
        currentfilesize = SFT_GetFileSize(currentfile);
        if( currentfilesize==-1 ){ result = SFT_SENDFILEERROR; goto end; };
        // Transmit File Info
        *((long *)SFT_BUF)=currentfilesize;
        strcpy( &SFT_BUF[4],shortfilenames[i] );//currentfile );
        // show progress
        SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);
        if( (result=SFT_SendPackage(serial++,TRANSMIT_FILEINFO,SFT_BUF,4+strlen(SFT_BUF+4)+1))!=SFT_OK )goto end;

        fp = fopen( filenames[i],"rb" );
        
        while(1)
            {
            // Send File Data
            len = currentfilesize-currentprogress;
            if( len>PACKAGE_MAX )len=PACKAGE_MAX;

            if( fread(SFT_BUF,1,len,fp)!=(unsigned)len )
                { result = SFT_SENDFILEERROR; goto end; };
//            if( SFT_GetFileData(currentfile,SFT_BUF,currentprogress,len)!=len )

            if( currentprogress+len<currentfilesize )
                result=SFT_SendPackage(serial++,TRANSMIT_FILEDATA,SFT_BUF,len);
            else
                result=SFT_SendPackage(serial++,TRANSMIT_FILEEOF,SFT_BUF,len);
            if( result!=SFT_OK )goto end;
            currentprogress+=len;
            totalprogress+=len;
            // show progress
            SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);
            if( currentprogress >=currentfilesize ){ fclose(fp);fp=NULL;break; };
            }
        }

end:

    if( fp!=NULL )fclose(fp);

    switch( result )
        {
        case SFT_USERBREAK          :SFT_SendPackage(serial,TRANSMIT_USERBREAK,NULL,0);
                                     SFT_Delay(100); SFT_SerialClose(); SFT_SendUserBreak();break;
        case SFT_ERROR              :SFT_SendPackage(serial,TRANSMIT_ERROR,NULL,0);
                                     SFT_Delay(100); SFT_SerialClose(); SFT_SendError();break;
        case SFT_MACHINEDISMATCH    :SFT_Delay(100);SFT_SerialClose();SFT_SendMachineDismatch();break;
        case SFT_FILEDISMATCH       :SFT_Delay(100);SFT_SerialClose();SFT_SendFileDismatch();break;
        case SFT_SENDFILEERROR      :SFT_SendPackage(serial,TRANSMIT_ERROR,NULL,0);
                                     SFT_Delay(100);SFT_SerialClose();SFT_SendOpenFileError();break;
        default                     :SFT_Delay(100);SFT_SerialClose();
        }

    SendResult = result;        
    return result;
}


int SFT_ReceiveFiles(char *machinename,int numfiles,char *filenames[])
{
    U16 serial=0;
    int result=SFT_ERROR;
    unsigned char packagetype;
    U16 datalen;
    short int  filecount;
    long totalsize=0,totalprogress=0;
    char currentfile[64]="";
    long currentfilesize=0;
    long currentprogress=0;
    int i;

    FILE *fp;

//    port=2;
//    SFT_SerialOpen();

//    SFT_SerialWrite('a');
//    SFT_SerialWriteUpdate();

    fp=NULL;

    // Wait TRANSMIT_REQ
    if( (result=SFT_WaitPackage(serial++,&packagetype,SFT_BUF,&datalen))!=SFT_OK )goto end;
    if( packagetype!=TRANSMIT_REQ ){ result=SFT_ERROR; goto end; };
    if( machinename[0]!=0 )
        if( strcmp(machinename,SFT_BUF)!=0 ){ result=SFT_MACHINEDISMATCH; goto end; };
    strcpy(MachineName,SFT_BUF);
    SFT_SerialWrite(SFT_OK);
    SFT_SerialWriteUpdate();
    // Wait TRANSMIT_FILEINFO
    if( (result=SFT_WaitPackage(serial++,&packagetype,SFT_BUF,&datalen))!=SFT_OK )goto end;
    if( packagetype!=TRANSMIT_FILENAMES ){ result=SFT_ERROR; goto end; };
    filecount=*((short int *)SFT_BUF);
    totalsize=*((long *)(SFT_BUF+2));
    if( filecount!=numfiles && numfiles!=-1 ){ result=SFT_FILEDISMATCH; goto end; };
    if( SFT_CheckFileInfo(SFT_BUF+6,numfiles,filenames)!=0 ){ result=SFT_FILEDISMATCH; goto end; };
    SFT_SerialWrite(SFT_OK);
    SFT_SerialWriteUpdate();

    SFT_ReceiveProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);

    // Receive Files
    for( i=0;i<filecount;i++ )
        {
        long len;
        currentprogress=0;
        // Transmit File Info
        if( (result=SFT_WaitPackage(serial++,&packagetype,SFT_BUF,&datalen))!=SFT_OK )goto end;
        if( packagetype!=TRANSMIT_FILEINFO ){ result=SFT_ERROR; goto end; };
        currentfilesize = *((long *)SFT_BUF);
        strcpy( currentfile,SFT_BUF+4 );
        SFT_SerialWrite(SFT_OK);
        SFT_SerialWriteUpdate();
        strcpy( CurrentFileSaveAs,DownloadPath );
        if( CurrentFileSaveAs[strlen(CurrentFileSaveAs)-1]!='\\' )strcat(CurrentFileSaveAs,"\\");

        strcat( CurrentFileSaveAs,currentfile );
        // show progress
        SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);

        fp=fopen( CurrentFileSaveAs,"w+b" );
        if( fp==NULL ){ result = SFT_RECEIVEFILEERROR;goto end; };
//        if( SFT_ClearFile(currentfile)!=SFT_OK ){ result = SFT_RECEIVEFILEERROR;goto end; };

        // Receive File Data
        while(1)
            {
            if( (result=SFT_WaitPackage(serial++,&packagetype,SFT_BUF,&datalen))!=SFT_OK )goto end;
            if( packagetype==TRANSMIT_FILEDATA||packagetype==TRANSMIT_FILEEOF )
                {
//                if( SFT_WriteFileData(currentfile,SFT_BUF,currentprogress,datalen)!=SFT_OK )
                if( fwrite(SFT_BUF,1,datalen,fp)!=(unsigned)datalen )
                    { result = SFT_RECEIVEFILEERROR;goto end; };
                SFT_SerialWrite(SFT_OK);
                SFT_SerialWriteUpdate();
                currentprogress +=datalen;
                totalprogress +=datalen;
                // show progress
                SFT_SendProgress(filecount,totalsize,totalprogress,currentfile,currentfilesize,currentprogress);
                }
            else
                {
                fclose(fp);fp=NULL;
                if( packagetype==TRANSMIT_USERBREAK ){ result=SFT_USERBREAK; }
                else result = SFT_ERROR;
                goto end;
                }
            if( packagetype==TRANSMIT_FILEEOF ){ fclose(fp);fp=NULL; break; };
            }
        }
    
end:
    if( fp!=NULL )fclose(fp);
    switch( result )
        {
        case SFT_USERBREAK  :SFT_SerialWrite(SFT_USERBREAK);SFT_SerialWriteUpdate();
                             SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveUserBreak(); break;
        case SFT_ERROR      :SFT_SerialWrite(SFT_ERROR);SFT_SerialWriteUpdate();
                             SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveError(); break;
        case SFT_MACHINEDISMATCH:SFT_SerialWrite(SFT_MACHINEDISMATCH);SFT_SerialWriteUpdate();
                             SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveMachineDismatch(); break;
        case SFT_FILEDISMATCH:SFT_SerialWrite(SFT_FILEDISMATCH);SFT_SerialWriteUpdate();
                             SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveFileDismatch(); break;
        case SFT_RECEIVEFILEERROR:SFT_SerialWrite(SFT_ERROR);SFT_SerialWriteUpdate();
                             SFT_Delay(100); SFT_SerialClose(); SFT_ReceiveCreateFileError(); break;                             
        default             :SFT_Delay(100); SFT_SerialClose();
        }
    ReceiveResult = result;
    return result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -