📄 combuff.cpp
字号:
// ComBuff.cpp: implementation of the CComBuff class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ComBuff.h"
#include "constant.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CComBuff::CComBuff()
{
Head=Tail=0;
nSysChars=0;
SectionID=-1;
m_bValid=false;
}
CComBuff::~CComBuff()
{
}
//CRC低位字节值表
short CComBuff::GetCRCLo(short Ind)
{
int tt[]={0x0, 0x0, 0x10, 0x21, 0x20, 0x42, 0x30, 0x63, 0x40, 0x84, 0x50, 0xA5, 0x60, 0xC6, 0x70, 0xE7, 0x81, 0x8, 0x91, 0x29, 0xA1, 0x4A, 0xB1, 0x6B, 0xC1, 0x8C, 0xD1, 0xAD, 0xE1, 0xCE, 0xF1, 0xEF,
0x12, 0x31, 0x2, 0x10, 0x32, 0x73, 0x22, 0x52, 0x52, 0xB5, 0x42, 0x94, 0x72, 0xF7, 0x62, 0xD6, 0x93, 0x39, 0x83, 0x18, 0xB3, 0x7B, 0xA3, 0x5A, 0xD3, 0xBD, 0xC3, 0x9C, 0xF3, 0xFF, 0xE3, 0xDE,
0x24, 0x62, 0x34, 0x43, 0x4, 0x20, 0x14, 0x1, 0x64, 0xE6, 0x74, 0xC7, 0x44, 0xA4, 0x54, 0x85, 0xA5, 0x6A, 0xB5, 0x4B, 0x85, 0x28, 0x95, 0x9, 0xE5, 0xEE, 0xF5, 0xCF, 0xC5, 0xAC, 0xD5, 0x8D,
0x36, 0x53, 0x26, 0x72, 0x16, 0x11, 0x6, 0x30, 0x76, 0xD7, 0x66, 0xF6, 0x56, 0x95, 0x46, 0xB4, 0xB7, 0x5B, 0xA7, 0x7A, 0x97, 0x19, 0x87, 0x38, 0xF7, 0xDF, 0xE7, 0xFE, 0xD7, 0x9D, 0xC7, 0xBC,
0x48, 0xC4, 0x58, 0xE5, 0x68, 0x86, 0x78, 0xA7, 0x8, 0x40, 0x18, 0x61, 0x28, 0x2, 0x38, 0x23, 0xC9, 0xCC, 0xD9, 0xED, 0xE9, 0x8E, 0xF9, 0xAF, 0x89, 0x48, 0x99, 0x69, 0xA9, 0xA, 0xB9, 0x2B,
0x5A, 0xF5, 0x4A, 0xD4, 0x7A, 0xB7, 0x6A, 0x96, 0x1A, 0x71, 0xA, 0x50, 0x3A, 0x33, 0x2A, 0x12, 0xDB, 0xFD, 0xCB, 0xDC, 0xFB, 0xBF, 0xEB, 0x9E, 0x9B, 0x79, 0x8B, 0x58, 0xBB, 0x3B, 0xAB, 0x1A,
0x6C, 0xA6, 0x7C, 0x87, 0x4C, 0xE4, 0x5C, 0xC5, 0x2C, 0x22, 0x3C, 0x3, 0xC, 0x60, 0x1C, 0x41, 0xED, 0xAE, 0xFD, 0x8F, 0xCD, 0xEC, 0xDD, 0xCD, 0xAD, 0x2A, 0xBD, 0xB, 0x8D, 0x68, 0x9D, 0x49,
0x7E, 0x97, 0x6E, 0xB6, 0x5E, 0xD5, 0x4E, 0xF4, 0x3E, 0x13, 0x2E, 0x32, 0x1E, 0x51, 0xE, 0x70, 0xFF, 0x9F, 0xEF, 0xBE, 0xDF, 0xDD, 0xCF, 0xFC, 0xBF, 0x1B, 0xAF, 0x3A, 0x9F, 0x59, 0x8F, 0x78,
0x91, 0x88, 0x81, 0xA9, 0xB1, 0xCA, 0xA1, 0xEB, 0xD1, 0xC, 0xC1, 0x2D, 0xF1, 0x4E, 0xE1, 0x6F, 0x10, 0x80, 0x0, 0xA1, 0x30, 0xC2, 0x20, 0xE3, 0x50, 0x4, 0x40, 0x25, 0x70, 0x46, 0x60, 0x67,
0x83, 0xB9, 0x93, 0x98, 0xA3, 0xFB, 0xB3, 0xDA, 0xC3, 0x3D, 0xD3, 0x1C, 0xE3, 0x7F, 0xF3, 0x5E, 0x2, 0xB1, 0x12, 0x90, 0x22, 0xF3, 0x32, 0xD2, 0x42, 0x35, 0x52, 0x14, 0x62, 0x77, 0x72, 0x56,
0xB5, 0xEA, 0xA5, 0xCB, 0x95, 0xA8, 0x85, 0x89, 0xF5, 0x6E, 0xE5, 0x4F, 0xD5, 0x2C, 0xC5, 0xD, 0x34, 0xE2, 0x24, 0xC3, 0x14, 0xA0, 0x4, 0x81, 0x74, 0x66, 0x64, 0x47, 0x54, 0x24, 0x44, 0x5,
0xA7, 0xDB, 0xB7, 0xFA, 0x87, 0x99, 0x97, 0xB8, 0xE7, 0x5F, 0xF7, 0x7E, 0xC7, 0x1D, 0xD7, 0x3C, 0x26, 0xD3, 0x36, 0xF2, 0x6, 0x91, 0x16, 0xB0, 0x66, 0x57, 0x76, 0x76, 0x46, 0x15, 0x56, 0x34,
0xD9, 0x4C, 0xC9, 0x6D, 0xF9, 0xE, 0xE9, 0x2F, 0x99, 0xC8, 0x89, 0xE9, 0xB9, 0x8A, 0xA9, 0xAB, 0x58, 0x44, 0x48, 0x65, 0x78, 0x6, 0x68, 0x27, 0x18, 0xC0, 0x8, 0xE1, 0x38, 0x82, 0x28, 0xA3,
0xCB, 0x7D, 0xDB, 0x5C, 0xEB, 0x3F, 0xFB, 0x1E, 0x8B, 0xF9, 0x9B, 0xD8, 0xAB, 0xBB, 0xBB, 0x9A, 0x4A, 0x75, 0x5A, 0x54, 0x6A, 0x37, 0x7A, 0x16, 0xA, 0xF1, 0x1A, 0xD0, 0x2A, 0xB3, 0x3A, 0x92,
0xFD, 0x2E, 0xED, 0xF, 0xDD, 0x6C, 0xCD, 0x4D, 0xBD, 0xAA, 0xAD, 0x8B, 0x9D, 0xE8, 0x8D, 0xC9, 0x7C, 0x26, 0x6C, 0x7, 0x5C, 0x64, 0x4C, 0x45, 0x3C, 0xA2, 0x2C, 0x83, 0x1C, 0xE0, 0xC, 0xC1,
0xEF, 0x1F, 0xFF, 0x3E, 0xCF, 0x5D, 0xDF, 0x7C, 0xAF, 0x9B, 0xBF, 0xBA, 0x8F, 0xD9, 0x9F, 0xF8, 0x6E, 0x17, 0x7E, 0x36, 0x4E, 0x55, 0x5E, 0x74, 0x2E, 0x93, 0x3E, 0xB2, 0xE, 0xD1, 0x1E, 0xF0
};
return tt[Ind*2+1];
}
//CRC高位字节值表
short CComBuff::GetCRCHi(short Ind)
{
// GetCRCHi = Choose(Ind * 2 + 1, _
int tt[]={0x0, 0x0, 0x10, 0x21, 0x20, 0x42, 0x30, 0x63, 0x40, 0x84, 0x50, 0xA5, 0x60, 0xC6, 0x70, 0xE7, 0x81, 0x8, 0x91, 0x29, 0xA1, 0x4A, 0xB1, 0x6B, 0xC1, 0x8C, 0xD1, 0xAD, 0xE1, 0xCE, 0xF1, 0xEF,
0x12, 0x31, 0x2, 0x10, 0x32, 0x73, 0x22, 0x52, 0x52, 0xB5, 0x42, 0x94, 0x72, 0xF7, 0x62, 0xD6, 0x93, 0x39, 0x83, 0x18, 0xB3, 0x7B, 0xA3, 0x5A, 0xD3, 0xBD, 0xC3, 0x9C, 0xF3, 0xFF, 0xE3, 0xDE,
0x24, 0x62, 0x34, 0x43, 0x4, 0x20, 0x14, 0x1, 0x64, 0xE6, 0x74, 0xC7, 0x44, 0xA4, 0x54, 0x85, 0xA5, 0x6A, 0xB5, 0x4B, 0x85, 0x28, 0x95, 0x9, 0xE5, 0xEE, 0xF5, 0xCF, 0xC5, 0xAC, 0xD5, 0x8D,
0x36, 0x53, 0x26, 0x72, 0x16, 0x11, 0x6, 0x30, 0x76, 0xD7, 0x66, 0xF6, 0x56, 0x95, 0x46, 0xB4, 0xB7, 0x5B, 0xA7, 0x7A, 0x97, 0x19, 0x87, 0x38, 0xF7, 0xDF, 0xE7, 0xFE, 0xD7, 0x9D, 0xC7, 0xBC,
0x48, 0xC4, 0x58, 0xE5, 0x68, 0x86, 0x78, 0xA7, 0x8, 0x40, 0x18, 0x61, 0x28, 0x2, 0x38, 0x23, 0xC9, 0xCC, 0xD9, 0xED, 0xE9, 0x8E, 0xF9, 0xAF, 0x89, 0x48, 0x99, 0x69, 0xA9, 0xA, 0xB9, 0x2B,
0x5A, 0xF5, 0x4A, 0xD4, 0x7A, 0xB7, 0x6A, 0x96, 0x1A, 0x71, 0xA, 0x50, 0x3A, 0x33, 0x2A, 0x12, 0xDB, 0xFD, 0xCB, 0xDC, 0xFB, 0xBF, 0xEB, 0x9E, 0x9B, 0x79, 0x8B, 0x58, 0xBB, 0x3B, 0xAB, 0x1A,
0x6C, 0xA6, 0x7C, 0x87, 0x4C, 0xE4, 0x5C, 0xC5, 0x2C, 0x22, 0x3C, 0x3, 0xC, 0x60, 0x1C, 0x41, 0xED, 0xAE, 0xFD, 0x8F, 0xCD, 0xEC, 0xDD, 0xCD, 0xAD, 0x2A, 0xBD, 0xB, 0x8D, 0x68, 0x9D, 0x49,
0x7E, 0x97, 0x6E, 0xB6, 0x5E, 0xD5, 0x4E, 0xF4, 0x3E, 0x13, 0x2E, 0x32, 0x1E, 0x51, 0xE, 0x70, 0xFF, 0x9F, 0xEF, 0xBE, 0xDF, 0xDD, 0xCF, 0xFC, 0xBF, 0x1B, 0xAF, 0x3A, 0x9F, 0x59, 0x8F, 0x78,
0x91, 0x88, 0x81, 0xA9, 0xB1, 0xCA, 0xA1, 0xEB, 0xD1, 0xC, 0xC1, 0x2D, 0xF1, 0x4E, 0xE1, 0x6F, 0x10, 0x80, 0x0, 0xA1, 0x30, 0xC2, 0x20, 0xE3, 0x50, 0x4, 0x40, 0x25, 0x70, 0x46, 0x60, 0x67,
0x83, 0xB9, 0x93, 0x98, 0xA3, 0xFB, 0xB3, 0xDA, 0xC3, 0x3D, 0xD3, 0x1C, 0xE3, 0x7F, 0xF3, 0x5E, 0x2, 0xB1, 0x12, 0x90, 0x22, 0xF3, 0x32, 0xD2, 0x42, 0x35, 0x52, 0x14, 0x62, 0x77, 0x72, 0x56,
0xB5, 0xEA, 0xA5, 0xCB, 0x95, 0xA8, 0x85, 0x89, 0xF5, 0x6E, 0xE5, 0x4F, 0xD5, 0x2C, 0xC5, 0xD, 0x34, 0xE2, 0x24, 0xC3, 0x14, 0xA0, 0x4, 0x81, 0x74, 0x66, 0x64, 0x47, 0x54, 0x24, 0x44, 0x5,
0xA7, 0xDB, 0xB7, 0xFA, 0x87, 0x99, 0x97, 0xB8, 0xE7, 0x5F, 0xF7, 0x7E, 0xC7, 0x1D, 0xD7, 0x3C, 0x26, 0xD3, 0x36, 0xF2, 0x6, 0x91, 0x16, 0xB0, 0x66, 0x57, 0x76, 0x76, 0x46, 0x15, 0x56, 0x34,
0xD9, 0x4C, 0xC9, 0x6D, 0xF9, 0xE, 0xE9, 0x2F, 0x99, 0xC8, 0x89, 0xE9, 0xB9, 0x8A, 0xA9, 0xAB, 0x58, 0x44, 0x48, 0x65, 0x78, 0x6, 0x68, 0x27, 0x18, 0xC0, 0x8, 0xE1, 0x38, 0x82, 0x28, 0xA3,
0xCB, 0x7D, 0xDB, 0x5C, 0xEB, 0x3F, 0xFB, 0x1E, 0x8B, 0xF9, 0x9B, 0xD8, 0xAB, 0xBB, 0xBB, 0x9A, 0x4A, 0x75, 0x5A, 0x54, 0x6A, 0x37, 0x7A, 0x16, 0xA, 0xF1, 0x1A, 0xD0, 0x2A, 0xB3, 0x3A, 0x92,
0xFD, 0x2E, 0xED, 0xF, 0xDD, 0x6C, 0xCD, 0x4D, 0xBD, 0xAA, 0xAD, 0x8B, 0x9D, 0xE8, 0x8D, 0xC9, 0x7C, 0x26, 0x6C, 0x7, 0x5C, 0x64, 0x4C, 0x45, 0x3C, 0xA2, 0x2C, 0x83, 0x1C, 0xE0, 0xC, 0xC1,
0xEF, 0x1F, 0xFF, 0x3E, 0xCF, 0x5D, 0xDF, 0x7C, 0xAF, 0x9B, 0xBF, 0xBA, 0x8F, 0xD9, 0x9F, 0xF8, 0x6E, 0x17, 0x7E, 0x36, 0x4E, 0x55, 0x5E, 0x74, 0x2E, 0x93, 0x3E, 0xB2, 0xE, 0xD1, 0x1E, 0xF0
};
return tt[Ind*2];
}
char * CComBuff::CRCCheck(unsigned char* OldStr,int OldCount,unsigned char *Verify)
{
int CRC16Hi,CRC16Lo,iIndex,TmpiIndex,i;
unsigned char *TmpBuff;
TmpBuff=OldStr;
for (i=0;i<2;i++)
TmpBuff[OldCount+i]=0;
iIndex = TmpBuff[0];
CRC16Hi = TmpBuff[1];
CRC16Lo = TmpBuff[2];
for (i=0;i<OldCount;i++)
{
TmpiIndex = GetCRCHi(iIndex)^CRC16Hi; //高位处理
CRC16Hi = GetCRCLo(iIndex)^CRC16Lo; //低位处理
iIndex = TmpiIndex;
if (i < OldCount-1)
CRC16Lo = TmpBuff[3 + i];
}
Verify[0]= iIndex; //CRC高位
Verify[1] = CRC16Hi; //CRC低位
return 0;
}
//把数据存入缓冲区
void CComBuff::SaveBuff(unsigned char *sBuff, int sCount)
{
int i;//,RCount;
m_CriLock.Lock();
i = MaxComBuffCounts - Head + Tail - 1; //MaxComBuffCounts=2048 剩余空间
if( i>MaxComBuffCounts)
i=i%MaxComBuffCounts;
if (i < sCount){ //剩余空间不够存放,通信缓冲区溢出
Head = 0;
Tail = 0;
m_CriLock.Unlock();
return;
}
for(i=0;i<sCount;i++)
{
buff[Head]=sBuff[i];
Head = (Head + 1) %MaxComBuffCounts;
}
m_CriLock.Unlock();
}
//解包,返回TRUE,表示正确解出数据包,返回rBuff()含有数据,
//把数据从buff放到指定数组中
//rCount为数据包字节数目,不包含效验字节
bool CComBuff::GetTab(COleDateTime *t)
{
int pHead, pTail , bCount ,loc ,i;
int tabCount ;
bool VerifyFlag ;
//使用临时头尾指针
m_CriLock.Lock();
pHead = Head;
pTail = Tail;
m_CriLock.Unlock();
//空:头=尾
//满:(头+1)Mod BuffCnts=尾
//缓冲区实际上最多存BuffCnts-1字节数据。头指针指向的单元总是空的,不能保存数据。
if (pTail == pHead)
return false;
while(pTail!=pHead) //缓冲区不空循环。
{
if(buff[pTail]=='$')//帧头 /$GPRMC
{
SectionID=-1;
m_bValid=false;
m_sTime=m_sDate=m_sPositionY=m_sPositionX="";
bCount = (MaxComBuffCounts + pHead - pTail)%MaxComBuffCounts; //缓冲取字节数目
if (bCount < 6) //表长字节未到达
{
m_CriLock.Lock();
Tail = pTail; //尾指针更新,此时尾指针停留在4个同步字符后的第一个字节
m_CriLock.Unlock();
return false ;
}
else
{///$GPRMC
if(buff[(pTail + 1)%MaxComBuffCounts]=='G' && buff[(pTail + 2)%MaxComBuffCounts]=='P' && buff[(pTail + 3)%MaxComBuffCounts]=='R' && buff[(pTail + 4)%MaxComBuffCounts]=='M' && buff[(pTail + 5)%MaxComBuffCounts]=='C')//帧头 /$GPRMC
{
SectionID=0;
}
else
{
SectionID=-1;
}
pTail=(pTail + 6)%MaxComBuffCounts;
goto NextChar;
}
}
else if(buff[pTail]==10)//帧尾
{
if(m_bValid==true && SectionID>0)
{
TRACE("%s \n ",m_sDate +m_sTime);
/*COleDateTime tt;
COleDateTimeSpan tspan;
tt.SetDateTime(2000+atoi(m_sDate.Mid(4,2)),atoi(m_sDate.Mid(2,2)),atoi(m_sDate.Mid(0,2)),atoi(m_sTime.Mid(0,2)),atoi(m_sTime.Mid(2,2)),atoi(m_sTime.Mid(4,2)));
tspan.SetDateTimeSpan(0,8,0,0);
tt=tt+tspan;
*t=tt;
TRACE("%d-%d-%d %d:%d:%d \n ",(*t).GetYear(),tt.GetMonth(),tt.GetDay(),tt.GetHour(),tt.GetMinute(),tt.GetSecond());
*/
COleDateTimeSpan tspan;
(*t).SetDateTime(2000+atoi(m_sDate.Mid(4,2)),atoi(m_sDate.Mid(2,2)),atoi(m_sDate.Mid(0,2)),atoi(m_sTime.Mid(0,2)),atoi(m_sTime.Mid(2,2)),atoi(m_sTime.Mid(4,2)));
tspan.SetDateTimeSpan(0,8,0,0);
*t=*t+tspan;
TRACE("%d-%d-%d %d:%d:%d \n ",(*t).GetYear(),(*t).GetMonth(),(*t).GetDay(),(*t).GetHour(),(*t).GetMinute(),(*t).GetSecond());
pTail=(pTail + 1)%MaxComBuffCounts;
m_CriLock.Lock();
Tail = pTail; //尾指针更新,此时尾指针停留在4个同步字符后的第一个字节
m_CriLock.Unlock();
return true;
}
SectionID=0;
}
else if(buff[pTail]==',')//SectionID为逗号计数器
{
if (SectionID>=0)
SectionID++;
}
else
{
switch(SectionID)
{
case 1: //提取出时间
m_sTime+=buff[pTail];
break;
case 2: //判断数据是否可信(当GPS天线能接收到有3颗GPS卫星时为A,可信)
if(buff[pTail]=='A')
m_bValid=true;
else
m_bValid=false;
break;
case 3: //提取出纬度
m_sPositionY+=buff[pTail];
break;
case 5: //提取出经度
m_sPositionX+=buff[pTail];
break;
case 9: //提取出日期
m_sDate+=buff[pTail];
break;
default:
break;
}
}
pTail = (pTail + 1)%MaxComBuffCounts;
NextChar: ;
}
m_CriLock.Lock();
Tail = pTail;
m_CriLock.Unlock();
return false ;
}
int CComBuff::PackTable(unsigned char* Table, int TabCount)
{
char tmpBuff[1024];
int i;
unsigned char VerifyCode[2];
if(TabCount>1024)
return(0);
//修改表长
long lTmpTableLen;
lTmpTableLen=Table[0]*256+Table[1]+2;
Table[1]=lTmpTableLen % 256;
Table[0]=(lTmpTableLen-Table[1]) / 256;
//加入CRC校验码 8 0 0 5 3 8'50 233
CRCCheck(Table,TabCount,VerifyCode);
//加同步字符
for(i=0;i<SysCharCount;i++)
tmpBuff[i]=ComSysChar;
for(i=0;i<TabCount;i++)
tmpBuff[i+SysCharCount]=Table[i];
tmpBuff[TabCount+SysCharCount]=VerifyCode[0];
tmpBuff[TabCount+SysCharCount+1]=VerifyCode[1];
for(i=0;i<=SysCharCount+TabCount+2;i++)
Table[i]=tmpBuff[i];
return(SysCharCount+TabCount+2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -