📄 commprotocol.cpp
字号:
}
if (pstCommFrame->type == CPT_CMD
&& pstCommFrame->pack.cmdPack.type == CMD_FILEEND)
{
m_nResendNum = 0;
nResendFlag = 0;
m_nCurPackNo = 0;
stCmdPack.type = CMD_YES;
stCmdPack.length = 0x00;
FormatFrame(CPT_CMD, &stCmdPack);
m_nCommEndFlag = CET_NORMAL;
m_nStatusFlag = CT_NULL;
}
break;
default: // 永远不会执行的
break;
}
}
// 处理发送方没有接到应答或应答错误,重发应答
if (bAnswerIsWrong)
{
ResendFrame(1);
}
// 对于接收方,如果接到对方错误数据,请求重发上一次帧
if (nResendFlag)
{
ResendFrame(0);
}
return;
}
/*********************************************************************
* 函数名称: CCommProtocol::FileCommSend
* 说 明: 文件通讯处理(发送方)
* 入口参数:
* 返 回 值:
* void -- 无
* 作 者: Shi Liangcai
* 时 间: 2002-08-02 14:09:47
*********************************************************************/
void CCommProtocol::FileCommSend()
{
CmdPack stCmdPack;
DataPack stDataPack;
CommFrame* pstCommFrame;
UINT16 nResendFlag;
pstCommFrame = (CommFrame*) m_acReceiveFrameInfo;
nResendFlag = 1;
if (m_bCheckoutIsRight)
{
switch (m_nStatusFlag)
{
case CSS_FILE_WAIT_SYES:
if (pstCommFrame->type == CPT_CMD && pstCommFrame->pack.cmdPack.type == CMD_YES)
{
nResendFlag = 0;
m_nResendNum = 0;
if (!m_bIsDynamicSendFile)
{
// 静态文件发送,从一个传入的文件指针取得文件信息
m_lFileHandlePos = 0;
m_nCurPackNo = 0;
stDataPack.info = m_stCommInfo.commData.fileData.pcFileInfo + m_lFileHandlePos;
stDataPack.no = m_lFileHandlePos / m_nFrameDataMaxSize;
if (m_stCommInfo.commData.fileData.lFileLength - m_lFileHandlePos > m_nFrameDataMaxSize)
{
m_lFileHandlePos += m_nFrameDataMaxSize;
stDataPack.length = m_nFrameDataMaxSize;
}
else
{
m_lFileHandlePos += m_stCommInfo.commData.fileData.lFileLength;
stDataPack.length = m_stCommInfo.commData.fileData.lFileLength;
}
FormatFrame(CPT_DATA, &stDataPack);
m_nCurPackNo ++;
}
else
{
m_nCurPackNo = 0;
stDataPack.info = m_acTempDataBuf;
// stDataPack.length = m_funcDynamicGetFilePackInfo(m_stCommInfo.commData.fileData.file_name, m_nCurPackNo, stDataPack.info, m_nFrameDataMaxSize);
stDataPack.length = m_funcDynamicGetFilePackInfo(m_nCurPackNo, stDataPack.info, m_nFrameDataMaxSize);
stDataPack.no = m_nCurPackNo;
m_nCurPackNo ++;
FormatFrame(CPT_DATA, &stDataPack);
}
m_nStatusFlag = CSS_FILE_WAIT_DYES;
}
break;
case CSS_FILE_WAIT_DYES:
if (pstCommFrame->type == CPT_CMD && pstCommFrame->pack.cmdPack.type == CMD_YES)
{
m_nResendNum = 0;
nResendFlag = 0;
if (!m_bIsDynamicSendFile)
{
if (m_lFileHandlePos >= m_stCommInfo.commData.fileData.lFileLength)
{
stCmdPack.type = CMD_FILEEND;
stCmdPack.length = 0;
FormatFrame(CPT_CMD, &stCmdPack);
m_nStatusFlag = CSS_FILE_WAIT_EYES;
}
else
{
stDataPack.info = m_stCommInfo.commData.fileData.pcFileInfo + m_lFileHandlePos;
stDataPack.no = m_lFileHandlePos / m_nFrameDataMaxSize;
if (m_stCommInfo.commData.fileData.lFileLength - m_lFileHandlePos
> m_nFrameDataMaxSize)
{
m_lFileHandlePos += m_nFrameDataMaxSize;
stDataPack.length = m_nFrameDataMaxSize;
}
else
{
stDataPack.length = m_stCommInfo.commData.fileData.lFileLength - m_lFileHandlePos;
m_lFileHandlePos = m_stCommInfo.commData.fileData.lFileLength;
}
FormatFrame(CPT_DATA, &stDataPack);
m_nCurPackNo = stDataPack.no + 1;
}
}
else
{
m_nResendNum = 0;
nResendFlag = 0;
stDataPack.info = m_acTempDataBuf;
// stDataPack.length = m_funcDynamicGetFilePackInfo(m_stCommInfo.commData.fileData.file_name, m_nCurPackNo, stDataPack.info, m_nFrameDataMaxSize);
stDataPack.length = m_funcDynamicGetFilePackInfo(m_nCurPackNo, stDataPack.info, m_nFrameDataMaxSize);
if (!stDataPack.length)
{
stCmdPack.type = CMD_FILEEND;
stCmdPack.length = 0;
FormatFrame(CPT_CMD, &stCmdPack);
m_nStatusFlag = CSS_FILE_WAIT_EYES;
}
else
{
stDataPack.no = m_nCurPackNo;
m_nCurPackNo ++;
FormatFrame(CPT_DATA, &stDataPack);
}
}
}
if (pstCommFrame->type == CPT_CMD && pstCommFrame->pack.cmdPack.type == CMD_RESEND)
{
nResendFlag = 0;
if (!m_bIsDynamicSendFile)
{
if ((UINT32)(pstCommFrame->pack.cmdPack.info.rs.nPackNo * m_nFrameDataMaxSize) <
m_stCommInfo.commData.fileData.lFileLength)
{
m_lFileHandlePos = pstCommFrame->pack.cmdPack.info.rs.nPackNo * m_nFrameDataMaxSize;
}
stDataPack.info = m_stCommInfo.commData.fileData.pcFileInfo + m_lFileHandlePos;
stDataPack.no = m_lFileHandlePos / m_nFrameDataMaxSize;
if (m_stCommInfo.commData.fileData.lFileLength - m_lFileHandlePos
> m_nFrameDataMaxSize)
{
m_lFileHandlePos += m_nFrameDataMaxSize;
stDataPack.length = m_nFrameDataMaxSize;
}
else
{
stDataPack.length = m_stCommInfo.commData.fileData.lFileLength - m_lFileHandlePos;
m_lFileHandlePos = m_stCommInfo.commData.fileData.lFileLength;
}
FormatFrame(CPT_DATA, &stDataPack);
m_nCurPackNo = stDataPack.no + 1;
}
else
{
m_nCurPackNo = pstCommFrame->pack.cmdPack.info.rs.nPackNo;
stDataPack.info = m_acTempDataBuf;
// stDataPack.length = m_funcDynamicGetFilePackInfo(m_stCommInfo.commData.fileData.file_name, m_nCurPackNo, stDataPack.info, m_nFrameDataMaxSize);
stDataPack.length = m_funcDynamicGetFilePackInfo(m_nCurPackNo, stDataPack.info, m_nFrameDataMaxSize);
if (!stDataPack.length)
{
stCmdPack.type = CMD_FILEEND;
stCmdPack.length = 0;
FormatFrame(CPT_CMD, &stCmdPack);
m_nStatusFlag = CSS_FILE_WAIT_EYES;
}
else
{
stDataPack.no = m_nCurPackNo;
m_nCurPackNo ++;
FormatFrame(CPT_DATA, &stDataPack);
}
}
}
break;
case CSS_FILE_WAIT_EYES:
if (pstCommFrame->type == CPT_CMD
&& (pstCommFrame->pack.cmdPack.type == CMD_YES
|| (pstCommFrame->pack.cmdPack.type != CMD_RESEND
|| pstCommFrame->pack.cmdPack.info.rs.nCommType != m_nStatusFlag)))
{
// 接收到最后一条应答,通讯结束
// 或者发送方尽管没有接收到最后一条应答,但是接收到重发命令,
// 而且重发命令显示接收方已经发送过应答,并进入下一个通讯,此时也按正常通讯处理
m_nCurPackNo = 0;
m_nResendNum = 0;
nResendFlag = 0;
m_nCommEndFlag = CET_NORMAL;
m_nStatusFlag = CT_NULL;
}
break;
default: // 永远不会执行的
break;
}
}
// 对于发送方,如果接到对方错误数据,重发上一次帧
if (nResendFlag)
{
ResendFrame(1);
}
return;
}
/*********************************************************************
* 函数名称: CCommProtocol::BreakCommReceive
* 说 明: 中断通讯控制(接受方)
* 入口参数:
* 返 回 值:
* void --
* 作 者: Shi Liangcai
* 时 间: 2002-08-03 09:19:19
*********************************************************************/
void CCommProtocol::BreakCommReceive()
{
CmdPack stCmdPack;
CommFrame* pstCommFrame;
pstCommFrame = (CommFrame*) m_acReceiveFrameInfo;
if (m_bCheckoutIsRight == 1 && pstCommFrame->type == CPT_CMD && pstCommFrame->pack.cmdPack.type == CMD_BREAK)
{
// 校验无错误,正常结束初始化通讯
stCmdPack.type = CMD_YES;
stCmdPack.length = 0;
FormatFrame(CPT_CMD, &stCmdPack);
m_bCheckoutIsRight = 1;
m_nResendNum = 0;
m_nCommEndFlag = CET_NORMAL;
m_nStatusFlag = CT_NULL;
}
else
{
ResendFrame(0);
}
return;
}
/*********************************************************************
* 函数名称: CCommProtocol::BreakCommSend
* 说 明: 中断通讯控制(发送方)
* 入口参数:
* 返 回 值:
* void --
* 作 者: Shi Liangcai
* 时 间: 2002-08-03 09:19:19
*********************************************************************/
void CCommProtocol::BreakCommSend()
{
// CmdPack stCmdPack;
CommFrame* pstCommFrame;
BOOL bResendFlag;
pstCommFrame = (CommFrame*) m_acReceiveFrameInfo;
bResendFlag = 1;
if (m_bCheckoutIsRight)
{
if (pstCommFrame->type == CPT_CMD
&& (pstCommFrame->pack.cmdPack.type == CMD_YES // 校验无错误,正常结束初始化通讯
|| (pstCommFrame->pack.cmdPack.type != CMD_RESEND // 对方已经开始下一步通讯,己方丢失了对方的确认包
|| pstCommFrame->pack.cmdPack.info.rs.nCommType != m_nStatusFlag)) )
{
m_bCheckoutIsRight = 1;
m_nResendNum = 0;
m_nCommEndFlag = CET_NORMAL;
m_nStatusFlag = CT_NULL;
bResendFlag = 0;
}
}
if (bResendFlag)// 重发帧
{
ResendFrame(1);
}
return;
}
/*********************************************************************
* 函数名称: CCommProtocol::RenewCommReceive
* 说 明: 更新通讯控制(接受方)
* 入口参数:
* 返 回 值:
* void --
* 作 者: Shi Liangcai
* 时 间: 2002-08-03 09:19:19
*********************************************************************/
void CCommProtocol::RenewCommReceive()
{
CmdPack stCmdPack;
CommFrame* pstCommFrame;
pstCommFrame = (CommFrame*) m_acReceiveFrameInfo;
if (m_bCheckoutIsRight == 1 && pstCommFrame->type == CPT_CMD && pstCommFrame->pack.cmdPack.type == CMD_RENEW)
{
// 校验无错误,正常结束更新通讯
stCmdPack.type = CMD_YES;
stCmdPack.length = 0;
FormatFrame(CPT_CMD, &stCmdPack);
m_stCommInfo.commData.renewData.cResultFlag = pstCommFrame->pack.cmdPack.info.rn.cResultFlag;
m_bCheckoutIsRight = 1;
m_nResendNum = 0;
m_nCommEndFlag = CET_NORMAL;
m_nStatusFlag = CT_NULL;
}
else
{
ResendFrame(0);
}
return;
}
/*********************************************************************
* 函数名称: CCommProtocol::RenewCommSend
* 说 明: 更新通讯控制(发送方)
* 入口参数:
* 返 回 值:
* void --
* 作 者: Shi Liangcai
* 时 间: 2002-08-03 09:19:19
*********************************************************************/
void CCommProtocol::RenewCommSend()
{
// CmdPack stCmdPack;
CommFrame* pstCommFrame;
BOOL bResendFlag;
pstCommFrame = (CommFrame*) m_acReceiveFrameInfo;
bResendFlag = 1;
if (m_bCheckoutIsRight)
{
if (pstCommFrame->type == CPT_CMD
&& (pstCommFrame->pack.cmdPack.type == CMD_YES // 校验无错误,正常结束初始化通讯
|| (pstCommFrame->pack.cmdPack.type != CMD_RESEND // 对方已经开始下一步通讯,己方丢失了对方的确认包
|| pstCommFrame->pack.cmdPack.info.rs.nCommType != m_nStatusFlag)))
{
m_bCheckoutIsRight = 1;
m_nResendNum = 0;
m_nCommEndFlag = CET_NORMAL;
m_nStatusFlag = CT_NULL;
bResendFlag = 0;
}
}
if (bResendFlag)// 重发帧
{
ResendFrame(1);
}
return;
}
/*********************************************************************
* 函数名称:CCommProtocol::FormatFrame
* 说明:将包数据格式化成帧数据,并将数据放入m_acSendFrameInfo中。
* 入口参数:
* UINT16 nType -- 包类型
* void *pPackInfo -- 包数据
* 返回值:
* void -- 无
* 作者: Shi Liangcai
* 时间 : 2002-07-31 09:12:33
*********************************************************************/
void CCommProtocol::FormatFrame(UINT16 nType, void *pPackInfo)
{
UINT32 lPos;
UINT32 lLen32;
UINT16 nLen16;
BOOL bFormatIsRight;
CmdPack* pCmd;
DataPack* pData;
bFormatIsRight = 1;
// 开始标志
lPos = 0;
m_acSendFrameInfo[lPos] = 0x7e;
lPos++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -