Листинг программы (1061443), страница 3
Текст из файла (страница 3)
anResp.SendACK();
// Получение полного пути файла
bRecFlag=sfReceive.Receive(iPathLength, 5);
if (!bRecFlag) // Проверка ошибки приема или разрыва соединения
{
addToConsole(sfReceive.asError);
if (sfReceive.asError.AnsiCompare(_ERRT16)) // Нет разрыва
anResp.SendDisconnect();
else addToConsole(_ERRT17);
cpComPort.CloseComPort();
EndWD();
return;
}
AnsiString asRecFileName((char*)sfReceive.rbuf, iPathLength);
addToConsole("Имя запрашиваемого файла: "+asRecFileName);
if (!FileExists(asRecFileName))
{
addToConsole(_ERRT24);
anResp.SendNAK();
cpComPort.CloseComPort();
EndWD();
return;
}
else anResp.SendACK();
addToConsole("Файл найден");
//Открытие файла
int iFileHandler=FileOpen(asRecFileName, fmOpenRead);
if (iFileHandler==-1)
{
addToConsole(_ERRT11); // Ошибка при открытии файла
setCurrentFile("");
bSendingFileFlag = false;
return;
}
SendFile sfSend(cpComPort.GetComHandle());
int iFileLength=FileSeek(iFileHandler, 0, 2); // Определение размера файла
//*********************************Стандартно********************************
// Передача длины файла
sfSend.Send(&iFileLength, 4);
char cAND=anResp.ReceiveACK(5);
if (cAND=='D') // Разрыв соединения
{
addToConsole(_ERRT17);
FileClose(iFileHandler);
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
bSendingFileFlag = false;
EndWD();
return;
}
cAND=anResp.ReceiveACK(5);
if (cAND!='T') // Открытие файла на принимающей стороне
{
if (cAND=='D') addToConsole(_ERRT17); // Разрыв соединения
else addToConsole(_ERRT14); // Ошибка на принимающей стороне
FileClose(iFileHandler);
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
bSendingFileFlag = false;
EndWD();
return;
}
// Передача файла в порт по блокам
FileSeek(iFileHandler, 0, 0);
int iCurPos=0; //текущая позиция в файле
int iOldPos=0; //старая позиция в файле
int iCount=0; //счетчик закодированных байт
//addToConsole("Начало передачи по блокам. Квитанция получена");
int iUncodSize=cpComPort.GetBlockSize()/2 - 1;
short * usCodBuf=new short[iUncodSize+1]; //массив двубайтных закодированных символов
char * cUncodBuf=new char[iUncodSize]; //массив однобайтных принимаемых символов
// Параметры для ProgressBar
int iBarPos=0;
int iBarDelta;
if (iFileLength%iUncodSize)
iBarDelta=((1000*iUncodSize)/(iFileLength+iUncodSize))+1;
else
iBarDelta=(1000*iUncodSize)/iFileLength;
setProgressBar(0);
char cUncod;
while (iCurPos<iFileLength)
{
iOldPos = iCurPos;
if ((iFileLength-iCurPos) > iUncodSize)
{
FileSeek(iFileHandler, iCurPos, 0);
FileRead(iFileHandler, cUncodBuf, iUncodSize);
usCodBuf[0] = 0x49FF;
for (iCount=0; iCount<iUncodSize; iCount++)
usCodBuf[iCount+1]=EncodeByte(cUncodBuf[iCount]);
iCurPos+=iUncodSize;
} // endif
else
{
FileSeek(iFileHandler, iCurPos, 0);
FileRead(iFileHandler, cUncodBuf, iFileLength-iCurPos);
usCodBuf[0] = 0x4900 + (iFileLength - iCurPos);
for (iCount=0; iCurPos<iFileLength; iCount++, iCurPos++)
usCodBuf[iCount+1]=EncodeByte(cUncodBuf[iCount]);
} // endelse
// Передача блока из буфера в порт
sfSend.Send(usCodBuf, BlockSize);
// Ожидание и получение квитанции о доставке
cAND=anResp.ReceiveACK(5);
if (cAND!='T') // Разрыв соединения или ошибка приема
{
if (cAND=='D')
{
addToConsole(_ERRT17); // Разрыв соединения
FileClose(iFileHandler);
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
bSendingFileFlag = false;
EndWD();
return;
}
else
{
iCurPos = iOldPos;
addToConsole(_ERRT21);
}
}
// Установка ProgressBar
if (cAND=='T')
{
if ((iBarPos+=iBarDelta)>1000) iBarPos=1000;
setProgressBar(iBarPos);
}
} // endwhile
// Файл передан
addToConsole("Файл "+fCurrentFile+" передан");
setProgressBar(1000);
// Закрытие файла
FileClose(iFileHandler);
setCurrentFile("");
// Завершение соединения
bSendingFileFlag = false;
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
addToConsole("Соединение завершено");
EndWD();
}
//===========================================================================
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Form4->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if (StationType == 0)
{
AttemptToConnect = true;
ACK_NAK anConnect(cpComPort.GetComHandle());
anConnect.SendMaster();
char cAND=anConnect.ReceiveACK(100);
if (cAND!='T')
{
if (cAND=='D') addToConsole(_ERRT16);
else if (cAND=='M')
{
addToConsole(_ERRT20);
addToConsole(_ERRT17); // Конфликт
}
else addToConsole(_ERRT15); // Ошибка при установлении соединения
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
AttemptToConnect = false;
EndWD();
return;
}
StationType = 1;
addToConsole("Соединение налажено");
addToConsole("Станция назначена ведущей");
AttemptToConnect = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer3Timer(TObject *Sender)
{
if(cpComPort.IsOpened() && (StationType == 0) && (!AttemptToConnect))
{
// Ожидание квитанции Master
ACK_NAK anAnswer(cpComPort.GetComHandle());
char cAND=anAnswer.ReceiveACK(5);
if (cAND!='M')
{
return;
}
StationType = 2;
addToConsole("Соединение налажено");
addToConsole("Станция назначена ведомой");
anAnswer.SendACK();
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
AnsiString fCurFile = Edit1->Text;
setCurrentFile(fCurFile);
}
//---------------------------------------------------------------------------
Intrface.h
//---------------------------------------------------------------------------
#ifndef interfaceH
#define interfaceH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <Dialogs.hpp>
#include <ComCtrls.hpp>
#include <dir.h>
#include "comport.h"
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupBox1;
TMemo *console;
TOpenDialog *OpenDialog1;
TProgressBar *ProgressBar1;
TComboBox *ComboBox1;
TLabel *Label1;
TLabel *Label2;
TEdit *Edit1;
TButton *Button1;
TButton *Button2;
TTimer *Timer1;
TTimer *Timer2;
TButton *Button3;
TLabel *Label3;
TGroupBox *GroupBox2;
TRadioButton *RadioButton1;
TRadioButton *RadioButton2;
TButton *Button4;
TLabel *Label4;
TEdit *Edit2;
TTimer *Timer3;
void __fastcall QuitProgClick(TObject *Sender); //Выход
void __fastcall FormCreate(TObject *Sender);
void __fastcall ComboBox1Change(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Timer2Timer(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Timer3Timer(TObject *Sender);
void __fastcall Edit1Change(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void addToConsole(AnsiString Mess);
void setProgressBar(int pos);
void EndWOD ();
void EndWD ();
AnsiString fCurrentFile;
void setCurrentFile(AnsiString fNewFile) {this->fCurrentFile = fNewFile;}
AnsiString getCurrentFile() {return this->fCurrentFile;}
ComPort cpComPort;
AnsiString PortName;
int BlockSize;
int BitRate;
bool bSendingFileFlag;
bool bRecievingFileFlag;
char StationType; //0-соединения нет, 1-ведущая, 2-ведомая
bool AttemptToConnect;
void SendFileMS(void);
void ReceiveFileSM(void);
void SendFileSM(void);
void ReceiveFileMS(void);
};
void TForm1::EndWD ()
{
StationType = 0;
}
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Interface1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
USEFORM("interface.cpp", Form1);
USEFORM("interface4.cpp", Form4);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm4), &Form4);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------------------
Errtext.h
#ifndef errtextH
#define errtextH
#define _ERRT01 "Неверное имя порта"
#define _ERRT02 "Размер блока данных превышает максимальный"
#define _ERRT03 "Скорость передачи задана неверно"
#define _ERRT04 "Невозможно открыть порт"
#define _ERRT05 "Ошибка при получении параметров порта"
#define _ERRT06 "Ошибка при установке параметров порта"
#define _ERRT07 "Ошибка при получении тайм-аутов порта"
#define _ERRT08 "Ошибка при установке тайм-аутов порта"
#define _ERRT09 "Ошибка при закрытии порта"
#define _ERRT10 "Файл для передачи не выбран"
#define _ERRT11 "Ошибка при открытии файла"
#define _ERRT12 "Ошибка при чтении из порта"
#define _ERRT13 "Ошибка при передаче параметров соединения"
#define _ERRT14 "Ошибка при сохранении файла на принимающей стороне"
#define _ERRT15 "Ошибка при установлении соединения"
#define _ERRT16 "Истек тайм-аут ожидания"
#define _ERRT17 "Разрыв соединения"
#define _ERRT18 "Завершение соединения"
#define _ERRT19 "Ошибка: кадр поврежден"
#define _ERRT20 "Ошибка: вторая станция тоже хочет стать ведущей"
#define _ERRT21 "Принимающая сторона отвергла кадр"
#define _ERRT22 "Превышен лимит поврежденных кадров"
#define _ERRT23 "Ошибка: принят чужой кадр"
#define _ERRT24 "Файл не найден"
#endif
Comport.h
#ifndef comportH
#define comportH
#include "errtext.h"
#include <SysUtils.hpp>