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

📄 _sft.cpp

📁 通过串口发送接受文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <vcl.h>
#include "time.h"
#include "dos.h"
#include "Comport.h"

#define U8 unsigned char
#define U16 unsigned short int
#define S16 short int

#include "_SFT.h"
#include <string.h>
#include <stdio.h>

extern TComport *Com;

extern char UploadShortFileNames[30][128];

extern char DownloadPath[128];

extern bool Downloading;
extern bool DownloadStop;
extern bool Uploading;
extern bool UploadStop;

char    MachineName[128];
int     FileCount;
long    TotalSize;
int     TotalProgress;
char    CurrentFile[128];
char    CurrentFileSaveAs[128];
long    CurrentSize;
int     CurrentProgress;

int      ReceiveResult;
char     ReceiveResultMsg[128];
int      SendResult;
char     SendResultMsg[128];

#define TRANSMIT_REQ        0x01
#define TRANSMIT_FILENAMES  0x02
#define TRANSMIT_ERROR      0x03
#define TRANSMIT_USERBREAK  0x04
#define TRANSMIT_FILEINFO   0x05
#define TRANSMIT_FILEDATA   0x06
#define TRANSMIT_FILEEOF    0x07

#define SFT_BOF 0xC0
#define SFT_EOF 0xC1
#define SFT_XCH 0xCE

#define SFT_OK              0
#define SFT_ERROR           -1
#define SFT_TIMEOUT         -2
#define SFT_USERBREAK       -3
#define SFT_RETRY           -4
#define SFT_FILEDISMATCH    -5
#define SFT_MACHINEDISMATCH -6
#define SFT_SENDFILEERROR   -7
#define SFT_RECEIVEFILEERROR -8

#define PACKAGE_MAX 1024

static char SFT_BUF[PACKAGE_MAX];
static char SFT_TX_BUF[PACKAGE_MAX*2+16];
static int  SFT_TX_BUF_LEN=0;
int port;

// Functions of I/O
void SFT_Delay(int ms)
{
//    Sleep(ms);
}

long SFT_GetTimeInMs(void)
{
    struct time t;
    gettime(&t);
    return (((unsigned long)t.ti_hour*60L+(unsigned long)t.ti_min)*60L+(unsigned long)t.ti_sec)*1000L+(unsigned long)t.ti_hund*10L;
}

int SFT_SerialOpen(void)
{
    int r;
    r=0;
//    r = com->Open(port);
//    com->SetBaudRate(115200);
    SFT_TX_BUF_LEN=0;
    return r;
}

void SFT_SerialClose(void)
{
//    com->Close();
}

void SFT_SerialWrite(char c)
{
    SFT_TX_BUF[SFT_TX_BUF_LEN++]=c;
}

void SFT_SerialWriteUpdate(void)
{
    Com->Write(SFT_TX_BUF,SFT_TX_BUF_LEN);
    SFT_TX_BUF_LEN=0;
}

int SFT_SerialRead(char *c,int timeout_ms)
{
    if( Uploading && UploadStop )return SFT_USERBREAK;
    if( Downloading && DownloadStop )return SFT_USERBREAK;
//    if( Stop==1 ){ Stop=0;return SFT_USERBREAK; }
    switch( Com->ReadChar(c,timeout_ms ) )
        {
        case 0:return SFT_OK;
        case -1:return SFT_TIMEOUT;
        default:return SFT_ERROR;
        }
//    long start;
//    start = SFT_GetTimeInMs();
//    while( SFT_GetTimeInMs()-start < timeout_ms )
//        {
//        if( com->ReadChar(c)==true )return SFT_OK;
//        };
//    return SFT_TIMEOUT;
//    return USERBREAK;
}

// Functions of Display Message

void SFT_SendOpenFileError(void)
{
    strcpy( SendResultMsg,"打开文件错误,发送失败" );
//    Application->MessageBox("打开文件失败","ERROR",MB_ICONERROR|MB_OK);
}

void SFT_SendError(void)
{
    strcpy( SendResultMsg,"发送失败" );
//    Application->MessageBox("发送失败","ERROR",MB_ICONERROR|MB_OK);
}

void SFT_SendUserBreak(void)
{
    strcpy( SendResultMsg,"发送被取消" );
//    Application->MessageBox("发送被取消","ERROR",MB_ICONERROR|MB_OK);
}

void SFT_SendMachineDismatch(void)
{
    strcpy( SendResultMsg,"接收方拒绝接收本机数据" );
//    Application->MessageBox("接收方拒绝接收本机的数据","ERROR",MB_ICONERROR|MB_OK);
}

void SFT_SendFileDismatch(void)
{
    strcpy( SendResultMsg,"接收方拒绝接收这些文件" );
//    Application->MessageBox("接收方拒绝接收这些文件","ERROR",MB_ICONERROR|MB_OK);
}

void SFT_SendProgress(int filecount,long totalsize,long totalprogress,char *currentfile,long currentfilesize,long currentprogress)
{
    FileCount = filecount;
    TotalSize = totalsize;
    TotalProgress = totalprogress;
    strcpy(CurrentFile,currentfile);
    CurrentSize = currentfilesize;
    CurrentProgress = currentprogress;
}


