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

📄 commprotocol.cpp

📁 coldfire5206芯片的boot程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	// 先略过帧长度和帧长度校验部分,最后实现
	lPos += 6;

	// 根据包类型进行包封装
	switch (nType)
	{
	case CPT_CMD:
		// 命令包类型字段
		m_acSendFrameInfo[lPos] = CPT_CMD;
		lPos ++;
		// 命令包包头部分,目前没有需要高低位颠倒的处理的整数
		pCmd = (CmdPack*)pPackInfo;
		m_acSendFrameInfo[lPos] = pCmd->type;
		lPos ++;
		memset(m_acSendFrameInfo + lPos, 0x00, 10);
		lPos += 10;
		m_acSendFrameInfo[lPos] = pCmd->length;
		lPos ++;
		// 按命令包类型封装命令数据
		switch (pCmd->type)
		{
		case CMD_FILESTART:
			nLen16 = pCmd->info.fs.file_type;
			ConverseInt((UINT32*)(&nLen16), 2);
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)((&nLen16)), 2);
			lPos += 2;
			nLen16 = pCmd->info.fs.file_no;
			ConverseInt((UINT32*)(&nLen16), 2);
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)((&nLen16)), 2);
			lPos += 2;
			nLen16 = pCmd->info.fs.data_pack_num;
			ConverseInt((UINT32*)(&nLen16), 2);
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)((&nLen16)), 2);
			lPos += 2;
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)(pCmd->info.fs.file_name), FIELD_FILE_NAME_LENGTH);
			lPos += 14;
			break;

		case CMD_VERSION:
			nLen16 = pCmd->info.ver.soft_no;
			ConverseInt((UINT32*)(&nLen16), 2);
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)((&nLen16)), 2);
			lPos += 2;
			memcpy(m_acSendFrameInfo + lPos, pCmd->info.ver.ver_info, 4);
			lPos += 4;
			nLen16 = pCmd->info.ver.flash_no;
			ConverseInt((UINT32*)(&nLen16), 2);
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)((&nLen16)), 2);
			lPos += 2;
			nLen16 = pCmd->info.ver.module_no;
			ConverseInt((UINT32*)(&nLen16), 2);
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)((&nLen16)), 2);
			lPos += 2;
			memset(m_acSendFrameInfo + lPos, 0x00, 10);
			lPos += 10;
			break;

		case CMD_RESEND:
			nLen16 = pCmd->info.rs.nCommType;
			ConverseInt((UINT32*)(&nLen16), 2);
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)((&nLen16)), 2);
			lPos += 2;
			nLen16 = pCmd->info.rs.nPackNo;
			ConverseInt((UINT32*)(&nLen16), 2);
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)((&nLen16)), 2);
			lPos += 2;
			memset(m_acSendFrameInfo + lPos, 0x00, 18);
			lPos += 16;
			break;

		case CMD_RENEW:
			memcpy(m_acSendFrameInfo + lPos, (UINT8*)(&(pCmd->info.rn.cResultFlag)), 1);
			lPos ++;
			memset(m_acSendFrameInfo + lPos, 0x00, 19);
			lPos += 19;
			break;

		case CMD_START:
		case CMD_BREAK:
		case CMD_YES:
		case CMD_FILEEND:
			memset(m_acSendFrameInfo + lPos, 0x00, 20);
			lPos += 20;
			break;

		default:
			bFormatIsRight = 0;
			break;
		}
		break;

	case CPT_DATA:
		m_acSendFrameInfo[lPos] = CPT_DATA;
		lPos ++;
		pData = (DataPack*)pPackInfo;
		nLen16 = pData->no;
		ConverseInt((UINT32*)(&nLen16), 2);
		memcpy(m_acSendFrameInfo + lPos, (UINT8*)((&nLen16)), 2);
		lPos += 2;
		memset(m_acSendFrameInfo + lPos, 0x00, 4);
		lPos += 4;  // resered 
		lLen32 = pData->length;
		ConverseInt(&lLen32, 4);
		memcpy(m_acSendFrameInfo + lPos, (UINT8*)(&lLen32), 4);
		lPos += 4;
		nLen16 = GetDataCheckout((UINT8*)(&lLen32), 4, 2);
		ConverseInt((UINT32*)(&nLen16), 2);
		memcpy(m_acSendFrameInfo + lPos, (UINT8*)(&(nLen16)), 2);
		lPos += 2;
		memcpy(m_acSendFrameInfo + lPos, (UINT8*)(pData->info), pData->length);	
		lPos += pData->length;
		break;

	default:			// 不会执行
		bFormatIsRight = 0;
		break;
	}

	if (!bFormatIsRight)
	{
		m_lSendSize = 0;
		m_bHaveSendFrame = 0;
		return;
	}

	// 补帧长度和帧长度校验信息
	lLen32 = lPos + 4;
	ConverseInt(&lLen32, 4);
	memcpy(m_acSendFrameInfo + 1, (UINT8*)(&lLen32), 4);
	nLen16 = GetDataCheckout((UINT8*)(&lLen32), 4, 2);
	ConverseInt((UINT32*)(&nLen16), 2);
	memcpy(m_acSendFrameInfo + 5, (UINT8*)(&(nLen16)), 2);

	// 总的数据校验
	lLen32 = lPos;	// + 4;  总的校验指校验字段以前的字段和
	lLen32 = GetDataCheckout(m_acSendFrameInfo, lLen32, 4);
	ConverseInt(&lLen32, 4);
	memcpy(m_acSendFrameInfo+lPos, (UINT8*)(&lLen32), 4);
	lPos += 4;

	m_lSendSize = lPos;
	m_bHaveSendFrame = 1;
	return;
}




