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

📄 rs232module.cpp

📁 MTK平台COM口通讯的源代码。很底层的。可以学习一下。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	return true;
}


bool Rs232Module::SkipComma( char *ptr, int& ri, const int size)
{
	while(ri < size && *(ptr+ri)!=',')
		ri++;

	if (ri == size)
	{
		ri--;
		return false;
	}
	else
		return true;
}


bool Rs232Module::GetString(char *ptr, int& wi, ATParamLst& lst)
{
	
	ATParamElem  elem;

	readIndex++; // Skip "

	wi = 0;

	while(respDataBuf[readIndex]!='"')
	{
		switch(respDataBuf[readIndex])
		{
		case '\0':
			return false;

			break;

		default:
			ptr[wi++] = respDataBuf[readIndex++];
			break;
		}
	}


	ptr[wi]='\0';
	elem.type = AT_STRING;
	elem.str_value = string(ptr);
	lst.eleLst.push_back(elem);


	while(respDataBuf[readIndex]!='\0'
	&& respDataBuf[readIndex]!=',')
	{
		readIndex++;
	}
	
	if(respDataBuf[readIndex]==',')
		readIndex++;

	if(respDataBuf[readIndex]=='\0')
		readIndex--;

	return true;
}

bool Rs232Module::GetString(char *ptr, int& wi, ATParamElem& elem)
{
	ATParamElem  elemLocal;

	readIndex++; // Skip "

	wi = 0;

	while(respDataBuf[readIndex]!='"')
	{
		switch(respDataBuf[readIndex])
		{
		case '\0':
			return false;

			break;

		default:
			ptr[wi++] = respDataBuf[readIndex++];
			break;
		}
	}


	ptr[wi]='\0';
	elemLocal.type = AT_STRING;
	elemLocal.str_value = string(ptr);
	

	while(respDataBuf[readIndex]!='\0'
	&& respDataBuf[readIndex]!=')'
	&& respDataBuf[readIndex]!=',')
	{
		readIndex++;
	}
	
	if(respDataBuf[readIndex]==',')
		readIndex++;

	if(respDataBuf[readIndex]=='\0'
	|| respDataBuf[readIndex]==')')
		readIndex--;

	return true;
}


bool Rs232Module::IsNumber(char *ptr)
{
	int len = strlen(ptr);

	for(int i =0; i<len; i++)
	{
		if( (*(ptr+i) < '0')
		||  (*(ptr+i) > '9')
		)
		{
			return false;
		}
	}
	return true;
}


bool Rs232Module::GetLstString(char *ptr, int& wi, ATParamElem& elem)
{
	ATParamElem  elemLocal;

	readIndex++; // Skip "

	wi = 0;

	while(respDataBuf[readIndex]!='"')
	{
		switch(respDataBuf[readIndex])
		{
		case '\0':
			return false;

			break;

		default:
			ptr[wi++] = respDataBuf[readIndex++];
			break;
		}
	}

	

	ptr[wi]='\0';


	return true;
}


bool Rs232Module::GetStringToBuf(char *ptr, int& wi, const int size)
{
	wi = 0;

	readIndex++; // Skip one "

	while(respDataBuf[readIndex]!='"')
	{
		switch(respDataBuf[readIndex])
		{
		case '\0':
			return false;

			break;

		default:
			ptr[wi++] = respDataBuf[readIndex++];
			break;
		}

		if(readIndex>=size)
			return false;
	}

	ptr[wi]='\0';

	#ifdef SP_DEBUG
		string tmpString((const char *)ptr, wi);
		tmpString[wi]='\0';	
		TRACE("Rs232Module::GetStringToBuf():  %s\n", tmpString.c_str());
	#endif

	return true;
}


bool Rs232Module::UnsolicitedGetPdu(char *buf, const int bufLen, ATParamLst& lst)
{

	ATParamElem elem;

	if(lst.eleLst[0].str_value == "+CMT"
	|| lst.eleLst[0].str_value == "+CBM"
	|| lst.eleLst[0].str_value == "+CDS")
	{
		// Get pdu data to buffer
		GetPdu(buf, bufLen);

		// Set up elem
		elem.type = AT_STRING;
		elem.str_value = string(buf);

		// Push to the elem to elemlst
		lst.eleLst.push_back(elem);
	}

	return true;
}


bool Rs232Module::GetRawData(unsigned char &ch)
{
	if( m_idxReadRawBuffer == m_iRead )
		return false;
	else
		ch = rawchars[m_idxReadRawBuffer++];

	return true;
}

void Rs232Module::SetCurCommand(unsigned char *ptr, int len)
{
	memcpy(m_curCommand, ptr, len);
	m_curCommand[len]='\0';
}


HANDLE Rs232Module::GetWriteEvent()
{
	return m_hWriteEvt;
}


HANDLE Rs232Module::GetParserEvent()
{
	return m_hParserEvt;
}

void Rs232Module::GetResult(ATResult& rt)
{
	#ifdef SP_DEBUG
	TRACE(" ----AP COPY DATA FROM PARSER \n");
	#endif
	rt = result;
}


void Rs232Module::SetCallBack(void(*unSolicitedFunc)(ATResult& result))
{
	m_usc_cb = unSolicitedFunc;	
}


void Rs232Module::SetExpectString(string command)
{
	result.expectedCommand=command;
	#ifdef SP_LEVEL1
	TRACE("Expected Command: %s\n", command.c_str());
	#endif
}


bool Rs232Module::AnalyingRespString()
{

	int size = strlen(respDataBuf);
	char	tmp[1024];
	int		tmpWI =0;
	bool	ignoreWhiteSpace = false;
	string endString;
	string command = "";
	bool    stag = false;
	bool    getDbQEmptyString=false;


	ATParamElem elem;
	ATParamLst	paraLst;

	readIndex =0;

	#ifdef T_DEBUG
		string tmpStr(respDataBuf, size);	
		tmpStr[size]='\0';
		TRACE("PARSER: [Entire resp] %s\n", tmpStr.c_str());
	#endif

	while(readIndex!=(size+1) && !m_bReset)
	{

		if(::WaitForSingleObject( m_hResetEvt, 0) == WAIT_OBJECT_0)
		{
			#ifdef SP_LEVEL1
			TRACE("\t\t\t\tAnalyingRespString(): exit by reset event\n");
			#endif
			break;
		}

		switch(respDataBuf[readIndex])
		{
		case '\0':
			tmp[tmpWI] = '\0';
			if (command.empty())
				command = tmp;
			else
				endString = tmp;

			if(command == "> ")
			{
				tmp[0]='\0';
			}
			else if(command == "OK"
			|| command == "ERROR"
			|| command == "CONNECT"
			)
			{

				// Just fill the data to the result structure
				result.result = AT_SUCCESS;
				
				elem.type = AT_STRING;
				elem.str_value = command;
				paraLst.eleLst.push_back(elem);

				
				result.resultLst.push_back(paraLst);

				Sync();

				tmp[0]='\0';


			}
			else if(command == "+CME ERROR"
				 || command == "+CMS ERROR")
			{
				ATParamElem telem;
				telem.type = AT_INTEGER;
				telem.int_value = atoi(tmp);
				paraLst.eleLst.push_back(telem);

				result.result = AT_SUCCESS;
				result.resultLst.push_back(paraLst);

#ifdef SPSP_DEBUG
				cout << "result in parser: \n";
				cout << result << endl;
#endif
				tmp[0] = '\0';
				Sync();
				
			}
			else if(IsUnsolicited(command, paraLst))
			{
				//Check if current paraLst  is a unsolicited command
				// Call the unsolicited call back function to notify
				// upper layer.

				if(sizeof(tmp)!=0)
					GetParam(tmp, paraLst, false);

				UnsolicitedGetPdu(tmp, 2047, paraLst);

				unsolicitedRt.result = AT_SUCCESS;
				unsolicitedRt.resultLst.push_back(paraLst);

#ifdef SPSP_DEBUG
				cout << "result in parser: \n";
				cout << result << endl;
#endif

				m_usc_cb(unsolicitedRt);
				CleanResult(unsolicitedRt);
			}
			else if(command == result.expectedCommand )
			{
				// Get the pdu block and push it the the parameter list

				if((strlen(tmp)!=0 )
				|| (getDbQEmptyString == true))
					GetParam( tmp, paraLst, stag);

				if(pduFlag)
				{
					// Get PDU
					TRACE(_T("PARSER: Get PDU\n"));
					GetPduToBuf();

					// Put to parameter list
					elem.type = AT_STRING;
					elem.str_value = string(m_pduBuf);

					paraLst.eleLst.push_back(elem);

					pduFlag = false;
				}
				result.resultLst.push_back(paraLst);
			}
			else
			{
				TRACE(_T("~~~~~~ONE COMMAND IS SKIPPED!\n"));
			}
			break;

		case ',':
			tmp[tmpWI]='\0';
			GetParam( tmp, paraLst, stag);
			tmpWI = 0;
			stag = false;
			ignoreWhiteSpace = true;

			break;

		case ':':
			#ifdef SP_LEVEL1
			TRACE("+EFSL: 'XXXXXX' STEP 1\n");
			#endif
			tmp[tmpWI]='\0';
			ignoreWhiteSpace = true;

			readIndex++;	// skip ':'

			command = tmp;

			elem.type = AT_STRING;
			elem.str_value = string(command);
			paraLst.eleLst.push_back(elem);

			tmpWI = 0; // clear tmp
			
			break;

		case '(':
			GetList(tmp, tmpWI, elem);
			paraLst.eleLst.push_back(elem);
			elem.paramLst.clear();

			SkipComma(respDataBuf, readIndex, size);

			tmp[0]='\0';
			break;

		case '"':	
			#ifdef SP_LEVEL1
			TRACE("+EFSL: 'XXXXXX' STEP 2\n");
			#endif
			if(!GetStringToBuf(tmp, tmpWI, (size+1)))
			{
				TRACE(_T("**********+EFSL: 'XXXXXX' STEP 3\n"));
				return false;
			}

			if(strlen(tmp)==0)
				getDbQEmptyString = true;

			stag = true;

			break;

		default:
			if(ignoreWhiteSpace == false)
			{
				tmp[tmpWI++] = respDataBuf[readIndex];
			}
			else
			{
				if(respDataBuf[readIndex]!=' ')
				{
					ignoreWhiteSpace = false;
					tmpWI = 0;
					tmp[tmpWI++] = respDataBuf[readIndex];
				}
			}
			
			break;
		}
		readIndex++;
	}	

	return true;
}


void Rs232Module::Sync()
{

	#ifdef SP_LEVEL1
	TRACE("Rs232Module::Sync()     -----7\n");
	#endif
	// Check InProgressEvt to check if the result should be given up.
	

	if(::WaitForSingleObject(m_hInProgressEvt, 0) == WAIT_TIMEOUT)
	{
		// No command is in progressing
		#ifdef SP_LEVEL1
		TRACE("\tNo Command In progressing, Skip the result of cancel.\n");
		#endif
		CleanResult(result);
		return;
	}

	if( ::WaitForSingleObject( m_hResetEvt, 0)== WAIT_OBJECT_0)
	{
		#ifdef SP_LEVEL1
		TRACE(">>>>>ResetInSync: so Clean Result<<<\n");
		#endif
		CleanResult(result);
		return;
	}

	
	::SetEvent(m_hWriteEvt);
	
	// Write command copy data in this time period

#ifdef T_DEBUG
	if(result.resultLst.size()==0)
	{	
		ASSERT(false);
	}

#endif

	::WaitForSingleObject(m_hParserEvt, INFINITE);
	::ResetEvent(m_hParserEvt);

#ifdef T_DEBUG
	if(result.resultLst.size()==0)
	{	
		ASSERT(false);
	}
#endif

	CleanResult(result);
}


bool Rs232Module::IsUnsolicited(string cmd, ATParamLst& lst)
{
    ATParamElem elem;

	if( cmd == "RING" )
	{
		return true;
	}

	if(lst.eleLst.size()==0)
		return false;

	if(lst.eleLst[0].type != AT_STRING)
		return false;

	// Then handled unsolicited command is listed here
	// This should take care of all the unsolicited command
	// listed in spec.
	if(
	   lst.eleLst[0].str_value == "RING"
	|| lst.eleLst[0].str_value == "NO CARRIER"
	|| lst.eleLst[0].str_value == "+CMT"
	|| lst.eleLst[0].str_value == "+CBM"
	|| lst.eleLst[0].str_value == "+CDS"
	|| lst.eleLst[0].str_value == "+CMTI"
	|| lst.eleLst[0].str_value == "+CBMI"
	|| lst.eleLst[0].str_value == "+CDSI"
	|| lst.eleLst[0].str_value == "+CLIP"
	|| lst.eleLst[0].str_value == "+EADC"
	|| lst.eleLst[0].str_value == "+GPIOS"
	|| lst.eleLst[0].str_value == "+EKPDS"
	|| lst.eleLst[0].str_value == "+BATS"
	)
		return true;

	else
		return false;
}



bool Rs232Module::GetParam(char *ptr, ATParamElem& elem, bool isString)
{

	ATParamElem elemLocal;

	if(isString)
	{
		elemLocal.type = AT_STRING;
		elemLocal.str_value = string(ptr);
	}
	else
	{
		if(strlen(ptr)==0)
			elemLocal.type = AT_OMIT;

		
		if(IsNumber(ptr))
		{
			elemLocal.type = AT_INTEGER;
			elemLocal.int_value = atoi(ptr);
		}
		else
		{
			elemLocal.type = AT_STRING;
			elemLocal.str_value = string(ptr);
		}
	}

	elem.paramLst.push_back(elemLocal);


	return true;
}

bool Rs232Module::GetParam(char *ptr, ATParamLst& lst, bool isString)
{

	ATParamElem elem;

	if(isString)
	{
		elem.type = AT_STRING;
		elem.str_value = string(ptr);
	}
	else
	{
		if(strlen(ptr)==0)
		{
			elem.type = AT_OMIT;

		}
		else
		{
			if(IsNumber(ptr))
			{
				elem.type = AT_INTEGER;
				elem.int_value = atoi(ptr);
			}
			else
			{
				elem.type = AT_STRING;
				elem.str_value = string(ptr);
			}
		}
	}
	lst.eleLst.push_back(elem);


	return true;
}


HANDLE Rs232Module::GetInProgressEvent()
{	
	return m_hInProgressEvt;
}


HANDLE Rs232Module::GetCleanedEvent()
{	
	return m_hCleanedEvt;
}

HANDLE Rs232Module::GetCancelEvent()
{
	return m_hCancelEvt;
}

void Rs232Module::CancelSync()
{
	DWORD state;

	#ifdef SP_LEVEL1
	TRACE("Rs232Module::CancelSync() -- Enter\n");
	TRACE("Rs232Module::CancelSync() -- m_ParserEvent HANDLE = %d\n", m_hParserEvt);
	#endif

	// Check InProgressEvt to check if the result should be given up.
	state = ::WaitForSingleObject(m_hInProgressEvt, 0);

	if(state == WAIT_TIMEOUT)
	{
		// No command is in progressing
		#ifdef SP_LEVEL1
		TRACE("\tNo Command In progressing, Skip the result of cancel.\n");
		#endif
		CleanResult(result);
		return;
	}

	CleanResult(result);
	
	//Setting the result to be AT_TIMEOUT
	result.result = AT_TIMEOUT;
	
	::SetEvent(m_hWriteEvt);
	
	// Write command copy data in this time period

	state = ::WaitForSingleObject(m_hParserEvt, INFINITE);
	::ResetEvent(m_hParserEvt);

	#ifdef SP_LEVEL1
	TRACE("Rs232Module::CancelSync() -- Exit\n");
	#endif

}


HANDLE Rs232Module::GetResetEvent()
{
	return m_hResetEvt;
}





⌨️ 快捷键说明

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