📄 protocol.cpp
字号:
}
//单个低4位十六进制转ASCII *******
//##ModelId=44B6F884016C
UCHAR CProtocol::HexToASCII(UCHAR *buf)
{
UCHAR ucTemp ;
const UCHAR tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
ucTemp = tab[*buf & 0x0f]; // 输出低4位
return ucTemp ;
}
//获的2个字节的LENGTH长度的ASCII码4字节表示表示 ******
//##ModelId=44B6F884016A
CString CProtocol::GetLENGTH(UINT iNum)
{
int i ;
UCHAR ucTemp ;
UCHAR ucSum ;
CString strTemp ;
strTemp.Empty() ;
ucSum = 0 ;
if( iNum < 4096 )
{
for( i=0 ; i < 3 ; i++ )
{
ucTemp = iNum & 0X0F ; //获得各位的十六进制数
ucSum += ucTemp ; //计算LCHKSUM
strTemp.Insert( 0 , HexToASCII(&ucTemp) ) ;
iNum >>= 4 ; //右移4位
}
//计算LCHKSUM
ucSum = ~ucSum + 1 ; //取反加一
ucSum &= 0X0F ; //取低4位
strTemp.Insert( 0 , HexToASCII(&ucSum) ) ;
return strTemp ;
}
else
{
return "LENGTH 的值需小于4096" ; //错误描述的长度必须大于4个字符
}
}
//获取协议命令的描述
//##ModelId=44B6F8840167
CString CProtocol::GetCmdNote(UCHAR ucCmd )
{
CString strNote ;
switch( ucCmd )
{
case 0x00 :
strNote = "响应包" ;
break ;
case 0x44 :
strNote = "获取监测模块告警" ;
break ;
case 0x4d :
strNote = "获取检测模块时间" ;
break ;
case 0x4e :
strNote = "设定检测模块时间" ;
break ;
case 0x4f :
strNote = "获取通信协议版本号" ;
break ;
case 0x50 :
strNote = "获取设备地址" ;
break ;
case 0x51 :
strNote = "获取设备厂家信息" ;
break ;
case 0x55 :
strNote = "程序测试用码(获取命令格式)" ;
break ;
case 0x58 :
strNote = "系统复位启动" ;
break ;
case 0x60 :
strNote = "初始化检测模块" ;
break ;
case 0xe0 :
strNote = "设备告警上传" ;
break ;
default :
strNote = "未知命令" ;
break ;
}
return strNote ;
}
//##ModelId=44B6F884015C
CString CProtocol::GetCID2Error(UCHAR ucCID2)
{
CString strError ;
switch( ucCID2 )
{
case 0x01 :
strError = "VER 出错" ;
break ;
case 0x02 :
strError = "CHKSUM 出错" ;
break ;
case 0x03 :
strError = "LCHKSUM 出错" ;
break ;
case 0x04 :
strError = "CID2 无效" ;
break ;
case 0x05 :
strError = "命令格式出错" ;
break ;
case 0x06 :
strError = "无效数据" ;
break ;
default :
strError = "其它错误" ;
break ;
}
return strError ;
}
//##ModelId=44B6F884015A
/*
int CProtocol::Transact(sCommItem* pItem)
{
return 0 ;
}
*/
//##ModelId=44B6F884014A
// 返回数据信息字节数组
int CProtocol::GetDataInfo(CInfoFrame m_frame, CByteArray & m_btData)
{
char *cBuf;
m_btData.RemoveAll();
cBuf =(char *) m_frame.InPack.INFO;
for(int i =0; i < (long)m_frame.InPack.DataLen;i+=2 )
{
m_btData.Add(*cBuf++);
}
return 0;
}
CString CProtocol::Build( CString strAddr,CString strType, UCHAR ucCmd)
{
UCHAR* ucpSend ;
DWORD dwCHKSUM ;
DWORD len ;
int nYear ;
char cTemp[3] ;
//BYTE btTemp;
UCHAR cTimeSrc[10] ;
char cTimeDst[10] ;
CString strSend;
CString strCHKSUM ;
CString strTemp ;
CString strTime ;
CString strTip ;
try
{
BytesToString(&ucCmd,cTemp,1) ;
strSend.Empty();
strTemp.Empty();
if( strAddr.GetLength() == 0 )
{
return "";
}
if( strType.GetLength() == 0 )
{
return "" ;
}
strSend = char(0X7E) ;
strSend += PROTOCOL_VER ;
strSend += strAddr ;
strSend += strType ;
if( ucCmd > 0xF0 )
strSend += "00" ;
else
{
String2Hex(strTemp,&ucCmd,1);
strSend += strTemp;
}
switch (ucCmd)
{
case 0x4E : //设置监测模块时间
strTemp = GetLENGTH(14) ; //生成LENGTH
nYear = atoi(CTime::GetCurrentTime().Format("%Y")) ;
cTimeSrc[0] = nYear >> 8 ;
cTimeSrc[1] = nYear & 0xFF ;
cTimeSrc[2] = atoi(CTime::GetCurrentTime().Format("%m")) ;
cTimeSrc[3] = atoi(CTime::GetCurrentTime().Format("%d")) ;
cTimeSrc[4] = atoi(CTime::GetCurrentTime().Format("%H")) ;
cTimeSrc[5] = atoi(CTime::GetCurrentTime().Format("%M")) ;
cTimeSrc[6] = atoi(CTime::GetCurrentTime().Format("%S")) ;
BytesToString(cTimeSrc,cTimeDst,7) ;
strTime = (LPSTR)cTimeDst ;
strSend += strTemp + strTime ;
break ;
case 0xF2 ://生成相应报警包
break ;
default :
strTemp = GetLENGTH(0) ;
strSend += strTemp ;
break ;
}
//if(strTemp.GetLength() > 4) //出错误的LENGTH将大于正常的4字节
//return -1 ;
len = strSend.GetLength() - 1 ; //数据内容长度
ucpSend = (UCHAR*)strSend.GetBuffer(0) ;
dwCHKSUM = GetCHKSUM(++ucpSend,len) ;
strSend += CHKSUMToString(dwCHKSUM) ;
strSend += char(0X0D) ;
return strSend;
}
catch(_com_error e)
{
strTip.Format( "监测模块发生异常:%s",(LPCSTR)e.Description() ) ;
TRACE0(strTip) ;
return "";
}
return "";
}
CString CProtocol::ToHexString(char * cBuf, int iLen)
{
CString sResult,strTemp;
BYTE bt;
sResult.Empty();
if (iLen > 0)
{
for(int i=0;i<iLen;i++)
{
bt = *cBuf++;
strTemp.Format("%0.2X",bt);
sResult += strTemp;
//ToHex(bt);
}
}
return sResult;
}
int CProtocol::FindCmd(UCHAR ucCmd , CString &strName)
{
int nResult = 0 ;
switch( ucCmd )
{
case 0x00 :
strName = "响应包" ;
break ;
case 0x44 :
strName = "获取监测模块告警" ;
break ;
case 0x4d :
strName = "获取检测模块时间" ;
break ;
case 0x4e :
strName = "设定检测模块时间" ;
break ;
case 0x4f :
strName = "获取通信协议版本号" ;
break ;
case 0x50 :
strName = "获取设备地址" ;
break ;
case 0x51 :
strName = "获取设备厂家信息" ;
break ;
case 0x55 :
strName = "程序测试用码(获取命令格式)" ;
break ;
case 0x58 :
strName = "系统复位启动" ;
break ;
case 0x60 :
strName = "初始化检测模块" ;
break ;
case 0xe0 :
strName = "设备告警上传" ;
break ;
default :
strName = "未知命令" ;
nResult = -1 ;
break ;
}
return nResult ;
}
int CProtocol::BytesToString(const UCHAR* pSrc, char* pDst, int nSrcLength)
{
const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
CString strError ;
try
{
for (int i = 0; i < nSrcLength; i++)
{
*pDst++ = tab[*pSrc >> 4]; // 输出高4位
*pDst++ = tab[*pSrc & 0x0f]; // 输出低4位
pSrc++;
}
// 输出字符串加个结束符
*pDst = '\0';
}
catch(_com_error e)
{
strError = "异常:将为十六进制转换字符时内存溢出" ;
TRACE0(strError) ;
return -1 ;
}
// 返回目标字符串长度
return (nSrcLength * 2);
}
int CProtocol::StringToBytes(const char* pSrc, UCHAR* pDst, int nSrcLength)
{
CString strError ;
//pDst = new UCHAR[nSrcLength/2];
memset(pDst,0,nSrcLength/2);
try
{
int nChange = 0 ;
for (int i = 0; i < nSrcLength; i += 2)
{
// 输出高4位
if ((*pSrc >= '0') && (*pSrc <= '9'))
*pDst = (*pSrc - '0') << 4;
else if((*pSrc >= 'A') && (*pSrc <= 'F'))
*pDst = (*pSrc - 'A' + 10) << 4;
else if((*pSrc >= 'a') && (*pSrc <= 'f'))
*pDst = (*pSrc - 'a' + 10) << 4;
else
*pDst = 0x00 << 4 ;
pSrc++;
// 输出低4位
if ((*pSrc>='0') && (*pSrc<='9'))
*pDst |= *pSrc - '0';
else if((*pSrc >= 'A') && (*pSrc <= 'F'))
*pDst |= *pSrc - 'A' + 10 ;
else if((*pSrc >= 'a') && (*pSrc <= 'z'))
*pDst |= *pSrc - 'a' + 10 ;
else
*pDst &= 0xF0 ;
pSrc++;
if( i < nSrcLength - 2 )
{
pDst++;
}
}
}
catch(_com_error e)
{
strError = "异常:将字符转换为十六进制时内存溢出" ;
TRACE0(strError);
return -1 ;
}
//返回目标数据长度
return (nSrcLength / 2);
}
int CProtocol::MsgCopy(const char* pSrc, char* pDst,int nSrcLength)
{
int nResult = 0 ;
while( nResult < nSrcLength )
{
if( *pSrc < 0 )
{
*pDst++ = *pSrc++ ;
nResult++ ;
}
*pDst++ = *pSrc++ ;
nResult++ ;
}
return nResult ;
}
int CProtocol::String2Hex(CString& str, BYTE *senddata,int iLen)
{
CString sChar,sResult,strTemp;
//strTemp.Format("%s",senddata);
sChar.Empty();
sResult.Empty();
for(int i=0;i< iLen;i++)
{
sChar.Format("%.2X",*senddata++);
sResult += sChar;
}
str = sResult;
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -