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

📄 combuff.cpp

📁 gps对时
💻 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 + -