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

📄 sftupload.cpp

📁 通过串口发送接受文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    char poll_string[9 + 1];
    FILE *fp;
    char filename[12 + 1];
    int  serial_number;
    int  count;
    int  retry;
    int  ret;
    long len;
    long timeout = 0L;
    long starttime;
    char terminal_id[6 + 1];
    char buf[64];
    int i;

    strcpy(terminal_id, UNKNOWN);
    strcpy(MachineID,"");

    FileCount=FileNames->Count;
    TotalFileSize=0;
    for( i=0;i<FileCount;i++ )
      {
      len=fsize( FileNames->Strings[i] );
      if( i<0 )
        {
        strcpy( ErrorString,"打开文件错误" );
        ErrorNo=-2;
        return;
        };
      TotalFileSize+=len;
      };
    strcpy(CurrentFileName,"");
    CurrentFileSize=0;
    UploadedLen=0;
    TotalUploadedLen=0;
    Synchronize(ShowProgress);

  reconnect:
    ret=ComReadString( buf,2000 );

    if( ret==-1 )
      {
      goto reconnect;
      };
    if( ret==-3 )
      {
      strcpy( ErrorString,"用户中断" );
      ErrorNo=-3;
      return;
      };
    if( ret==0 )
      {
      if( memcmp(buf,"AA",2)!=0 )
        {
        goto reconnect;
        };
      strcpy( MachineID,&buf[2] );
      };
    ComWriteString("BB",1000);

    poll_string[0] = 'P';
    strcpy(poll_string + 1, terminal_id);
    poll_string[7] = DLE;
    poll_string[8] = ENQ;
    poll_string[9] = '\0';
    starttime = time(NULL);
    for (;;)
        {
        Com->WriteStr(poll_string,strlen(poll_string),-1);
        if ((ret = receive_block(SFT_rx_buf, 500)) == ERR_USER_BREAK)
          {
          transmit_eot();
          strcpy( ErrorString,"用户中断" );
          ErrorNo=-3;
          return;
          };
        if (ret > 0) break;				// Valid string received
        if (timeout)
            {
            if ((time(NULL) - starttime) > timeout)
              {
              strcpy(ErrorString,"传输超时");
              ErrorNo=-4;
              return;
              };
	    };
        };
    if (SFT_rx_buf[1] != RECV_FILE_REQ)
        {
        transmit_eot();
        strcpy(ErrorString,"传输错误");
        ErrorNo=-5;
        return;
        };
    serial_number = 0x20;
    transmit_ack();
    len = 0;
    SFT_tx_buf[len++] = (unsigned char)serial_number;
    SFT_tx_buf[len++] = TRANSM_REQ;
    strcpy((char *)SFT_tx_buf + len, terminal_id);
    len += 6;
    SFT_tx_buf[len++] = PRIORITY;
    SFT_tx_buf[len++] = 0x1;	// other files
    int_to_asc(SFT_tx_buf + len, FileCount );
    len += 2;
    long_to_asc(SFT_tx_buf + len, TotalFileSize);
    len += 4;
    if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
        {
        transmit_eot();
        strcpy( ErrorString,"用户中断" );
        ErrorNo=-3;
        return;
        };
    retry = 0;
    for (;;)
        {
        if ((ret = receive_block(SFT_rx_buf,TIMEOUT)) > 0)break;
        switch (ret)
            {
            case ERR_BCC_FAIL:
       	    case ERR_TIME_OUT: transmit_nak();
                               retry++;
                               break;
            case ERR_HOST_LOST:
            case ERR_NAK_RECV:
                 if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
                   {
                   transmit_eot();
                   strcpy( ErrorString,"用户中断" );
                   ErrorNo=-3;
                   return;
                   };
		 retry++;
		 break;
	    case ERR_USER_BREAK: transmit_eot();
                                 strcpy( ErrorString,"用户中断" );
                                 ErrorNo=-3;
                                 return;
            case ERR_EOT_HOST: strcpy( ErrorString,"传输错误" );
                               ErrorNo=-5;
                               return;
            };
        if (retry >= RETRIES)
           {
           strcpy( ErrorString,"传输错误" );
           ErrorNo=-5;
           return;
           };
        };
  for( i=0;i<FileCount;i++ )
    {
    if (++serial_number > 0xFF) serial_number = 0x20;
    strcpy( CurrentFileName,FileNames->Strings[i].c_str() );
    if ((fp = fopen(CurrentFileName, "rb")) == NULL)
        {
	transmit_eot();
        strcpy( ErrorString,"打开文件错误" );
        ErrorNo=-2;
        return;
        };
    fseek(fp, 0L, SEEK_END);	// calculate filesize
    CurrentFileSize = ftell(fp);
    fseek(fp, 0L, SEEK_SET);
    len = 0;
    SFT_tx_buf[len++] = (unsigned char) serial_number;
    SFT_tx_buf[len++] = FILE_INFO;
    strcpy( filename,ExtractFileName(FileNames->Strings[i]).c_str() );
    filename[12]=0;
    conv_filename((char *)SFT_tx_buf + len, filename);
    len += 11;
    long_to_asc(SFT_tx_buf + len, CurrentFileSize);
    len += 4;
    if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
      {
      transmit_eot();
      strcpy( ErrorString,"用户中断" );
      ErrorNo=-3;
      return;
      };
    retry = 0;
    for (;;)
        {
	if ((ret = receive_block(SFT_rx_buf,TIMEOUT)) > 0) break;
        switch (ret)
            {
            case ERR_BCC_FAIL:
	    case ERR_TIME_OUT: transmit_nak();
			       retry++;
                               break;
            case ERR_HOST_LOST:
            case ERR_NAK_RECV:
                 if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
                    {
                    fclose(fp);
                    transmit_eot();
                    strcpy( ErrorString,"用户中断" );
                    ErrorNo=-3;
                    return;
                    };
                 retry++;
                 break;
            case ERR_USER_BREAK: fclose(fp);
                                 transmit_eot();
                                 strcpy( ErrorString,"用户中断" );
                                 ErrorNo=-3;
                                 return;
	    case ERR_EOT_HOST: fclose(fp);
                               strcpy( ErrorString,"传输错误" );
                               ErrorNo=-5;
                               return;
            };
        if (retry >= RETRIES)
            {
            fclose(fp);
            strcpy( ErrorString,"传输错误" );
            ErrorNo=-5;
            return;
            };
        };
    UploadedLen = 0L;
    while (UploadedLen < CurrentFileSize )
        {
        Synchronize(ShowProgress);
	if (++serial_number > 0xFF)serial_number = 0x20;
        len = 0;
        SFT_tx_buf[len++] = (unsigned char) serial_number;
        SFT_tx_buf[len++] = TRANSM_DATA;
        if (CurrentFileSize - UploadedLen > 2048L)
            {
	    SFT_tx_buf[len++] = NOT_LAST_BLOCK;
	    count = 2048;
	    }
        else
            {
	    SFT_tx_buf[len++] = LAST_BLOCK;
	    count = (int) (CurrentFileSize - UploadedLen);
	    };
        if (fread(SFT_tx_buf + len, 1, count, fp) < (unsigned long)count)
          {
          fclose(fp);
          strcpy( ErrorString,"读取文件错误" );
          ErrorNo=-6;
          return;
          };
	len += count;
	if (transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
          {
          fclose(fp);
          transmit_eot();
          strcpy( ErrorString,"用户中断" );
          ErrorNo=-3;
          return;
          };
	retry = 0;
	for (;;)
            {
	    if ((ret = receive_block(SFT_rx_buf,TIMEOUT)) > 0) break;
            switch (ret)
                {
                case ERR_BCC_FAIL:
		case ERR_TIME_OUT: transmit_nak();
				   retry++;
				   break;
		case ERR_HOST_LOST:
		case ERR_NAK_RECV:
                     if(transmit_block(SFT_tx_buf,len) == ERR_USER_BREAK)
                       {
                       fclose(fp);
                       transmit_eot();
                       strcpy( ErrorString,"用户中断" );
                       ErrorNo=-3;
                       return;
                       };
                     retry++;
		     break;
		case ERR_USER_BREAK: fclose(fp);
                                     transmit_eot();
                                     strcpy( ErrorString,"用户中断" );
                                     ErrorNo=-3;
                                     return;
		case ERR_EOT_HOST: fclose(fp);
                                   strcpy( ErrorString,"传输错误" );
                                   ErrorNo=-5;
                                   return;
                };
            if (retry >= RETRIES)
              {
              fclose(fp);
              strcpy( ErrorString,"传输错误" );
              ErrorNo=-5;
              return;
              };
            };
        UploadedLen += count;
        TotalUploadedLen+=count;
      }
    UploadedLen=CurrentFileSize;
    Synchronize(ShowProgress);
    fclose(fp);
    };
  transmit_eot();
  ErrorNo=0;
  strcpy(ErrorString,"上载成功");
  TotalUploadedLen=TotalFileSize;
  Synchronize(ShowProgress);
  return;
}


⌨️ 快捷键说明

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