/*********************************************************************
* 函数名称:	CCommProtocol::ConverseInt
* 说	明:	根据m_bCpuIsSame决定是否要进行整数倒位操作,操作在
*				该整数上进行,即会改变该整数
* 入口参数:
*				UINT32 *pSourceInt -- 要处理的整数
*				UINT16 nByteCount -- 整数所占的字节数
* 返 回 值:
*				void  -- 
* 作	者:	Shi Liangcai 
* 时	间:	2002-08-12 11:56:57 
*********************************************************************/
void CCommProtocol::ConverseInt(UINT32 *pSourceInt, UINT16 nByteCount)
{
	char acTempStr[4];
	char* pTempStr;

	if (!m_bCpuIsSame)
	{
		pTempStr = (char*)pSourceInt;
		if (nByteCount == 2)
		{
			memcpy(acTempStr, pTempStr, 2);
			pTempStr[0] = acTempStr[1];
			pTempStr[1] = acTempStr[0];
		}
		else
		{
			memcpy(acTempStr, pTempStr, 4);
			pTempStr[0] = acTempStr[3];
			pTempStr[1] = acTempStr[2];
			pTempStr[2] = acTempStr[1];
			pTempStr[3] = acTempStr[0];
		}
	}

	return;
}

/*********************************************************************
* 函数名称:	CCommProtocol::UnformatFrame
* 说	 明:	将接受到的经过校验的接收帧解封装,如果是文件,那么文件
*				内容依然使用接收帧。
* 入口参数:
* 返 回 值:
*				void  -- 
* 作	 者:	Shi Liangcai 
* 时	 间:	2002-08-12 14:16:47 
*********************************************************************/
void CCommProtocol::UnformatFrame()
{

	CommFrame* pFrameInfo = (CommFrame*) m_acReceiveFrameInfo;

	ConverseInt(&(pFrameInfo->len), 4);

	ConverseInt((UINT32*)(&pFrameInfo->len_check), 2);


	// 根据包类型进行包解封装
	switch (pFrameInfo->type)
	{
	case CPT_CMD:
		// 按命令包类型封装命令数据
		switch (pFrameInfo->pack.cmdPack.type)
		{
		case CMD_FILESTART:
			ConverseInt((UINT32*)(&pFrameInfo->pack.cmdPack.info.fs.file_type), 2);
			ConverseInt((UINT32*)(&pFrameInfo->pack.cmdPack.info.fs.file_no), 2);
			ConverseInt((UINT32*)(&pFrameInfo->pack.cmdPack.info.fs.data_pack_num), 2);
			break;

		case CMD_VERSION:
			ConverseInt((UINT32*)(&pFrameInfo->pack.cmdPack.info.ver.soft_no), 2);
			ConverseInt((UINT32*)(&pFrameInfo->pack.cmdPack.info.ver.flash_no), 2);
			ConverseInt((UINT32*)(&pFrameInfo->pack.cmdPack.info.ver.module_no), 2);
			break;

		case CMD_RESEND:
			ConverseInt((UINT32*)(&pFrameInfo->pack.cmdPack.info.rs.nCommType), 2);
			ConverseInt((UINT32*)(&pFrameInfo->pack.cmdPack.info.rs.nPackNo), 2);
			break;

		case CMD_RENEW:
		case CMD_START:
		case CMD_BREAK:
		case CMD_YES:
		case CMD_FILEEND:
			break;

		default:
			m_bCheckoutIsRight = 0;
			break;
		}
		break;

	case CPT_DATA:
		ConverseInt((UINT32*)(&pFrameInfo->pack.dataPack.no), 2);
		ConverseInt(&pFrameInfo->pack.dataPack.length, 4);
		break;

	default:			// 不会执行
		m_bCheckoutIsRight = 0;
		return;
	}

	return;
}
/*********************************************************************
* 函数名称:	CCommProtocol::ClearCommStatus
* 说	 明:	清除通讯标志,包括清除:1、接收和发送内容  
*				2、通讯标志  3、通讯状态
* 入口参数:
* 返 回 值:
*				void  -- 
* 作	 者:	Shi Liangcai 
* 时	 间:	2002-09-06 14:16:47 
*********************************************************************/
void CCommProtocol::ClearCommStatus(void)
{
	m_lReceivePos  = 0;
	m_lSendSize		= 0;

	m_bHaveSendFrame = 0;

	m_nResendNum = 0;
	m_bCheckoutIsRight = 1;

	m_nCommEndFlag = CET_NORMAL;
	m_nStatusFlag = CT_NULL;
}

