LONG CSCOMMDlg::OnCommunication(WPARAM ch, LPARAM port)
{
g_ucRecvBuf[g_ulRecvLen++]=UCHAR(ch);
if(g_ulRecvLen>=51)
{
memcpy(&g_ADData,g_ucRecvBuf,51);
//return 1;
}
// return 1;
if(g_ulRecvLen<4)
return 1; //1表示接收数据长度不够
ULONG ulCheckSum =0;
CMDHEADER header;
header = *((CMDHEADER *)g_ucRecvBuf);
//如果不相等,将Buffer中的每个数据前移动一个位置
if(CMD_SYN_WORD!= header.ulSyncWord)
{
memmove(g_ucRecvBuf,g_ucRecvBuf+1,3);
return 2;//2表示没有接收到同步字
}
if(g_ulRecvLen<sizeof(CMDHEADER))
return 3; //3表示没有接收到帧头
CString strTemp;
CString strFileName;
char szFilePath[MAX_PATH]={0};
switch(header.cmdType)
{
case CMD_FILEINFO://文件信息(包括名称,大小)命令
if(g_ulRecvLen<header.ulPackLen)
return 4; //没有收到完整的文件信息命令
if(g_ulRecvLen==(sizeof(CMDHEADER)+header.ulPackLen))
{
FILEINFO fileInfo;
fileInfo=*((FILEINFO *)g_ucRecvBuf);
ulCheckSum = CheckSum(fileInfo.ucFileName,fileInfo.ulFileNameLen)
+fileInfo.lFileLen;
if(ulCheckSum!=fileInfo.ulCheckSum)
{
fileInfo.header.cmdState = CMD_STATE_ERROR;
g_lErrorPackNum++;
//strTemp.Format("%d",g_lErrorPackNum);
}
else
{
fileInfo.header.cmdState = CMD_STATE_OK;
//增加接收文件的计时功能
memset(&g_tRecvBegin,0,sizeof(time_t));
time(&g_tRecvBegin);
m_bRecvFileIsBegin = TRUE;
}
m_nCurFileRecvLen=0;
m_nFileRecvLen = fileInfo.lFileLen; //文件长度
fileInfo.header.cmdType =CMD_FILEINFO_RESP;
m_Port.WriteToPort((char*)&fileInfo.header,sizeof(CMDHEADER));
memcpy(szFilePath,fileInfo.ucFileName,fileInfo.ulFileNameLen);
strFileName.Format("%s",szFilePath);
m_strCurFilePath= m_strSaveFileDir+strFileName;
if(NULL!=g_file.m_hFile)
g_file.Close();
g_file.Open(m_strCurFilePath,CFile::modeCreate|CFile::modeReadWrite);
TRACE("1,RECV FILEINFO CMD,File Name = %s,g_ulRecvLen = %d\n",
fileInfo.ucFileName,g_ulRecvLen);
// if(m_nFileRecvLen1024*1024)
// {
// strTemp.Format("%0.3fKB",m_nFileRecvLen/1024.0/1024.0);
// }
// //显示"传输总耗时"
// const ULONG ulFrameBytes = g_nBaud/10 -(sizeof(CMDHEADER)+4);
// long lComm_TimeSum = m_nFileRecvLen/ulFrameBytes;
// //传输总耗时间,单位:秒
//
// WORD wHour =0;
// WORD wMinute =0;
// WORD wSecond =0;
//
// wSecond = lComm_TimeSum%60;
// wMinute = lComm_TimeSum/60%60;
// wHour = lComm_TimeSum/60/60%60;
//
// if((0==wSecond)&&(0==wMinute)&&(0==wHour))
// wSecond =1;
// strTemp.Format("%02d:%02d:%02d",wHour,wMinute,wSecond);
g_ulRecvLen =0;
}
break;
case CMD_FILEDATA: //发送文件中数据的命令
if(g_ulRecvLen<header.ulPackLen)
return 5;//没有收到完整的文件数据帧命令
if(g_ulRecvLen == (sizeof(CMDHEADER)+header.ulPackLen))
{
FILEDATA fileData;
fileData = *((FILEDATA *)g_ucRecvBuf);
fileData.pucBuf = new UCHAR[fileData.header.ulPackLen-4];
memset(fileData.pucBuf,0,fileData.header.ulPackLen-4);
memcpy(fileData.pucBuf,g_ucRecvBuf+sizeof(CMDHEADER)+4,fileData.header.ulPackLen-4);
ulCheckSum=CheckSum(fileData.pucBuf,
fileData.header.ulPackLen-4);
if(ulCheckSum!= fileData.ulCheckSum)
{
fileData.header.cmdState =CMD_STATE_ERROR;
g_lErrorPackNum++;
strTemp.Format("%d",g_lErrorPackNum);
//m_editErrorFrames
}
else
fileData.header.cmdState =CMD_STATE_OK;
fileData.header.cmdType = CMD_FILEDATA_RESP;
g_file.Write(fileData.pucBuf,fileData.header.ulPackLen-4);
//fileData.header.ulPackLen-4,
DELETE_ARRAYOBJS(fileData.pucBuf);
g_ulRecvLen=0;
m_Port.WriteToPort((char*)&fileData.header,sizeof(CMDHEADER));
m_nCurFileRecvLen+=fileData.header.ulPackLen-4;
strTemp.Format("%0.2f",(float)m_nCurFileRecvLen/(float)m_nFileRecvLen*100);
strTemp+=_T("%");
float step = (float)m_nCurFileRecvLen/(float)m_nFileRecvLen*100;
// m_progress.SetPos((int)step);
/*if(m_nFileRecvLen1024*1024)
{
strTemp.Format("%0.3fKB",m_nFileRecvLen/1024.0/1024.0);
}*/
}
break;
case CMD_FILEEOF://文件发送结束命令
if(g_ulRecvLen<header.ulPackLen)
return 6;//没有发到完整的文件发送结束命令
if(g_ulRecvLen == (sizeof(CMDHEADER)+header.ulPackLen))
{
FILEEOF fileEOF;
fileEOF= *((FILEEOF *)g_ucRecvBuf);
fileEOF.pucBuf = new UCHAR[fileEOF.header.ulPackLen-4];
memset(fileEOF.pucBuf,0,fileEOF.header.ulPackLen-4);
memcpy(fileEOF.pucBuf,g_ucRecvBuf+sizeof(CMDHEADER)+4,fileEOF.header.ulPackLen-4);
ulCheckSum = CheckSum(fileEOF.pucBuf,fileEOF.header.ulPackLen-4);
if(ulCheckSum!=fileEOF.ulCheckSum)
{
fileEOF.header.cmdState=CMD_STATE_ERROR;
g_lErrorPackNum++;
strTemp.Format("%d",g_lErrorPackNum);
}
else
{
fileEOF.header.cmdState =CMD_STATE_OK;
m_bRecvFileIsBegin = FALSE;//接收文件完成,停止显示时间
}
fileEOF.header.cmdType =CMD_FILEEOF_RESP;
g_file.Write(fileEOF.pucBuf,fileEOF.header.ulPackLen-4);
g_file.Close();
//解决大文件发送时,第二个文件打开错误原因是没“置0”原因
g_file.m_hFile=NULL;
DELETE_ARRAYOBJS(fileEOF.pucBuf);
g_ulRecvLen=0;
m_Port.WriteToPort((char*)&fileEOF.header,sizeof(CMDHEADER));
m_nCurFileRecvLen += fileEOF.header.ulPackLen-4;
if(m_nFileRecvLen<=0)
{
strTemp=_T("0%");
}
else
{
strTemp.Format("%0.2f",
(float)m_nCurFileRecvLen/(float)m_nFileRecvLen*100);
strTemp+=_T("%");
}
if(m_nFileRecvLen1024*1024)
{
strTemp.Format("%0.3fKB",m_nFileRecvLen/1024.0/1024.0);
}
}
break;
//=================处理接收端的响应信息 begin 信息头=================
case CMD_FILEINFO_RESP://发送文件信息命令后,发到接收端的响应信息
if(CMD_STATE_OK==header.cmdState)
{
m_bFileInfoIsOK = TRUE;
g_ulRecvLen = 0;
g_bIsRecvData = TRUE;
}
else if(CMD_STATE_ERROR==header.cmdState)
{
m_bFileInfoIsOK = FALSE;
g_ulRecvLen=0;
SendFileInfo();
}
break;
//=================处理接收端的响应信息 文件数据=================
case CMD_FILEDATA_RESP://发送文件体命令后,发到接收端的响应信息
if(CMD_STATE_OK==header.cmdState)
m_bFileDataIsOK = TRUE;
else if(CMD_STATE_ERROR==header.cmdState)
m_bFileDataIsOK = FALSE;
g_ulRecvLen =0;
g_bIsRecvData = TRUE;
break;
//=================处理接收端的响应信息 文件结尾=================
case CMD_FILEEOF_RESP://发送文件尾命令后,发到接收端的响应信息
if(CMD_STATE_OK==header.cmdState)
{
m_bFileEOFIsOK = TRUE;
g_bFileSendEnd = TRUE;
}
else if (CMD_STATE_ERROR == header.cmdState)
{
m_bFileEOFIsOK = FALSE;
m_bSendFileIsBegin = FALSE;
}
g_ulRecvLen = 0;
g_bIsRecvData = TRUE;
break;
//====================默认处理=================
default:break;
}
//设置信号量
SetEvent(m_hRecvMsgEvent);
return 0; //返回0表示正确
}