⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commprotocol.cpp

📁 coldfire5206芯片的boot程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:

/*********************************************************************
* 函数名称:	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 + -