📄 trans.cpp
字号:
{ AfxMessageBox("对方出错退出!",MB_OK); goto end_rece; }
// 3. 接收文件头
lstrcpy(StatusStr, "接收文件头");
InvalidateRect(&m_StatusRect); UpdateWindow();
RepeatTimes=0;
RepeHead:
ReceCount = 0;
TimeOut=0; OldTime = GetCurrentTime();
while( ReceCount < HEADSIZE )
{
while( (MyTTY.npTTYInfo->HeadPtr == MyTTY.npTTYInfo->TailPtr) && TimeOut<60 )
{
if(MissConnected())
{ AfxMessageBox("调制解调器没有连通!"); goto end_rece; }
TimeOut = (GetCurrentTime()-OldTime)/1000;
}
if( TimeOut>=60) // 超时, 送 NAK 并退出
{ AfxMessageBox("接收文件头超时!", MB_OK); goto end_rece; }
FileHead.HeadBuffer[(int)ReceCount] = MyTTY.npTTYInfo->Queue[MyTTY.npTTYInfo->TailPtr];
if(MyTTY.npTTYInfo->TailPtr==4999)MyTTY.npTTYInfo->TailPtr=0;
else MyTTY.npTTYInfo->TailPtr++;
ReceCount++;
} // 4. 接收到HEADSIZE个字符的文件头
// 5. 校验收到的 HEADSIZE个字符的文件头
if( FileHead.Head.StartChar != SOH )
{
if(RepeatTimes<5)
{
RepeatTimes++;
MyTTY.npTTYInfo->TailPtr = MyTTY.npTTYInfo->HeadPtr;
SendCh = NAK;
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
goto RepeHead;
}
AfxMessageBox("文件头 [SOH] 接收错",MB_OK); goto end_rece;
}
for(kb=0;kb < HEADSIZE-2; kb++)
LJH += FileHead.HeadBuffer[kb];
if( FileHead.Head.LJH != LJH )
{
if(RepeatTimes<5)
{
RepeatTimes++;
MyTTY.npTTYInfo->TailPtr = MyTTY.npTTYInfo->HeadPtr;
SendCh = NAK;
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
goto RepeHead;
}
AfxMessageBox("文件头 [CRC] 接收错", MB_OK); goto end_rece;
}
if( FileHead.Head.EndChar != ETX )
{
if(RepeatTimes<5)
{
RepeatTimes++;
MyTTY.npTTYInfo->TailPtr = MyTTY.npTTYInfo->HeadPtr;
SendCh = NAK;
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
goto RepeHead;
}
AfxMessageBox("文件头 [ETX] 接收错", MB_OK); goto end_rece;
}
nameptr = strrchr((char *)FileHead.Head.Name,'\\');
if (nameptr)
strcpy(FileName,nameptr+1);// ptr-string);
else strcpy(FileName,FileHead.Head.Name);
remove("send.arj");
if((wfp=fopen("send.arj","wb"))==NULL) //FileName
{AfxMessageBox("不能创建文件!",MB_OK); goto end_rece; }
FileLength = atol ( FileHead.Head.FileLength);
InvalidateRect(&m_StatusRect);
UpdateWindow();
lstrcpy(FileName, "send.arj"); //wyy add
if( FileLength < BLOCKSIZE )
{ BlockCount=1; LastBlockLength = FileLength%BLOCKSIZE;}
else if( (FileLength%BLOCKSIZE) == 0)
{ BlockCount = FileLength/BLOCKSIZE;LastBlockLength=BLOCKSIZE;}
else
{ BlockCount = FileLength/BLOCKSIZE+1;
LastBlockLength=FileLength%BLOCKSIZE;
}
// 6. 清缓冲区
MyTTY.npTTYInfo->HeadPtr = 0;
MyTTY.npTTYInfo->TailPtr = 0;
memset(MyTTY.npTTYInfo->Queue,0x00, sizeof(MyTTY.npTTYInfo->Queue));
// 7. 送文件头正确的 ACK
WriteCommBlock(MyTTY.npTTYInfo, SendWyyCh, 2);
fclose(wfp);
//================== rece Block data ================
for( ib=1; ib<=BlockCount; ib++ )
{
reprece:
if(ib < BlockCount) BlockDataLength = BLOCKSIZE+4;
if(ib == BlockCount) BlockDataLength = LastBlockLength+4;
if(MissConnected())
{ AfxMessageBox("调制解调器没有连通!"); goto end_rece; }
sprintf(StatusStr,"接收第%d块",ib);
InvalidateRect(&m_StatusRect); UpdateWindow();
TimeOut=0; OldTime = GetCurrentTime();
// 接收到一块
while( (MyTTY.npTTYInfo->HeadPtr - MyTTY.npTTYInfo->TailPtr < BlockDataLength) && (TimeOut<180) )
{
if(MissConnected())
{ AfxMessageBox("调制解调器没有连通!"); goto end_rece; }
TimeOut = (unsigned long )((GetCurrentTime()-OldTime)/1000.);
}
if( TimeOut>=180)
{ AfxMessageBox("等待数据超时!",MB_OK); goto end_rece; }
memcpy(ReceBuffer, MyTTY.npTTYInfo->Queue, BlockDataLength);
ibb = (ReceBuffer[0]&0x00ff)+ (0x00ff&ReceBuffer[1])*256L;
if( ibb != ib)
{
if(ibb == 0x1515)
{ AfxMessageBox("线路故障,通信中断!",MB_OK); goto end_rece; }
::MessageBeep(-1);
lstrcpy(StatusStr, "本文件块传送出错: ib错");
InvalidateRect(&m_StatusRect); UpdateWindow();
MyTTY.npTTYInfo->HeadPtr = 0;
MyTTY.npTTYInfo->TailPtr = 0;
memset(MyTTY.npTTYInfo->Queue,0x00, sizeof(MyTTY.npTTYInfo->Queue));
SendCh = NAK;
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
SendCh = (unsigned char )(ib%256);
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
SendCh = (unsigned char )(ib/256);
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
RepeatTimes++;
if(RepeatTimes>=10)
{ AfxMessageBox("线路故障,重传10次不成功1,通信中断!",MB_OK); goto end_rece; }
goto reprece;
}
LJH = '\0';
for(kb=0;kb<BlockDataLength-2;kb++)
LJH += ReceBuffer[kb];
if( ReceBuffer[BlockDataLength-2] != LJH)
{
::MessageBeep(-1); ::MessageBeep(-1);
lstrcpy(StatusStr, "LJH:本文件块传送出错");
InvalidateRect(&m_StatusRect); UpdateWindow();
MyTTY.npTTYInfo->HeadPtr = 0;
MyTTY.npTTYInfo->TailPtr = 0;
memset(MyTTY.npTTYInfo->Queue,0x00, sizeof(MyTTY.npTTYInfo->Queue));
SendCh = NAK;
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
SendCh = (unsigned char )(ib%256);
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
SendCh = (unsigned char )(ib/256);
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
RepeatTimes++;
if(RepeatTimes>=10)
{ AfxMessageBox("线路故障,重传10次不成功2,通信中断!",MB_OK); goto end_rece; }
goto reprece;
}
if( ReceBuffer[BlockDataLength-1] != ETX)
{
::MessageBeep(-1); ::MessageBeep(-1); ::MessageBeep(-1);
lstrcpy( StatusStr, "ETX:本文件块传送出错");
InvalidateRect(&m_StatusRect); UpdateWindow();
MyTTY.npTTYInfo->HeadPtr = 0;
MyTTY.npTTYInfo->TailPtr = 0;
memset(MyTTY.npTTYInfo->Queue,0x00, sizeof(MyTTY.npTTYInfo->Queue));
SendCh = NAK;
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
SendCh = (unsigned char )(ib%256);
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
SendCh = (unsigned char )(ib/256);
WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
RepeatTimes++;
if(RepeatTimes>=10)
{AfxMessageBox("线路故障,重传10次不成功3,通信中断!",MB_OK); goto end_rece; }
goto reprece;
}
// 将本块写入文件
if((wfp=fopen(FileName,"ab"))==NULL)
{ AfxMessageBox("打不开文件", MB_OK); goto end_rece; }
fseek(wfp,0L,SEEK_END);
if((fwrite(ReceBuffer+2,BlockDataLength-4,1,wfp))!=1)
{ AfxMessageBox("写文件出错", MB_OK); fclose(wfp); goto end_rece; }
fclose(wfp);
Percent = ((double)ib)/((float)(BlockCount))*100 ;
sprintf(m_PerStr,"%d%%", (int)Percent);
MyProgCtrl->SetPos((int)(Percent));
InvalidateRect(&m_StatusRect);
UpdateWindow(); RepeatTimes=0;
// 本文件接收正确
// 清缓冲区
MyTTY.npTTYInfo->HeadPtr = 0; MyTTY.npTTYInfo->TailPtr = 0;
memset(MyTTY.npTTYInfo->Queue,0x00, sizeof(MyTTY.npTTYInfo->Queue));
WriteCommBlock(MyTTY.npTTYInfo, SendWyyCh, 2);
//char tttt[55];
//sprintf(tttt, "ib=%ld", ib);
//AfxMessageBox(tttt);
}
ClearMessage();
return(1);
end_rece:
//SendCh = NAK;
//WriteCommBlock(MyTTY.npTTYInfo, &SendCh, 1);
ClearMessage();
return(-1);
}
*/
void CTrans::ClearMessage(void)
{
memset(szName, 0x00, sizeof(szName));
memset(&FileHead, 0x00, sizeof(FileHead));
memset(m_PerStr, 0x00, sizeof(m_PerStr));
lstrcpy(StatusStr,"");
Percent = 0;
CProgressCtrl * MyProgCtrl = ((CProgressCtrl *)GetDlgItem(IDC_PROGRESS));
MyProgCtrl->SetPos((int)(Percent));
InvalidateRect(&m_StatusRect);
UpdateWindow();
}
void CTrans::OnReceive()
{
CListCtrl *temp;
temp = (CListCtrl *)GetDlgItem(IDC_LIST2);
((CButton *)GetDlgItem(IDC_SEND))->EnableWindow(FALSE);
((CButton *)GetDlgItem(IDC_RECEIVE))->EnableWindow(TRUE);
UINT Count = temp->GetItemCount();
LV_ITEM lvItem;
char FileName[13];
for(UINT i=0; i<Count; i++)
{
memset(&lvItem, 0x00, sizeof(LV_ITEM));
lvItem.mask = LVIF_TEXT|LVIF_STATE;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.pszText = FileName;
lvItem.cchTextMax = 12;
lvItem.stateMask = LVIS_SELECTED;
BOOL WWW = ((CListCtrl *)GetDlgItem(IDC_LIST2))->GetItem(&lvItem);
if(lvItem.mask & LVIF_STATE)
{
if(lvItem.state & LVIS_SELECTED)break;
}
}
if(i==Count)return;
char tempstr[13];
temp->GetItemText(i, 0, tempstr, 13);
lstrcpy(szName, m_strDataPath);
if(szName[lstrlen(szName)-1] == '\\')
lstrcat(szName, tempstr);
else
{
lstrcat(szName, "\\");
lstrcat(szName, tempstr);
}
lstrcpy(ReceFileName, tempstr);
int kkk = WyyReceFile();
if(kkk > 0)
{
if(AfxMessageBox("文件已正确接收, 是否将其加入故障文件数据库!", MB_OKCANCEL) == IDOK)
{
struct FAULT_RECORD Rece ={"0","1998-09-28 12:20:20","77",
"99999.99","武汉市邮电局","武汉市邮电局","广宁线","wyy100","A","1",
"wgu34.wgl","zhx","3","1998.092812","1","1"};
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
CAnalysis Analysis;
Analysis.m_ConfigFileName1 = m_strRecordPath + _T("sys1.dat");
Analysis.m_ConfigFileName2 = m_strRecordPath + _T("sys2.dat");
Analysis.m_StrglconfigFile = m_strRecordPath + _T("glconfig.dat");
Analysis.m_FaultFileName = WyyFileName;
_splitpath(WyyFileName, drive, dir, fname, ext);
Analysis.m_strReportFile.Empty();
Analysis.m_strReportFile += _T(drive);
Analysis.m_strReportFile += _T(dir);
Analysis.m_strReportFile += _T(fname);
Analysis.m_strReportFile += _T(".rpt");
if(Analysis.InitSys() == -1)return;
if(Analysis.ReadFile() == -1)return;
if(Analysis.tab1(1) == -1)return;
if(Analysis.fFaultJL == -1)
{
AfxMessageBox("本次数据无故障,将不加入故障数据库!");
return;
}
lstrcpy(Rece.StartDateTime, Analysis.m_DateTime);
char *ptemp, tempstr[10];
ptemp = Rece.StartDateTime;
ptemp[lstrlen(ptemp)-3]=0x00;
struct tm tt;
ptemp = strrchr(Analysis.m_DateTime, '.');
lstrcpy(tempstr, ptemp+1);
tempstr[3] =0x00;
lstrcpy(Rece.StartMTime, tempstr);
*ptemp = 0x00;
ptemp = strrchr(Analysis.m_DateTime, ':');
tt.tm_sec = atoi(ptemp+1);
*ptemp =0x00;
ptemp = strrchr(Analysis.m_DateTime, ':');
tt.tm_min = atoi(ptemp+1);
*ptemp =0x00;
ptemp = strrchr(Analysis.m_DateTime, ',');
tt.tm_hour = atoi(ptemp+1);
*ptemp =0x00;
ptemp = strrchr(Analysis.m_DateTime, '//');
tt.tm_year = atoi(ptemp+1);
if(tt.tm_year > 60)tt.tm_year += 1900;
else tt.tm_year += 2000;
*ptemp =0x00;
ptemp = strrchr(Analysis.m_DateTime, '//');
tt.tm_mday = atoi(ptemp+1);
*ptemp =0x00;
tt.tm_mon = atoi(Analysis.m_DateTime);
double datestr = tt.tm_year + tt.tm_mon/100. + tt.tm_mday/10000. + tt.tm_hour/1000000.;
sprintf(Rece.Reserve1, "%lf", datestr);
// lstrcpy(Rece.DelayTime,Analysis.FaultDelayTime); //char DelayTime[3];
lstrcpy(Rece.LineName, Analysis.m_strFaultLineName);
ptemp = strrchr(dir,'\\');
*ptemp = 0x00;
ptemp = strrchr(dir,'\\');
lstrcpy(Rece.RecordID, ptemp+1);
*ptemp = 0x00;
ptemp = strrchr(dir,'\\');
lstrcpy(Rece.StationName, ptemp+1);
*ptemp = 0x00;
ptemp = strrchr(dir,'\\');
lstrcpy(Rece.CityName, ptemp+1);
////JumpPhase
lstrcpy(Rece.FileName, fname);
lstrcat(Rece.FileName, ext);
char wyyTemp[256];
BYTE ch1 = 0xce;
char ch2 = '(';
lstrcpy(wyyTemp,Analysis.m_strFaultPhase);
if(wyyTemp[3] == ch1)
lstrcpy(Rece.FaultType,"1");
else if(wyyTemp[4] == ch2)
lstrcpy(Rece.FaultType,"2");
else if(strstr(wyyTemp,"ABC")!=NULL || strstr(wyyTemp,"ABCN") != NULL)
lstrcpy(Rece.FaultType,"3");
else if(wyyTemp[5] == ch1)
lstrcpy(Rece.FaultType,"4");
else
lstrcpy(Rece.FaultType,"5");
char *pTempWyy;
pTempWyy = strchr(Analysis.m_strFaultPhase, '(');
if(pTempWyy != NULL)*pTempWyy=0x00;
lstrcpy(Rece.PhaseName, Analysis.m_strFaultPhase);
/*
char CityName[20];
char StationName[20];
char LineName[20];
char RecordID[20];
char PhaseName[20];
char JumpPhase[10];
char FileName[254];
char AnalyFile[254];
char FaultType[5];
char Reserve1[48];
char Reserve2[48];
char Reserve3[3];*/
AddARecord(Rece);
}
}
}
/*
void CTrans::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
((CButton *)GetDlgItem(IDC_SEND))->EnableWindow(TRUE);
((CButton *)GetDlgItem(IDC_RECEIVE))->EnableWindow(FALSE);
*pResult = 0;
}
void CTrans::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
CListCtrl *temp;
temp = (CListCtrl *)GetDlgItem(IDC_LIST1);
((CButton *)GetDlgItem(IDC_SEND))->EnableWindow(TRUE);
((CButton *)GetDlgItem(IDC_RECEIVE))->EnableWindow(FALSE);
UINT Count = temp->GetItemCount();
LV_ITEM lvItem;
char FileName[13];
for(UINT i=0; i<Count; i++)
{
memset(&lvItem, 0x00, sizeof(LV_ITEM));
lvItem.mask = LVIF_TEXT|LVIF_STATE;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.pszText = FileName;
lvItem.cchTextMax = 12;
lvItem.stateMask = LVIS_SELECTED;
BOOL WWW = temp->GetItem(&lvItem);
if(lvItem.mask & LVIF_STATE)
{
if(lvItem.state & LVIS_SELECTED)break;
}
}
if(i==Count)return;
char tempstr[13];
temp->GetItemText(i, 0, tempstr, 13);
lstrcpy(szName, m_strRecordPath.GetBuffer(_MAX_DIR));
m_strRecordPath.ReleaseBuffer();
lstrcat(szName, tempstr);
WyySendFile();
*pResult = 0;
}
*/
void CTrans::OnClickList2(NMHDR* pNMHDR, LRESULT* pResult)
{
((CButton *)GetDlgItem(IDC_SEND))->EnableWindow(FALSE);
((CButton *)GetDlgItem(IDC_RECEIVE))->EnableWindow(TRUE);
*pResult = 0;
}
void CTrans::OnDblclkList2(NMHDR* pNMHDR, LRESULT* pResult)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -