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

📄 commprotocol.cpp

📁 coldfire5206芯片的boot程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			}
			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 + -