调试MG2639上线不稳定,总是挂断重连,或者不上线。

作者:fly 发布于:2014-3-11 22:39 分类:嵌入式

版权声明:本文系www.forwhat.cn原创 ,尊重作者劳动,转载请标明出处。本文转载自www.forwhat.cn谢谢

 

我这里先贴出两个函数来,大家看一下,问题是出在哪里。一个小地方。以下是修改之前的代码。

TQ_U8 AT_MG2639_OpenPPP(TQ_S8* usr,TQ_S8* pwd,TQ_S8* apn,TQ_U32 timeout)
{//这个是注册上GPRS网络之后,打开PPP链接的部分。
	TQ_S8 atcmd[50];
	TQ_U32 atcmdlenght=0;
	TQ_U8 rt;
	memset(atcmd,0,50);
	memcpy(atcmd,"AT+ZPNUM=\"",10);
	atcmdlenght=10;
	memcpy(&atcmd[atcmdlenght],apn,strlen(apn));
	atcmdlenght+=strlen(apn);
	memcpy(&atcmd[atcmdlenght],"\",\"",3);
	atcmdlenght+=3;
	memcpy(&atcmd[atcmdlenght],usr,strlen(usr));
	atcmdlenght+=strlen(usr);
	memcpy(&atcmd[atcmdlenght],"\",\"",3);
	atcmdlenght+=3;
	memcpy(&atcmd[atcmdlenght],pwd,strlen(pwd));
	atcmdlenght+=strlen(pwd);
	memcpy(&atcmd[atcmdlenght],"\"\r\n",3);
	atcmdlenght+=3;
	rt = AT_MG2639_SendATByBlock(MG2639_ATCommand_OpenPPP,atcmd,timeout,atcmdlenght);
	if(rt==Err_none)
	{
		rt = AT_MG2639_SendATByBlock(MG2639_ATCommand_OpenGPRS,"AT+ZPPPOPEN\r\n",timeout,13);
		if(rt==Err_none)
		{	
			TQ_U8 perr;
			if(OSFlagAccept(Flags_AT,FLAG_AT_Connect,OS_FLAG_WAIT_SET_ANY,&perr))
			{
				return Err_none;
			}
			else
			{
				return Ret_ATFail;
			}
		}
		return rt; 
	}
	return rt;
}
 
TQ_U8 AT_MG2639_SendATByBlock(MG2639_ATCOMMAND_TYPE_DEF AtCommandType,TQ_S8 * atcmd,TQ_U32 timeout,TQ_U32 lenght)
{//阻塞发送函数
	TQ_U8 perr;
	TQ_U8 per;
	TQ_U8 retry=0;
	while(1)
	{
		#ifdef MG2639CheckMytexDEBUG
		AT_MG2639_DebugOut("sendat req autex\r\n");
		#endif
		OSMutexPend(AT_Mutex,timeout,&perr);
		if(perr==OS_ERR_NONE)
		{//如果申请到锁
			#ifdef MG2639CheckMytexDEBUG
			AT_MG2639_DebugOut("sendat getted autex\r\n");
			#endif
			MG2639_Info.ATCommand_Type=AtCommandType;
			AT_MG2639_ClearAllFlag();
			HW_MG2639_SendDT((TQ_U8*)atcmd,lenght);
			#ifdef MG2639DEBUG
			AT_MG2639_DebugOut("SendAT=");
			AT_MG2639_DebugBin((TQ_U8*)atcmd,lenght);
			#endif
			OSFlagPend(Flags_AT,FLAG_AT_Success|FLAG_AT_Fail, OS_FLAG_WAIT_SET_ANY,3000,&per);
			if(per==OS_ERR_NONE)
			{//这里是标志位已置位
				if(OSFlagAccept(Flags_AT,FLAG_AT_Success,OS_FLAG_WAIT_SET_ANY,&per))
				{
					MG2639_Info.ATCommand_Type=MG2639_ATCommand_Null;
					#ifdef MG2639CheckMytexDEBUG
					AT_MG2639_DebugOut("snedat put autex 01\r\n");
					#endif
					OSMutexPost(AT_Mutex);
					return Err_none;
				}
				else
				{
					MG2639_Info.ATCommand_Type=MG2639_ATCommand_Null;
					#ifdef MG2639CheckMytexDEBUG
					AT_MG2639_DebugOut("snedat put autex 02\r\n");
					#endif
					OSMutexPost(AT_Mutex);
					return Ret_ATFail;
				}
			}
			else if(per==OS_ERR_TIMEOUT)
			{//这里是规定时间内没有得到回复。可能是模块通讯出了问题。
				#ifdef MG2639CheckMytexDEBUG
				AT_MG2639_DebugOut("snedat put autex 03\r\n");
				#endif
				OSMutexPost(AT_Mutex);//释放互斥锁
				if(retry++>3)
				{
					MG2639_Info.ATCommand_Type=MG2639_ATCommand_Null;
					AT_MG2639_TranslationErr();
					return Err_timeout;
				}				
			}
			else
			{
				MG2639_Info.ATCommand_Type=MG2639_ATCommand_Null;
				#ifdef MG2639CheckMytexDEBUG
				AT_MG2639_DebugOut("snedat put autex 04\r\n");
				#endif
				OSMutexPost(AT_Mutex);
			}
		}
		else if(perr==OS_ERR_TIMEOUT)
		{//等待超时
			return Err_timeout;
		}
		else
		{
			MG2639_Info.ATCommand_Type=MG2639_ATCommand_Null;
			#ifdef MG2639CheckMytexDEBUG
			AT_MG2639_DebugOut("snedat put autex 05\r\n");
			#endif
			OSMutexPost(AT_Mutex);
			Sys_Reset();
			//这里是系统出了问题。
		}
	}
}


大家能找到我错在哪里了吗?

互斥锁 AT_Mutex

我在释放互斥锁之后对标志组事件进行了判断。此时。释放互斥锁之后,高优先级的任务拿到锁,会对标志组进行清空。从而导致被中断任务判断标志位无效,或出错,从而导致的PPP链接误以为打开失败,实际上已经操作成功,只不过是标志位没有正常判断而已。



 

发表评论:

 
Powered by emlog sitemap