📄 commprotocol.cpp
字号:
/*********************************************************************
* 函数名称: CCommProtocol::GetDataCheckout
* 说 明: 取得一段信息(字符串)的校验码
* 入口参数:
* UINT8 *pcData -- 校验目标字符串
* UINT32 lDataLen -- 校验字符串的长度
* UINT16 nValueByteNum -- 校验结果取几个字节
* 返 回 值:
* UINT32 -- 校验码
* 作 者: Shi Liangcai
* 时 间: 2002-07-31 08:47:10
*********************************************************************/
UINT32 CCommProtocol::GetDataCheckout(UINT8 *pcData, UINT32 lDataLen, UINT16 nValueByteNum)
{
UINT32 i;
UINT32 lCode;
lCode = 0;
for (i = 0; i < lDataLen; i ++)
{
lCode += *(pcData + i);
}
switch (nValueByteNum)
{
case 1:
lCode = (UINT8)lCode;
break;
case 2:
lCode = (UINT16)lCode;
break;
default: // 其他情况均看做4个字节,32位的校验码
break;
}
return lCode;
}
/*********************************************************************
* 函数名称: CCommProtocol::GetFrameLength
* 说 明: 帧的长度指的是帧的整个长度,而不是帧中信息的长度。
* 入口参数:
* 返 回 值:
* UINT32 -- 0, 表示帧长度和校验出错;非0,帧的长度
* 作 者: Shi Liangcai
* 时 间: 2002-07-29 14:35:49
*********************************************************************/
UINT32 CCommProtocol::GetFrameLength()
{
UINT8 acLength[5];
UINT16 nCheckout16;
UINT32 lCheckout32;
nCheckout16 = *((UINT16*)(m_acReceiveFrameInfo + 5));
ConverseInt((UINT32*)(&nCheckout16), 2); // 取得长度校验码
lCheckout32 = *((UINT32*)(m_acReceiveFrameInfo + 1));
ConverseInt((UINT32*)(&lCheckout32), 4);
memcpy(acLength, (UINT8*)(&lCheckout32), 4); // 取得长度字符串
acLength[4] = 0x00;
if (!CheckupData(acLength, 4, nCheckout16, 2))
return 0;
return lCheckout32;
}
/*********************************************************************
* 函数名称: CCommProtocol::CheckupFrame
* 说 明: 对整个帧进行和校验
* 入口参数:
* 返 回 值:
* BOOL -- 0, 校验出错; 1,校验无误
* 作 者: Shi Liangcai
* 时 间: 2002-07-29 14:42:40
*********************************************************************/
BOOL CCommProtocol::CheckupFrame()
{
UINT32* pCheckout32;
pCheckout32 = (UINT32*)(m_acReceiveFrameInfo + m_lReceiveSize - 4);
ConverseInt(pCheckout32, 4);
m_bCheckoutIsRight = CheckupData(m_acReceiveFrameInfo, m_lReceiveSize-4, *pCheckout32, 4);
return m_bCheckoutIsRight;
}
/*********************************************************************
* 函数名称: CCommProtocol::StartCommReceive
* 说 明: 初始化(启动)通讯处理(接收方)
* 入口参数:
* 返 回 值:
* void -- 无
* 作 者: Shi Liangcai
* 时 间: 2002-08-01 08:56:19
*********************************************************************/
void CCommProtocol::StartCommReceive()
{
CmdPack stCmdPack;
CommFrame* pstCommFrame;
pstCommFrame = (CommFrame*) m_acReceiveFrameInfo;
if (m_bCheckoutIsRight == 1 && pstCommFrame->type == CPT_CMD
&& pstCommFrame->pack.cmdPack.type == CMD_START)
{
// 校验无错误,正常结束初始化通讯
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::StartCommSend
* 说 明: 初始化(启动)通讯处理(发送方)
* 入口参数:
* 返 回 值:
* void -- 无
* 作 者: Shi Liangcai
* 时 间: 2002-08-01 08:56:19
*********************************************************************/
void CCommProtocol::StartCommSend()
{
// 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;
bResendFlag = 0;
m_nCommEndFlag = CET_NORMAL;
m_nStatusFlag = CT_NULL;
}
}
if (bResendFlag)// 重发帧
{
ResendFrame(1);
}
return;
}
/*********************************************************************
* 函数名称: CCommProtocol::VersionCommReceive
* 说 明: 版本确认通讯处理(接收方)
* 入口参数:
* 返 回 值:
* void -- 无
* 作 者: Shi Liangcai
* 时 间: 2002-08-01 15:22:19
*********************************************************************/
void CCommProtocol::VersionCommReceive()
{
CmdPack stCmdPack;
CommFrame* pstCommFrame;
UINT16 nResendFlag;
BOOL bAnswerIsWrong;
static VRData s_VerData;
pstCommFrame = (CommFrame*) m_acReceiveFrameInfo;
nResendFlag = 1;
bAnswerIsWrong = 0;
if (m_bCheckoutIsRight)
{
switch (m_nStatusFlag)
{
case CSR_VERSION_WAIT_RV:
if (pstCommFrame->type == CPT_CMD
&& pstCommFrame->pack.cmdPack.type == CMD_VERSION)
{
stCmdPack.type = CMD_VERSION;
stCmdPack.length = 0x14;
stCmdPack.info.ver.soft_no = m_stCommInfo.commData.verData.soft_no;
memcpy(stCmdPack.info.ver.ver_info, m_stCommInfo.commData.verData.ver_info, 4);
stCmdPack.info.ver.flash_no = m_stCommInfo.commData.verData.flash_no;
stCmdPack.info.ver.module_no = m_stCommInfo.commData.verData.module_no;
FormatFrame(CPT_CMD, &stCmdPack);
s_VerData.soft_no = pstCommFrame->pack.cmdPack.info.ver.soft_no;
memcpy(s_VerData.ver_info, pstCommFrame->pack.cmdPack.info.ver.ver_info, 4);
s_VerData.flash_no = pstCommFrame->pack.cmdPack.info.ver.flash_no;
s_VerData.module_no = pstCommFrame->pack.cmdPack.info.ver.module_no;
m_nResendNum = 0;
nResendFlag = 0;
m_nStatusFlag = CSR_VERSION_WAIT_YES;
}
break;
case CSR_VERSION_WAIT_YES:
if (pstCommFrame->type == CPT_CMD
&& pstCommFrame->pack.cmdPack.type == CMD_VERSION) // 判断是否是上一个应答没有接到
{
bAnswerIsWrong = 1;
break;
}
if (pstCommFrame->type == CPT_CMD
&& pstCommFrame->pack.cmdPack.type == CMD_YES)
{
m_stCommInfo.commData.verData.soft_no = s_VerData.soft_no;
memcpy(m_stCommInfo.commData.verData.ver_info, s_VerData.ver_info, 4);
m_stCommInfo.commData.verData.flash_no = s_VerData.flash_no;
m_stCommInfo.commData.verData.module_no = s_VerData.module_no;
stCmdPack.type = CMD_YES;
stCmdPack.length = 0x00;
FormatFrame(CPT_CMD, &stCmdPack);
nResendFlag = 0;
m_nResendNum = 0;
m_nCommEndFlag = CET_NORMAL;
m_nStatusFlag = CT_NULL;
}
break;
default: // 永远不会执行的
break;
}
}
// 处理发送方没有接到应答或应答错误,重发应答
if (bAnswerIsWrong)
{
ResendFrame(1);
}
// 对于接收方,如果接到对方错误数据,请求重发上一次帧
if (nResendFlag)
{
ResendFrame(0);
}
return;
}
/*********************************************************************
* 函数名称: CCommProtocol::VersionCommSend
* 说 明: 版本确认通讯处理(发送方)
* 入口参数:
* 返 回 值:
* void -- 无
* 作 者: Shi Liangcai
* 时 间: 2002-08-01 15:23:19
*********************************************************************/
void CCommProtocol::VersionCommSend()
{
CmdPack stCmdPack;
CommFrame* pstCommFrame;
UINT16 nResendFlag;
pstCommFrame = (CommFrame*) m_acReceiveFrameInfo;
nResendFlag = 1;
if (m_bCheckoutIsRight)
{
switch (m_nStatusFlag)
{
case CSS_VERSION_WAIT_AV:
if (pstCommFrame->type == CPT_CMD
&& pstCommFrame->pack.cmdPack.type == CMD_VERSION)
{
stCmdPack.type = CMD_YES;
stCmdPack.length = 0;
FormatFrame(CPT_CMD, &stCmdPack);
memcpy(m_stCommInfo.commData.verData.ver_info, pstCommFrame->pack.cmdPack.info.ver.ver_info, 4);
m_stCommInfo.commData.verData.soft_no = pstCommFrame->pack.cmdPack.info.ver.soft_no;
m_stCommInfo.commData.verData.flash_no = pstCommFrame->pack.cmdPack.info.ver.flash_no;
m_stCommInfo.commData.verData.module_no = pstCommFrame->pack.cmdPack.info.ver.module_no;
m_bHaveReceiveInfo = 1;
nResendFlag = 0;
m_nResendNum = 0;
m_nStatusFlag = CSS_VERSION_WAIT_YES;
}
break;
case CSS_VERSION_WAIT_YES:
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)))
{
// 接收到最后一条应答,通讯结束
// 或者发送方尽管没有接收到最后一条应答,但是接收到重发命令,
// 而且重发命令显示接收方已经发送过应答,并进入下一个通讯,此时也按正常通讯处理
nResendFlag = 0;
m_nResendNum = 0;
m_nCommEndFlag = CET_NORMAL;
m_nStatusFlag = CT_NULL;
}
break;
default: // 永远不会执行的
break;
}
}
// 对于发送方,如果接到对方错误数据,重发上一次帧
if (nResendFlag)
{
ResendFrame(1);
}
return;
}
/*********************************************************************
* 函数名称: CCommProtocol::FileCommReceive
* 说 明: 文件通讯处理(接收方)
* 入口参数:
* 返 回 值:
* void -- 无
* 作 者: Shi Liangcai
* 时 间: 2002-08-02 14:09:47
*********************************************************************/
void CCommProtocol::FileCommReceive()
{
CmdPack stCmdPack;
CommFrame* pstCommFrame;
UINT16 nResendFlag;
BOOL bAnswerIsWrong;
pstCommFrame = (CommFrame*) m_acReceiveFrameInfo;
nResendFlag = 1;
bAnswerIsWrong = 0;
if (m_bCheckoutIsRight)
{
switch (m_nStatusFlag)
{
case CSR_FILE_WAIT_SCMD:
if (pstCommFrame->type == CPT_CMD
&& pstCommFrame->pack.cmdPack.type == CMD_FILESTART)
{
memcpy((char*) (m_stCommInfo.commData.fileData.file_name),
(char*) (pstCommFrame->pack.cmdPack.info.fs.file_name), FIELD_FILE_NAME_LENGTH);
m_stCommInfo.commData.fileData.file_no = pstCommFrame->pack.cmdPack.info.fs.file_no;
m_stCommInfo.commData.fileData.file_type = pstCommFrame->pack.cmdPack.info.fs.file_type;
m_nFilePackCount = pstCommFrame->pack.cmdPack.info.fs.data_pack_num;
m_lFileHandlePos = 0;
m_nCurPackNo = 0;
nResendFlag = 0;
stCmdPack.type = CMD_YES;
stCmdPack.length = 0x00;
FormatFrame(CPT_CMD, &stCmdPack);
m_nResendNum = 0;
m_nStatusFlag = CSR_FILE_WAIT_DATA;
}
break;
case CSR_FILE_WAIT_DATA:
if (pstCommFrame->pack.cmdPack.type == CMD_FILESTART
&& pstCommFrame->type == CPT_CMD) // 判断是否是上一个应答没有接到
{
bAnswerIsWrong = 1;
break;
}
if (pstCommFrame->type == CPT_DATA)
{
if (pstCommFrame->pack.dataPack.no != m_nCurPackNo)
break;
memcpy (m_stCommInfo.commData.fileData.pcFileInfo + m_lFileHandlePos,
(UINT8*)(m_acReceiveFrameInfo + 20), pstCommFrame->pack.dataPack.length);
m_lFileHandlePos += pstCommFrame->pack.dataPack.length;
stCmdPack.type = CMD_YES;
stCmdPack.length = 0x00;
FormatFrame(CPT_CMD, &stCmdPack);
m_nResendNum = 0;
nResendFlag = 0;
m_nCurPackNo ++;
if (m_nCurPackNo == m_nFilePackCount)
{
m_nStatusFlag = CSR_FILE_WAIT_ECMD;
m_stCommInfo.commData.fileData.lFileLength = m_lFileHandlePos;
}
}
break;
case CSR_FILE_WAIT_ECMD:
if (pstCommFrame->type == CPT_DATA) // 判断是否是上一个应答没有接到
{
if (pstCommFrame->pack.dataPack.no == m_nCurPackNo - 1)
{
bAnswerIsWrong = 1;
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -