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

📄 modem.~c

📁 采用cb平台开发
💻 ~C
📖 第 1 页 / 共 2 页
字号:
						DebugPrint("没有收到RR的确认帧,本机再发送UA帧 \r\n");
					#endif
				}
				else
				{
online_step:				    
					ModemSendFrame(RR_FRAME,0,0);					

					
					lModemSta =STA_LINE_IDLE;
					
					RecV80Data.lLen =0;
					
					#ifdef MODEM_DEBUG
						DebugPrint("收到RR的确认帧,拨号成功 \r\n");
					#endif
				}
			}
		}			
		//*AT91C_TC3_IER =AT91C_TC_CPCS;
		return;
	}	

	if(strstr(ModemBuff,"NO CARRIER") != 0)
	{
		lModemSta=STA_LINE_DATAOFF;
		#ifdef MODEM_DEBUG
			DebugString(0,"对方异常挂机。NO CARRIER.\r\n");
		#endif
		return;
	}
		
	V80PackState=AnalyV80Pack();
	//---------------------------------------------------------------
	if (WaitConfirm>1)
		WaitConfirm--;	
		
	if(V80PackState == TRUE)
	{
		if((RecV80Data.cData[1]&0x1f)==RR_FRAME)
		{
			#ifdef MODEM_DEBUG
			    DebugString(0,"收到对方控制帧,并打印:!\r\n");
			    DebugData(0,5,10,RecV80Data.cData);
			#endif
           
			WaitConfirm=0;

			if (SynModemStu.SendEndFlag==SEND_START)
			{
		        SendFrameMsg();
		   	    #ifdef MODEM_DEBUG
				    sprintf(msg,"NS=0x%x,confirmNS=0x%x\r\n",NS,confirmNS);
				    DebugString(0,msg);
			    #endif		       
			}
			else if (SynModemStu.SendEndFlag==SEND_SENDING)
			{	
			    confirmNS=((RecV80Data.cData[1]&0xe0)>>5);
			    if ((NS&0x7)==confirmNS)
			    {
					NS=confirmNS;
           			SynModemStu.SendEndFlag=SEND_END;
           			lModemSta = STA_SEND_END;
			    	ModemSendFrame(RR_FRAME+((NR&0x7)<<5),0,0);

				    #ifdef MODEM_DEBUG
				    	DebugString(0,"收到对方确认,发送完成.\r\n");
				    	DebugString(0,"\r\n");
				    #endif
			    }
			    else 
			    {
		   	    	#ifdef MODEM_DEBUG
						sprintf(msg,"NS=0x%x,confirmNS=0x%x  a00\r\n",NS,confirmNS);
						DebugString(0,msg);
					#endif
                    
                    /*
					if ((NS&0x7)>confirmNS)
					{
						NS=NS/8*8+confirmNS;	
					}
					else
					{
						NS=(NS/8-1)*8+confirmNS;	//
					}	
                    */
                    NS=confirmNS&0x07;
   	    	
					if (RepeatState==REPEAT_COUNT)
					{
  						lModemSta=STA_SEND_FAIL;
  						//*AT91C_TC3_IER =AT91C_TC_CPCS;
  						return;
					}	

		   	    	#ifdef MODEM_DEBUG
						DebugString(0,"收到RR确认,但NS不等于confirmNS,从confirmNS重新发送数据.\r\n");
		   	    	#endif

					SynModemStu.SendEndFlag=SEND_START;
		       		SendFrameMsg();
			    }
			}
			else
			{
			    lModemSta = STA_LINE_IDLE;
	
				#ifdef MODEM_DEBUG
					DebugString(0,"lModemSta = STA_LINE_IDLE;\r\n");
				#endif			    
				
			    ModemSendFrame(RR_FRAME+((NR&0x7)<<5),0,0);
			}	
		}
		else if((RecV80Data.cData[1]&0x1)==I_FRAME)
		{
		    confirmNS=((RecV80Data.cData[1]&0xe0)>>5);
		    confirmNR=((RecV80Data.cData[1]&0xe)>>1);
            
		    #ifdef MODEM_DEBUG
		        DebugString(0,"收到对方信息帧,并打印:!\r\n");
		        DebugData(0,5,10,RecV80Data.cData);
		    #endif
            
		    if ((NR&7)==confirmNR)
		    {
		        pRecV80Data.lLen =RecV80Data.lLen;
		        memcpy(pRecV80Data.cData,RecV80Data.cData,pRecV80Data.lLen);

		        #ifdef MODEM_DEBUG
		        	DebugString(0,"打印收到的信息:!\r\n");
		        	DebugData(0,pRecV80Data.lLen,10,pRecV80Data.cData);
		        #endif
		        
		    	NR=NR+NRADDINDEX;                    
		        
	    	    #ifdef MODEM_DEBUG
	    	    	DebugString(0,"收到信息帧,并发送RR确认信息.\r\n");
	    	    #endif

		        ModemSendFrame(RR_FRAME+((NR&7)<<5),0,0);
		        
		        if ((NS&0x7)!=confirmNS)
		        {
		    	    #ifdef MODEM_DEBUG
		    	    	DebugString(0,"收到信息帧,并确认NS有误.\r\n");
		    	    #endif
		        }	

		        lModemSta = STA_REC_END;
		        RecV80Data.lLen = 0;
 		    }	
 		    else
 		    {
		        #ifdef MODEM_DEBUG
		    		DebugPrint("NR=%d ",NR);
		    		DebugPrint("confirmNR=%d \r\n",confirmNR);
		    		DebugString(0,"收到的信息帧序号有误,再次发送正确的确认序号.\r\n");
		        #endif
            
		        ModemSendFrame(RR_FRAME+((NR&7)<<5),0,0);
 		    }
		}
		else if((RecV80Data.cData[1])==RD_FRAME)
		{
			//对方发送挂机命令			
			ModemSendFrame(UA_FRAME,0,0);
			lModemSta=STA_LINE_DATAOFF;
		   	#ifdef MODEM_DEBUG
		   		DebugString(0,"对方发送挂机,回送UA,完成挂机操作.\r\n");
		   	#endif
			return;			
		}
		else 
		{
			#ifdef MODEM_DEBUG
				DebugString(0,"收到的控制序号有误,重新同步,发送UA.\r\n");
			    DebugData(0,5,10,RecV80Data.cData);
			#endif

			ModemSendFrame(UA_FRAME,0,0);
			
			lModemSta=STA_LINE_IDLE;
			
			bFSDLSta=S_CTRL;			
			RecV80Data.lLen =0;			
		}	
	}				
	else
	{
		if (WaitConfirm==1)
		{
			if (RepeatState==REPEAT_COUNT)
			{
  				lModemSta=STA_LINE_DATAOFF;
				return;
			}	
		    NS--;
		   	
		   	#ifdef MODEM_DEBUG
				sprintf(msg,"没有收到对方RR信息,NS=0x%x,confirmNS=0x%x  a01\r\n",NS,confirmNS);
				DebugString(0,msg);
			#endif
		    
			WaitConfirm=0;
			SynModemStu.SendEndFlag=SEND_START;
			SendFrameMsg();
		}
	}
	//------------------------------------------------------------
	//*AT91C_TC3_IER =AT91C_TC_CPCS;
	//------------------------------------------------------------	
}

static	INT16U V80ToBCD(INT8U *inbuf,INT8U *outbuf,INT16U inlen)
{
	INT16U	i,len;
	INT8U	bone,btwo;

	len = 0;
	for(i=0;i<inlen;i++)
	{
		bone=*inbuf;
		if (bone != 0x19)
       	{
           	*outbuf++ = *inbuf++;
            len++;		
       	}
        else        
		{
			inbuf++;
			btwo=*inbuf;
			switch(btwo)
			{
			case 0x5d:
				*outbuf++ = 0x19; *outbuf++ = 0x19; inbuf++; len = len+2; i++; break;
			case 0xa4:
				*outbuf++ = 0x19; *outbuf++ = 0x99; inbuf++; len = len+2; i++; break;
			case 0xa5:
				*outbuf++ = 0x19; *outbuf++ = 0x11; inbuf++; len = len+2; i++; break;
			case 0xa6:
				*outbuf++ = 0x19; *outbuf++ = 0x13; inbuf++; len = len+2; i++; break;
			case 0x5c:
				*outbuf++ = 0x19; inbuf++; len++; i++; break;
			case 0xa7:
				*outbuf++ = 0x99; *outbuf++ = 0x19; inbuf++; len = len+2; i++; break;
			case 0x77:
				*outbuf++ = 0x99; *outbuf++ = 0x99; inbuf++; len = len+2; i++; break;
			case 0xa8:
				*outbuf++ = 0x99; *outbuf++ = 0x11; inbuf++; len = len+2; i++; break;
			case 0xa9:
				*outbuf++ = 0x99; *outbuf++ = 0x13; inbuf++; len = len+2; i++; break;
			case 0x76:
				*outbuf++ = 0x99; inbuf++; len++; i++; break;
			case 0xaa:
				*outbuf++ = 0x11; *outbuf++ = 0x19; inbuf++; len = len+2; i++; break;
			case 0xab:
				*outbuf++ = 0x11; *outbuf++ = 0x99; inbuf++; len = len+2; i++; break;
			case 0xa2:
				*outbuf++ = 0x11; *outbuf++ = 0x11; inbuf++; len = len+2; i++; break;
			case 0xac:
				*outbuf++ = 0x11; *outbuf++ = 0x13; inbuf++; len = len+2; i++; break;
			case 0xa0:
				*outbuf++ = 0x11; inbuf++; len++; i++; break;
			case 0xad:
				*outbuf++ = 0x13; *outbuf++ = 0x19; inbuf++; len = len+2; i++; break;
			case 0xae:
				*outbuf++ = 0x13; *outbuf++ = 0x99;inbuf++; len = len+2; i++; break;
			case 0xaf:
				*outbuf++ = 0x13; *outbuf++ = 0x11; inbuf++; len = len+2; i++; break;
			case 0xa3:
				*outbuf++ = 0x13; *outbuf++ = 0x13; inbuf++; len = len+2; i++; break;
			case 0xa1:
				*outbuf++ = 0x13; inbuf++; len++; i++; break;
			default:
	            *outbuf++ = bone; *outbuf++ = btwo; inbuf++; len = len+2; i++;
			}
       	}
       	
   	}// end for
    return len;
}// end func 

static int BCDToV80(INT8U *inbuf,INT8U *outbuf,INT16U inlen)
{
	int i,outlen=0;
	unsigned char bone,btwo;

	for(i=0;i<inlen;i++)
	{
		bone=*inbuf;
		switch(bone)
		{
			case 0x19:
				inbuf++;
				outlen++;*outbuf++=0x19;outlen++;*outbuf++=0x5c;
             		break;
			case 0x99:
				inbuf++;
				outlen++;*outbuf++=0x19;outlen++;*outbuf++=0x76;
            		break;
			case 0x11:
				inbuf++;
                outlen++;*outbuf++=0x19;outlen++;*outbuf++=0xa0;
                break;
			case 0x13:
				inbuf++;
                outlen++;*outbuf++=0x19;outlen++;*outbuf++=0xa1;
                break;
			default:
                outlen++;*outbuf++=*inbuf++;
                break;
        }//end switch          
    }// end for
    return outlen;
}// end func 

INT8U ModemSend(INT8U *buff,INT16U len)
{
	INT32U	lTmpStic,iDelayMS;
	
	if (len>PACK_LENGTH)
		return SEND_ERROR_LENGTH;
	if (SynModemStu.SendEndFlag==SEND_END)
	{
	    memcpy(SynModemStu.bSynSendBuff,buff,len);
	    SynModemStu.lSendLen=len;
	    SynModemStu.SendEndFlag=SEND_START;
	    RepeatState=0;
		
	    iDelayMS=SynModemStu.lSendLen*1024/SPEED_BYTEPS+1000;
	    iDelayMS*=3;	//等待发送3次的时间
	    
	    lTmpStic =StTick;
	    	    
	    while((StTick - lTmpStic) < iDelayMS)
	    {
	    	if(lModemSta == STA_SEND_END)
	    	{
	    		return SEND_SUCCESSFUL;
	    	}
			else if (lModemSta ==STA_LINE_DATAOFF)
			{	
				#ifdef MODEM_DEBUG
					DebugPrint("发送数据时掉线. \r\n");
				#endif

				return SEND_LINE_OFF;
			}
			else if (lModemSta ==STA_SEND_FAIL)
			{
				#ifdef MODEM_DEBUG
					DebugPrint("发送3次数据后没有收到确认信息. \r\n");
				#endif

				SynModemStu.SendEndFlag=SEND_END;
				lModemSta =STA_LINE_IDLE;
				return STA_SEND_FAIL;
			}	
	    }
		
		#ifdef MODEM_DEBUG
			DebugPrint("发送数据时间溢出,再发一次RR frame. \r\n");
		#endif
		
		lModemSta = STA_SEND_END;
		ModemSendFrame(RR_FRAME+((NR&7)<<5),0,0);
		
	    return TIME_OVERFLOW;
	}
	return SEND_UNRIPE;
}