void SFT_ReceiveError(void)
{
    strcpy( ReceiveResultMsg,"接收失败" );
//    Application->MessageBox("接收失败","ERROR",MB_OK|MB_ICONERROR);
}

void SFT_ReceiveUserBreak(void)
{
    strcpy( ReceiveResultMsg,"接收被取消" );
//    Application->MessageBox("接收被取消","ERROR",MB_ICONERROR|MB_OK);
}

void SFT_ReceiveFileDismatch(void)
{
    strcpy( ReceiveResultMsg,"文件不匹配,请发送指定的文件" );
//    Application->MessageBox("文件不匹配,请发送指定的文件","ERROR",MB_ICONERROR|MB_OK);
}

void SFT_ReceiveMachineDismatch(void)
{
    strcpy( ReceiveResultMsg,"发送方机器不对,请用指定的机器传输" );
//    Application->MessageBox("发送方机器不对,请用指定的机器传输","ERROR",MB_ICONERROR|MB_OK);
}

void SFT_ReceiveCreateFileError(void)
{
    strcpy( ReceiveResultMsg,"创建文件错误,接收失败" );
//    Application->MessageBox("创建文件失败","ERROR",MB_ICONERROR|MB_OK);
}

void SFT_ReceiveProgress(int filecount,long totalsize,long totalprogress,char *currentfile,long currentfilesize,long currentprogress)
{
    FileCount = filecount;
    TotalSize = totalsize;
    TotalProgress = totalprogress;
    strcpy(CurrentFile,currentfile);
    CurrentSize = currentfilesize;
    CurrentProgress = currentprogress;
}

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

void SFT_SerialWriteXCH(unsigned char c)
{
    if( c==SFT_BOF || c==SFT_EOF || c==SFT_XCH || c==0x0d || c==0x11 || c==0x13){ SFT_SerialWrite(SFT_XCH);SFT_SerialWrite(c^0x20); }
    else SFT_SerialWrite(c);
}

int SFT_SendPackage(U8 serial,U8 packagetype,U8 *data,U16 datalen)
{
    U8 checksum;
    int i,result;
    int retry=0;
    signed char r;

    while( retry<10 )
        {
        SFT_SerialWrite(SFT_BOF);
        SFT_SerialWriteXCH(serial);
        SFT_SerialWriteXCH(packagetype);
        // make checksum
        checksum=0xFF^SFT_BOF^SFT_EOF^serial^packagetype;
        for( i=0;i<datalen;i++ )checksum^=data[i];
        SFT_SerialWriteXCH(checksum);
        // write data
        for( i=0;i<datalen;i++ )SFT_SerialWriteXCH(data[i]);
        SFT_SerialWrite(SFT_EOF);
        SFT_SerialWriteUpdate();
                
        if( packagetype!=TRANSMIT_ERROR && packagetype!=TRANSMIT_USERBREAK )
            {
            int j;
            for( j=0;j<10;j++ )
                {
                result=SFT_SerialRead(&r,100);
                if( result==SFT_OK )
                    {
                    switch( r )
                        {
                        case SFT_TIMEOUT            :break;
                        case SFT_RETRY              :break;
                        case SFT_OK                 :return SFT_OK;
                        case SFT_USERBREAK          :return SFT_USERBREAK;
                        case SFT_MACHINEDISMATCH    :return SFT_MACHINEDISMATCH;
                        case SFT_FILEDISMATCH       :return SFT_FILEDISMATCH;
                        default                     :return SFT_ERROR;
                        }
                    }
                else if( result==SFT_USERBREAK )
                    return SFT_USERBREAK;
                }
            }
        else
            {
            return SFT_OK;
            }
//        retry++;
        }
        
    return SFT_ERROR;
}

int SFT_WaitPackage(U8 serial,U8 *packagetype,U8 *data,U16 *datalen)
{
    U8 c,checksum;
    U8 serial1,checksum1;
    int status,k,result;
    int i;

wait:    
    status = -1;
    while(1)
        {
        result=SFT_SerialRead(&c,100);
        if( result==SFT_USERBREAK )return SFT_USERBREAK;
        if( result==SFT_TIMEOUT )continue;
        if( c==SFT_BOF ){ status=0;k=0;continue; }
        if( c==SFT_EOF&&status>=0 )break;
        if( c==SFT_XCH ){ status=1;continue; };
        if( status==1 ){ c=c^0x20;status=0; };

        if( k==0 )serial1=c;
        if( k==1 )*packagetype=c;
        if( k==2 )checksum1=c;
        if( k>2 )data[k-3]=c;
        k++;
        if( k-3>PACKAGE_MAX )return SFT_ERROR;
        }

    if( serial<serial1 )return SFT_ERROR;
    if( serial>serial1 && serial1==0 )return SFT_ERROR;
    if( serial==serial1+1 ){ SFT_SerialWrite(SFT_OK);goto wait; };

    k=k-3;
    checksum=0xFF^SFT_BOF^SFT_EOF^serial1^(*packagetype);
    for( i=0;i<k;i++ )checksum ^= data[i];

    if( checksum!=checksum1 )
        {
        SFT_SerialWrite(SFT_RETRY);
        goto wait;
        }

    *datalen = k;

    return SFT_OK;
}

⌨️ 快捷键说明

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