/*********************************************************************
* 函数名称:		CCommProtocol::SetCpuSame
* 说	明:		设定CPU是否相同
* 入口参数:
*				bFlag	0, not same; 1, same
* 返 回 值:
*				void  -- 
* 作	者:		Shi Liangcai 
* 时	间:		2002-09-16 14:16:47 
*********************************************************************/
void CCommProtocol::SetCpuIsSame(BOOL bFlag)
{
	m_bCpuIsSame = bFlag;

	return;
}

BOOL CCommProtocol::SetFrameSize(UINT32 nFrameSize)
{
	if (nFrameSize > MAX_FRAME_LENGTH || nFrameSize < MIN_FRAME_LENGTH)
	{
		m_nFrameMaxSize = MAX_FRAME_LENGTH;
		m_nFrameDataMaxSize = MAX_FRAME_LENGTH - 24;
		return FALSE;
	}

	m_nFrameMaxSize = nFrameSize;
	m_nFrameDataMaxSize = nFrameSize - 24;

	return TRUE;
}

UINT32 CCommProtocol::GetFrameDataMaxSize()
{
	return	m_nFrameDataMaxSize;
}
/*********************************************************************
* 函数名称:		CCommProtocol::SetCpuSame
* 说	明:		设定CPU是否相同
* 入口参数:
*				bFlag	0, not same; 1, same
* 返 回 值:
*				void  -- 
* 作	者:		Shi Liangcai 
* 时	间:		2002-09-16 14:16:47 
*********************************************************************/
void CCommProtocol::ResendOnOvertime()
{
	switch (m_stCommInfo.nCommType)
	{
	case CST_START:			// 初始化通讯发送方处理
	case CST_VERSION:		// 版本发送方处理
	case CST_BREAK:			// 中断发送方处理
	case CST_FILE:			// 文件发送方处理
		ResendFrame(1);
		break;

	case CRT_START:			// 初始化通讯接收方处理
	case CRT_VERSION:		// 版本接收方处理	
	case CRT_FILE:			// 文件接收方处理
	case CRT_BREAK:			// 中断接收方处理
		ResendFrame(0);
		break;

	default:
		break;
	}

	return;
}


/*********************************************************************
* 函数名称:		CCommProtocol::ResendFrame
* 说	明:		重返帧数据
* 入口参数:
*				BOOL nResendFlag	1, resend data; 0, resend to request
* 返 回 值:
*				void  -- 
* 作	者:		Shi Liangcai 
* 时	间:		2002-09-16 14:16:47 
*********************************************************************/
void CCommProtocol::ResendFrame(BOOL nResendFlag)
{
	CmdPack stCmdPack;

	if (m_nResendNum == MAX_RESEND_NUM)	// 重发无效
	{
		m_nCurPackNo = 0;
		m_nResendNum = 0;
		m_bHaveSendFrame = 0;
		m_nCommEndFlag = CET_RESEND_INVALID;
		m_nStatusFlag = CT_NULL;
	}

	if (nResendFlag == 1)
	{
		// 重发上一次发的帧,不用更改数据
		m_nResendNum ++;		
		m_bHaveSendFrame = 1;
	}
	else
	{
		m_nResendNum ++;
		stCmdPack.type = CMD_RESEND;
		stCmdPack.info.rs.nPackNo = m_nCurPackNo;
		stCmdPack.info.rs.nCommType = m_nStatusFlag;
		stCmdPack.length = 0x04;
		FormatFrame(CPT_CMD, &stCmdPack);
		m_bHaveSendFrame = 1;
	}

	return;
}


UINT32 CCommProtocol::GetResendNum()
{
	return m_nResendNum;
}

//BOOL 	CCommProtocol::SetDynamicSendFileMode(BOOL bIsDynamicSendFile, UINT32 (*func)(UINT8* pFileName, UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength))
BOOL 	CCommProtocol::SetDynamicSendFileMode(BOOL bIsDynamicSendFile, UINT32 (*func)(UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength))
{
	if (bIsDynamicSendFile && func == NULL) 
		return FALSE;
	
	m_bIsDynamicSendFile = bIsDynamicSendFile;
	m_funcDynamicGetFilePackInfo = func;

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -