Листинг программы (1061443), страница 2
Текст из файла (страница 2)
bool bRecFlag;
int iFileLength;
bRecFlag=rfReceive.ReceiveInt(5);
if (!bRecFlag) // Проверка ошибки приема или разрыва соединения
{
addToConsole(rfReceive.asError);
if (rfReceive.asError.AnsiCompare(_ERRT16)) // Нет разрыва
anResp.SendDisconnect();
else addToConsole(_ERRT17);
cpComPort.CloseComPort();
EndWD();
return;
}
iFileLength=rfReceive.ibuf;
anResp.SendACK();
addToConsole("Размер получаемого файла: "+IntToStr(iFileLength)+" байт");
// Получение полного пути для сохраняемого файла
char buffer[MAXPATH];
getcwd(buffer, MAXPATH);
AnsiString asFilePath(buffer);
asFilePath=asFilePath+"\\upload\\";
asFilePath=asFilePath+asFileName; // Путь и имя сохраняемого файла
// Создание файла
int iFileHandler;
if (!FileExists(asFilePath))
iFileHandler=FileCreate(asFilePath);
else
iFileHandler=FileOpen(asFilePath, fmOpenWrite);
if (iFileHandler==-1)
{
anResp.SendNAK();
addToConsole(_ERRT14); // Ошибка при открытии файла
cpComPort.CloseComPort();
EndWD();
return;
}
addToConsole("Файл создан и открыт");
anResp.SendACK();
// Параметры для ProgressBar
int iBarPos=0;
int iBarDelta;
int iUncodSize=cpComPort.GetBlockSize()/2-1;
if (iFileLength%iUncodSize)
iBarDelta=((1000*iUncodSize)/(iFileLength+iUncodSize))+1;
else
iBarDelta=(1000*iUncodSize)/iFileLength;
setProgressBar(0);
//------------------------------------------------------------------------------
// Получение файла из порта по блокам
FileSeek(iFileHandler, 0, 0);
int iStPos=0;
int iCount=0;
short int Buf, I, InfoLength;
char * cUncodBuf=new char[iUncodSize];
BlockSize = 512;
char ErrorCount = 0, Err = 0, Err2 = 0;
while (iStPos<iFileLength)
{
// Получение блока из порта в буфер
bRecFlag=rfReceive.ReceiveBytes(BlockSize, 5);
if (!bRecFlag) // Проверка ошибки приема или разрыва соединения
{
addToConsole(rfReceive.asError);
if (rfReceive.asError.AnsiCompare(_ERRT16)) // Нет разрыва
anResp.SendNAK();
else addToConsole(_ERRT17);
FileClose(iFileHandler);
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
EndWD();
return;
}
Buf = rfReceive.sibuf[0];
I = Buf >> 8;
InfoLength = Buf & 0x00FF;
Err2 = 0;
if (I != 0x49)
{
anResp.SendNAK();
addToConsole(_ERRT23);
Err2 = 1;
}
// Декодирование входного буфера
Err = 0;
for (iCount=0; iCount<iUncodSize; iCount++)
{
DecodeByte(rfReceive.sibuf[iCount+1],cUncodBuf[iCount],Err);
if (Err) break;
}
if (Err)
{
ErrorCount++;
if (ErrorCount<=MaxErr)
{
anResp.SendNAK();
addToConsole(_ERRT19);
}
else
{
anResp.SendDisconnect();
addToConsole(_ERRT22);
addToConsole(_ERRT17);
FileClose(iFileHandler);
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
EndWD();
return;
}
}
if (!Err && !Err2)
{
FileSeek(iFileHandler, iStPos, 0);
FileWrite(iFileHandler, cUncodBuf, InfoLength);
iStPos+=InfoLength;
// Передача квитанции о доставке
anResp.SendACK();
// Установка ProgressBar
if ((iBarPos+=iBarDelta)>1000) iBarPos=1000;
setProgressBar(iBarPos);
}
} // endwhile
// Файл получен
addToConsole("Получен файл: "+asFilePath);
setProgressBar(1000);
// Закрытие файла
FileClose(iFileHandler);
// Завершение соединения
bRecievingFileFlag = false;
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
addToConsole("Соединение завершено");
EndWD();
}
//---------------------------------------------------------------------------
//Нажатие кнопки "Принять/послать"
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (RadioButton2 -> Checked) SendFileMS();
if (RadioButton1 -> Checked) ReceiveFileMS();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(FileExists(Edit1->Text) && cpComPort.IsOpened())Button2->Enabled=true;else Button2->Enabled=false;
if (StationType == 1) Edit2->Text = "ведущая";
else if (StationType == 2) Edit2->Text = "ведомая";
else Edit2->Text = "нет соединения";
if (!cpComPort.IsOpened()) Button4 -> Enabled = false;
else Button4 -> Enabled = true;
if (StationType == 0)
{
ComboBox1 -> Enabled = true;
RadioButton1 -> Enabled = false;
RadioButton2 -> Enabled = false;
Edit1 -> Enabled = false;
Button1 -> Enabled = false;
Button2 -> Enabled = false;
}
else
{
ComboBox1 -> Enabled = false;
Button4 -> Enabled = false;
if (StationType == 2)
{
RadioButton1 -> Enabled = false;
RadioButton2 -> Enabled = false;
Edit1 -> Enabled = false;
Button1 -> Enabled = false;
Button2 -> Enabled = false;
}
else
{
RadioButton1 -> Enabled = true;
RadioButton2 -> Enabled = true;
Button2 -> Enabled = true;
if (RadioButton1 -> Checked)
{
Button1 -> Enabled = false;
Edit1 -> Enabled = true;
}
else
{
Button1 -> Enabled = true;
Edit1 -> Enabled = false;
}
}
}
}
//---------------------------------------------------------------------------
// Реакция ведомой станции на сигнал ведущей
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
if(cpComPort.IsOpened() && !bSendingFileFlag && !bRecievingFileFlag && (StationType==2))
{
// Настройка классов
ReceiveFile rfReceive(cpComPort.GetComHandle());
ACK_NAK anResp(cpComPort.GetComHandle());
// Подтверждение возобновления соединения
char cAND=anResp.ReceiveACK(5);
if ((cAND!='A')&&(cAND!='G')) return;
if (cAND=='G')ReceiveFileSM();
if (cAND=='A')SendFileSM();
}
}
//============================================================================//
// Получение файла от ведущей станции ведомой
void TForm1::ReceiveFileSM(void)
{
// Настройка классов
ReceiveFile rfReceive(cpComPort.GetComHandle());
ACK_NAK anResp(cpComPort.GetComHandle());
bRecievingFileFlag = true;
anResp.SendACK();
// *** Получение файла *** //
int iFileLength, iNameLength;
// Получение длины имени файла
bool bRecFlag=rfReceive.ReceiveInt(5);
if (!bRecFlag) // Проверка ошибки приема или разрыва соединения
{
addToConsole(rfReceive.asError);
if (rfReceive.asError.AnsiCompare(_ERRT16)) // Нет разрыва
anResp.SendDisconnect();
else addToConsole(_ERRT17);
cpComPort.CloseComPort();
EndWD();
return;
}
iNameLength=rfReceive.ibuf;
anResp.SendACK();
// Получение имени файла
bRecFlag=rfReceive.Receive(iNameLength, 5);
if (!bRecFlag) // Проверка ошибки приема или разрыва соединения
{
addToConsole(rfReceive.asError);
if (rfReceive.asError.AnsiCompare(_ERRT16)) // Нет разрыва
anResp.SendDisconnect();
else addToConsole(_ERRT17);
cpComPort.CloseComPort();
EndWD();
return;
}
AnsiString asRecFileName((char*)rfReceive.rbuf, iNameLength);
addToConsole("Имя получаемого файла: "+asRecFileName);
anResp.SendACK();
/**************************стандартно***********************************/
// Получение длины файла
bRecFlag=rfReceive.ReceiveInt(5);
if (!bRecFlag) // Проверка ошибки приема или разрыва соединения
{
addToConsole(rfReceive.asError);
if (rfReceive.asError.AnsiCompare(_ERRT16)) // Нет разрыва
anResp.SendDisconnect();
else addToConsole(_ERRT17);
cpComPort.CloseComPort();
EndWD();
return;
}
iFileLength=rfReceive.ibuf;
anResp.SendACK();
addToConsole("Размер получаемого файла: "+IntToStr(iFileLength)+" байт");
// Получение полного пути для сохраняемого файла
char buffer[MAXPATH];
getcwd(buffer, MAXPATH);
AnsiString asFilePath(buffer);
asFilePath=asFilePath+"\\upload\\";
asFilePath=asFilePath+asRecFileName; // Путь и имя сохраняемого файла
// Создание файла
int iFileHandler;
if (!FileExists(asFilePath))
iFileHandler=FileCreate(asFilePath);
else
iFileHandler=FileOpen(asFilePath, fmOpenWrite);
if (iFileHandler==-1)
{
anResp.SendNAK();
addToConsole(_ERRT14); // Ошибка при открытии файла
cpComPort.CloseComPort();
EndWD();
return;
}
anResp.SendACK();
// Параметры для ProgressBar
int iBarPos=0;
int iBarDelta;
int iUncodSize=cpComPort.GetBlockSize()/2-1;
if (iFileLength%iUncodSize)
iBarDelta=((1000*iUncodSize)/(iFileLength+iUncodSize))+1;
else
iBarDelta=(1000*iUncodSize)/iFileLength;
setProgressBar(0);
//------------------------------------------------------------------------------
// Получение файла из порта по блокам
FileSeek(iFileHandler, 0, 0);
int iStPos=0;
int iCount=0;
short int Buf, I, InfoLength;
char * cUncodBuf=new char[iUncodSize];
BlockSize = 512;
char ErrorCount = 0, Err = 0, Err2 = 0;
while (iStPos<iFileLength)
{
// Получение блока из порта в буфер
bRecFlag=rfReceive.ReceiveBytes(BlockSize, 5);
if (!bRecFlag) // Проверка ошибки приема или разрыва соединения
{
addToConsole(rfReceive.asError);
if (rfReceive.asError.AnsiCompare(_ERRT16)) // Нет разрыва
anResp.SendNAK();
else addToConsole(_ERRT17);
FileClose(iFileHandler);
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
EndWD();
return;
}
Buf = rfReceive.sibuf[0];
I = Buf >> 8;
InfoLength = Buf & 0x00FF;
Err2 = 0;
if (I != 0x49)
{
anResp.SendNAK();
addToConsole(_ERRT23);
Err2 = 1;
}
// Декодирование входного буфера
Err = 0;
for (iCount=0; iCount<iUncodSize; iCount++)
{
DecodeByte(rfReceive.sibuf[iCount+1],cUncodBuf[iCount],Err);
if (Err) break;
}
if (Err)
{
ErrorCount++;
if (ErrorCount<=MaxErr)
{
anResp.SendNAK();
addToConsole(_ERRT19);
}
else
{
anResp.SendDisconnect();
addToConsole(_ERRT22);
addToConsole(_ERRT17);
FileClose(iFileHandler);
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
EndWD();
return;
}
}
if (!Err && !Err2)
{
FileSeek(iFileHandler, iStPos, 0);
FileWrite(iFileHandler, cUncodBuf, InfoLength);
iStPos+=InfoLength;
// Передача квитанции о доставке
anResp.SendACK();
// Установка ProgressBar
if ((iBarPos+=iBarDelta)>1000) iBarPos=1000;
setProgressBar(iBarPos);
}
} // endwhile
// Файл получен
addToConsole("Получен файл: "+asFilePath);
setProgressBar(1000);
// Закрытие файла
FileClose(iFileHandler);
// Завершение соединения
bRecievingFileFlag = false;
cpComPort.CloseComPort();
ComboBox1->Text="Выберите порт";
addToConsole("Соединение завершено");
EndWD();
}
//===========================================================================
// Передача файла ведомой станцией к ведущей
void TForm1::SendFileSM(void)
{
bSendingFileFlag = 1;
BlockSize = 512;
ReceiveFile sfReceive(cpComPort.GetComHandle());
ACK_NAK anResp(cpComPort.GetComHandle());
anResp.SendACK(); //Подтверждение
int iPathLength;
// Получение длины пути файла
bool bRecFlag=sfReceive.ReceiveInt(5);
if (!bRecFlag) // Проверка ошибки приема или разрыва соединения
{
addToConsole(sfReceive.asError);
if (sfReceive.asError.AnsiCompare(_ERRT16)) // Нет разрыва
anResp.SendDisconnect();
else addToConsole(_ERRT17);
cpComPort.CloseComPort();
EndWD();
return;
}
iPathLength=sfReceive.ibuf;