INT8U ModemRecv(INT8U *rcvBuf,INT16U *len,INT32U lLen)
{
	INT32U	lTmpStic,iDelayMS;
	INT16U	iLen;

	lTmpStic =StTick;
	
	iDelayMS=lLen*1024/SPEED_BYTEPS+500;
	
	pRecV80Data.lLen=0;

	while((StTick - lTmpStic) < iDelayMS)
	{
		if(lModemSta == STA_REC_END)
		{
			*len =V80ToBCD(pRecV80Data.cData+2,rcvBuf,(pRecV80Data.lLen-4));
			pRecV80Data.lLen=0;
			return REC_SUCCESSFUL;
		}
		else if (lModemSta ==STA_LINE_DATAOFF)
		{	
			*len =0;		
			#ifdef MODEM_DEBUG
				DebugPrint("接收数据时掉线. \r\n");
			#endif

			return REC_LINE_OFF;
		}	
	}
	*len =0;

	#ifdef MODEM_DEBUG
		DebugPrint("接收数据时间溢出,再发一次RR frame. \r\n");
	#endif

	lModemSta = STA_REC_END;
	ModemSendFrame(RR_FRAME+((NR&7)<<5),0,0);
	return TIME_OVERFLOW;
}
void ModemCommand(unsigned char Command,unsigned char *parameters,unsigned char parlen)
{
	INT8U	i,SendBuff[10];
	
	SendBuff[0]=EM;
	SendBuff[1]=Command;

	memcpy(SendBuff+2,parameters,parlen);
	
	SendBuff[parlen+2]=0x19;
	SendBuff[parlen+3]=0xb1;
	
	ClearModemBuff();
	for(i=0; i<parlen+4; i++)
		set_char(2,SendBuff[i]);
		
	#ifdef MODEM_DEBUG
		DebugPrint("挂机操作001 ModemCommand. \r\n");
		//DebugString(0,"\r\n");
		//DebugData(0,parlen+4,10,SendBuff);
		//DebugString(0,"\r\n");					
	#endif		
}

INT8U  ModemHook(void)
{
	//*AT91C_TC3_IDR =AT91C_TC_CPCS;

	/*
	if (lModemSta>=STA_LINE_IDLE)
	{
		ModemSendFrame(RD_FRAME,0,0);
		DelayMs(200);	
	}
	*/

	if (lModemSta<=STA_NO_CCARRIER)
	{
		if(ModemSendRev("AT\r\n","OK",2000,100) != TRUE) return FALSE+1;		
	}
	else
	{	
		ModemCommand(TERMINATECARRUE,0,0);
		DelayMs(800);
		//if(ModemSendRev("+++\r\n","OK",2000,250) != TRUE) return FALSE+2;
	}

	if(ModemSendRev("ATH0\r\n","OK",500,100) != TRUE) 
		if(ModemSendRev("ATH0\r\n","OK",500,100) != TRUE) 
			if(ModemSendRev("ATH0\r\n","OK",500,100) != TRUE) return FALSE+3;

	lModemSta =STA_LINE_OFF;

	return 0;
}

INT8U ModemState(void)
{
	return (INT8U)lModemSta;
}

}

⌨️ 快捷键说明

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