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

📄 gpsbuf.cpp

📁 该程序用MFC实现串口通信
💻 CPP
字号:
// GpsBuf.cpp: implementation of the CGpsBuf class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GpsRecv.h"
#include "GpsBuf.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGpsBuf::CGpsBuf()
{
	ReceiveData_InPtr = 0;
	ReceiveData_OutPtr = 0;
	iReadLength = 0;
}

CGpsBuf::~CGpsBuf()
{

}

void CGpsBuf::Write(BYTE * Buf, int len)
{
	for(int i = 0; i < len; i++)
	{
		ReceiveData[ReceiveData_InPtr] = Buf[i];
		ReceiveData_InPtr = ReceiveData_InPtr + 1;
		if(ReceiveData_InPtr >= GPS_BUFFER_LENGTH)
		   ReceiveData_InPtr = 0;
	}
}

int CGpsBuf::Read(BYTE * bBuf, int & iLength)
{
	if(IsFrameGps())
	{
		for(int i = 0; i < iReadLength; i++)
		{
			bBuf[i] = ReceiveData[ReceiveData_OutPtr];
			ReceiveData_OutPtr = ReceiveData_OutPtr + 1;
			if(ReceiveData_OutPtr >= GPS_BUFFER_LENGTH)
			   ReceiveData_OutPtr = 0;
		}
		iLength = iReadLength;
		bBuf[iLength] = '\0';
		return 1;
	}

	return 0;	
}

int CGpsBuf::GetDataBufSpace(void)
{
	int length;

	if(ReceiveData_InPtr == ReceiveData_OutPtr) 
		length = GPS_BUFFER_LENGTH - 1;
	else if((ReceiveData_InPtr + 1) % GPS_BUFFER_LENGTH == ReceiveData_OutPtr)
		length = 0;
	else if(ReceiveData_InPtr > ReceiveData_OutPtr)
		length = GPS_BUFFER_LENGTH - (ReceiveData_InPtr - ReceiveData_OutPtr) - 1;
	else if(ReceiveData_InPtr < ReceiveData_OutPtr)
		length = ReceiveData_OutPtr - ReceiveData_InPtr - 1;

	return length;
}

int CGpsBuf::GetBufDataLength(void)
{
	int length;
	length = GPS_BUFFER_LENGTH - GetDataBufSpace() - 1;
	return length;
}

BOOL CGpsBuf::IsFrameGps(void)
{
	 int step = 0;
	 int head = 0, tail = 0;
	 int len = GetBufDataLength();
	 while(len > 6)
	 {
		 if(!(ReceiveData[ReceiveData_OutPtr] == '$'
		   && ReceiveData[(ReceiveData_OutPtr+1)%GPS_BUFFER_LENGTH] == 'G'
		   && ReceiveData[(ReceiveData_OutPtr+2)%GPS_BUFFER_LENGTH] == 'P'
		   && ReceiveData[(ReceiveData_OutPtr+3)%GPS_BUFFER_LENGTH] == 'R'
		   && ReceiveData[(ReceiveData_OutPtr+4)%GPS_BUFFER_LENGTH] == 'M'
		   && ReceiveData[(ReceiveData_OutPtr+5)%GPS_BUFFER_LENGTH] == 'C'))
		 {
			 ReceiveData_OutPtr++;
			 if(ReceiveData_OutPtr >= GPS_BUFFER_LENGTH)
				 ReceiveData_OutPtr = 0;
			 len = GetBufDataLength();
			 if(++step >= 300) break;
		 }
		 else
		 {
			 head = 1; //Find the Head
			 break;
		 }
	 }
	 if(head != 1) return FALSE;

	 len = GetBufDataLength();
	 step = 0;
	 DWORD ptr = ReceiveData_OutPtr;
	 while(head && len > 0)
	 {
		 if(!(ReceiveData[ptr] == 0x0d
		   && ReceiveData[(ptr+1)%GPS_BUFFER_LENGTH] == 0x0a))
		 {
			 ptr++;
			 if(ptr >= GPS_BUFFER_LENGTH) ptr = 0;
			 if(ptr == ReceiveData_InPtr) break;
			 if(++step >= 100)
			 {
				ReceiveData_OutPtr = (ReceiveData_OutPtr + 100) % GPS_BUFFER_LENGTH;
				break;
			 }
		 }
		 else
		 {
			 tail = 1; //Find the Tail
			 break;
		 }
	 }
	 if(head == 1 && tail == 1) 
	 {
		 iReadLength = (ptr - ReceiveData_OutPtr + 2 + GPS_BUFFER_LENGTH) % GPS_BUFFER_LENGTH;
		 return TRUE;
	 }
	 return FALSE;
}


⌨️ 快捷键说明

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