📄 commprotocol.cpp
字号:
// 先略过帧长度和帧长度校验部分,最后实现
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 + -