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

📄 mascdriverdlg.cpp

📁 mobitex 网络的终端采用的串口通信程序。目前正在使用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	q++;
	if((q>=iOneTime)&&fBegin)
	{
		q=0;
		if (flagAllowToSent)
		{
			sendMpak(pMascDlg->mpak_sent);
			//记录应该发送的数据包的个数
			m_shouldSend ++;
			//------------------------------
			CString strDebugMsg;
			CString timeStr;
			strDebugMsg.Format("Snd: ToSend %6d,Sended %6d,Rcved %6d,nSend %6d ,Rssi %2d, disC  %6d  " 
				"sender %d dest %d TStatus %d \n",
				m_shouldSend,m_sended,m_received,m_notSended, m_RecRssi,iDisconnTime, mpak_sent.sender,mpak_sent.addressee,
				mpak_sent.TrafficState);
			CTime t = CTime::GetCurrentTime();
			timeStr = t.Format( "%Y%m%d %H:%M:%S--" );
			timeStr = timeStr + strDebugMsg;
			CString tmpMsgFileName;
		if(100>=iLocalMAN)
					iLocalMAN=1000+m_mscomm.GetCommPort();
			tmpMsgFileName.Format("c:\\%d_msg.txt",iLocalMAN);
			AddMsgToEdit(m_msg_edit,timeStr);
			LoginFile(tmpMsgFileName,timeStr);
			//------------------------------
			m++;
		}
		if (m>= iMaxTime)
		{
			fBegin = FALSE;
			m = 0;
			q = 0;
		}
	} 
	if (!fBegin)
	{
		q = 0;
		m = 0;
	}
	//5秒获得一次Rssi值
	static int v=0;
	v++;
	if (v>5)
	{
		v = 0;
		mascCommandId = 1;   //每20 检查一下当前的modem 当前的参数的状态。包括当前
							 //正在使用的频率列表的信号强度。	
		if (flagAllowToSent)
		requestModemRSSI();
	}
	
	CDialog::OnTimer(nIDEvent);
}

/**************************十六进制字符串转为长整型数*******************************
入口参数:	str -----转换前字符串存放位置,displen---转换字符串长度
出口参数:	无
返 回 值:	value----转换后整数值
功    能:	十六进制字符串转为长整型数
描    述:
/**********************************************************************/

unsigned long  HexAToL(unsigned char  *str,unsigned int len)
{
	unsigned long model,value=0;
	unsigned int  i=0,tmplen,k;
	tmplen=len;
	while(i<len)
	{
		model=1;
		for(k=0;k<tmplen-1;k++)
			model=model*16;
		if((str[i]>=0x30)&&(str[i]<=0x39))
			value+=((str[i]-0x30)*model);
		else if((str[i]>=0x41)&&(str[i]<=0x46))
			value+=((str[i]-0x41+10)*model);
		else if((str[i]>=0x61)&&(str[i]<=0x66))
			value+=((str[i]-0x61+10)*model);
		i++;
		tmplen--;
	}
	return  value;
}

//字符串截取函数
void StrSub(UCHAR  *str,UCHAR  *str1,UINT pos,UINT len)
{
	UINT i=0;
	for(i=0;i<len;i++)
		str1[i]=str[i+pos];
	str1[i]='\0';
}
 /*************************************/
//功能:确认是否ACK
//frame:需要确认的数据包
//返回值:1:符合条件
//AckCriteriaFulfilled
/*************************************/
unsigned char CMascdriverDlg::AckCriteriaFulfilled( unsigned char* frametmp)
{
	unsigned int colonIndex=0;
	unsigned int numcolon=0;
	unsigned int checksum=0;
	unsigned int i=0,len=0,j=0;
	unsigned int len_text,len_dataa;
	unsigned int chk;
	unsigned char ackcritmp[5];
	len=strlen((const char*)frametmp);
	if(frametmp[0]!='^') return 0;
	for(i=0;i<len;i++)                         //judge the count 0f the frame have colon
	{
		if (frametmp[i]==':')
		{
			colonIndex=i;
			numcolon+=1;
		}
	}
	if(numcolon!=1)  return 0;//:冒号的个数
	StrSub(frametmp,ackcritmp,1,4);      //长度
	if (HexAToL(ackcritmp,4)!=len)
		return 0;
	i=len-3;                            //have the dataa xor judge
	for(j=0;j<i; j++)
	{
		checksum=checksum^(UINT)frametmp[j];
   	}
	StrSub(frametmp,ackcritmp,i,2);
	chk=HexAToL(ackcritmp,2);
	if (chk!=checksum)
	{
		return 0;
	}
	len_text=colonIndex-5;     //命令
	for(j=0;j<len_text;j++)
	{
		//3A=:  5E=^ 7D=} 20=;
		if((frametmp[5+j]<0x20)||(frametmp[5+j]>0x7D)||(frametmp[5+j]==0x3A)||(frametmp[5+j]==0x5E))
			return 0;
	}
	len_dataa=len-colonIndex-3+1;
	if(len>1150 || len_dataa>1120 || len_text>512 ) // because masc pa03 of sky800 modem len_text more than 256.
   	{
		return 0;
   	}
	if(frametmp[len-1]!= 0x0D) return 0;

	return 1;
}

/*************************************/
//功能:确认是否NACK
//frame:需要确认的数据包
//返回值:1:符合条件
// CheckIfNackShouldSend
// NackCriteriaFulfilled
/*************************************/
unsigned char CMascdriverDlg::NackCriteriaFulfilled(unsigned char* frametmp)
{
	unsigned int colonIndex=0;
	unsigned int numcolon=0;
	unsigned int i=0,len;
	len=strlen((const char*)frametmp);
	if(frametmp[0]!='^') return 0;
	for(i=0;i<len;i++)
	{
		if (frametmp[i]==':')
		{
			colonIndex=i;
			numcolon++;
		}
	}
	if(numcolon!=1)  return 0;
	if (len<10)  return 0;
	if(frametmp[len-1]!= 0x0D) return 0;
	return 1;
}
//初始化变量
void CMascdriverDlg::InitInterface()
{
	errorcode=-1;
	lastSentSequ='-';              //上次发送序号
	lastReceivedSequ='-';          //上次接受序号
	lastSentFrame="";              //上次发送的Frame 
	flagAllowToSent=TRUE;          //可以发送
	Counter=0;				    	//计时器归零ack
	flagResetTime=TRUE;            //停止计时
	flagSensNo=FALSE;              //表示没有发送过sens命令.
	SensCounter=0;                 //计时器归零 
	flagSensRestTime=TRUE;         //停止计时
	flagMpakSentSingle=TRUE;       //可以发送mpak包和需要和网络联系其它
	Link_Busy=FALSE;               //网络忙,任何信息贞不能发送 
	huanchongframe="";             //初始化时接口中没有数据
	ModemOffFlag=false;            //初始化时认为MODEM是打开的
	flagInitSent=FALSE;            //初始化接口时认为尚未发送过任何INIT命令
	flagInitReceived=FALSE;        //初始化接口时认为尚未接收到任何INIT命令
}
//初始化modem驱动
void CMascdriverDlg::InitDriver()  //gg
{
	InitInterface();       //对变量付处值
	InitComm();            //初始化串口
	DriverCounter=0;       //计数器,用于计时,当初始化命令执行后,开始计时
	flagInitDrvSucced=false;  //启动计时器,在规定的时间内没有完成的话,就报告用户并重新进行初始化
	Sleep(1000);
	UserSentInfoFrame("B 47E,0:",false);
	flagInitSent=true;
}
void CMascdriverDlg::UserInitDriver()
{
	SetTimer(nIDEvent,1000,NULL); //添加计时时钟,计时器归零,停止计时等信息在系统初始化时完成
	InitInterface();       //对变量付处值
	InitComm();            //初始化串口
	DriverCounter=0;       //计数器,用于计时,当初始化命令执行后,开始计时
	flagInitDrvSucced=false;  //启动计时器,在规定的时间内没有完成的话,就报告用户并重新进行初始化
	Sleep(1000);
	UserSentInfoFrame("B 47E,0:",false);
	flagInitSent=true;
}
// 此函数负责将已经编好的 ASCII 字符串转换成为可以发送到串口的字符串
CString CMascdriverDlg::EncodeFrame(CString frame)
{
	int GetLength = frame.GetLength() + 8;
	CString temp;   
	temp=IntToPaddedHexString(GetLength,4);
	temp = "^"+temp;
	frame=temp+frame;		//添加长度位和开始位
							// 计算校验
    int checksum = 0;       //抑或运算遵循相同为零 不同为一的计算规律.所以可以设定初始值为零
	for(int i = 0; i<frame.GetLength (); i++)
	{
		checksum = checksum ^ (int)frame.GetAt(i);
    }
                            // 添加校验位.
    CString checktemp;
	checktemp=IntToPaddedHexString(checksum,2);
	frame=frame+checktemp;
	frame= frame+"\r";              //添加结束位
    return frame;
}

//已经通过判断,认为是通常的信息贞.头尾已经去掉
void CMascdriverDlg::HandleFrame(CString frame)
{
	
	switch(frame.GetAt (0)) {
	case 'E':                 //处理收到的E帧,E帧为错误命令的响应(可能包含无效的参数),E帧不带DATA字段.
        HandleECommand(frame); 
        break;
	case 'F':                 //处理收到的F帧.
        HandleFCommand(frame);
        break;
	case 'M':                 //处理收到的信息帧.(信息帧用来发送和接收MPAKS)
        HandleMCommand(frame);  //M帧正确发送到MODEM之后,如网络和MODEM能正常通信,则MODEM返回一个FH帧,表明已经发送到网络上.
        break;                  //M帧如带SEQU-ID,则返回的FH也带同样的SEQU-ID.
		
	case 'N':                 //返回没有发送的mpak包	case 'N':                         
		//处理收到的N帧.N帧为MPAK未能发出被返回,可能原因为DTE向MODEM发送FI或FO帧等.
		//(FI为取消发送最近一次发送的帧,FO为关闭MODEM).
		{
			flagMpakSentSingle=TRUE; //可以发送下一个mpak包 
			HandleNCommand(frame);
		}
        break;
	case 'R':                       //处理收到的R帧,R帧返回不正确的MPAK.(表明MPAK包没按正确的格式打包)
		//如发送的信息帧无SEQU-ID,则FK和R帧一同返回
		{
			flagMpakSentSingle=TRUE;   //可以发送下一个mpak包  
			HandleRCommand(frame);
		}
        
        break;
	case 'Q':                       //处理收到的Q帧.
		HandleQCommand(frame);
		break;
	case 'P':                       //处理收到的P帧.
		HandlePACommand(frame);
		break;
	}
}
void CMascdriverDlg::HandlePACommand(CString frame)
{
	if (frame.GetAt(1)=='A')                             //判断是否为PA命令
		if(frame.GetAt(2)=='0')                          //判断PA之后是否为0
			switch (frame.GetAt(3))                      //判断是PA0?命令
		{
		   case '1':                                     //PA01命令
			   {
				   int i;                                //字符串中的字符'指针'
				   int p=1;                              //项目(字段)'指针'
				   int r=0;                              //列表元素指示器
				   char * endptr;
				   PA01para para;
				   para.TIMEOUT= -1;                   
				   para.SLOT_LENGTH =-1;               
				   para .FREE_SLOTS=-1;                
				   para .RAND_SLOTS=-1;                
				   para. MAX_REP=-1;                   
				   para. MAX_ACCESS=-1;                
				   para. MAX_SPEECH=-1;                
				   para. TXPOW=-1;                     
				   para. RSSI_PROC=-1;                 
				   para. RSSI_PERIOD=-1;               
				   para. SCAN_TIME=-1;                 
				   para. BAD_BASE=-1;                  
				   para. GOOD_BASE=-1;                 
				   para. BETTER_BASE=-1;               
				   para. QPOS=-1;                      
				   para. CURRENT_BASE_AREA_ID=-1;    //
				   para. CURRENT_BASE_BASE_ID=-1;    //
				   para. CHOSE_SLOT=-1;                
				   para. PRIO=-1;
				   para. UPFREQ = -1;                
				   para. DOFREQ= -1;                
				   para. ACCESS_CHANNEL_UPFREQ= "NULL"; 
				   para. ACCESS_CHANNEL_DOFREQ= "NULL"; 
				   para. NETWORK_IDTX= "NULL";          
				   para. NETWORK_IDRX= "NULL";          
				   para. AreaID= "NULL";                

				   // 下面对para 中的各项进行初始化,如果是数字类型的,则设置成为-1.
				   //如果是字符串,则设置成为 NULL
				   
				   for (i=5;i<(frame.GetLength()-1);i++ )//PA0?  从第5个起开始取参数;因为字符串中有 ':'.故frame.GetLength()-1
				   {
					   if (frame.GetAt(i)==',')          //遇到','说明一个字段已经结束,然后继续下一个字段
						   p+=1;                         //每遇一个','P加1(相当于字段'指针')
					   else                              //if语句的效率较低,但是不再修改,留给下一步开发时再作修改. 
					   {
						   if(p==1)                      //取第一个字段的值TIMEOUT(占一个字节),超时设置(多长时间没收到ACK后重发)
						   {                             //TIMEOUT范围为1-255秒;
							   para.TIMEOUT=strtol( frame.Mid(i,2), &endptr, 16);//TIMEOUT占一个字节
							   i+=1;                     //字符'指针'向前进1,(加上FOR循环中的i++,即略过',',i实际指向下一个字段)
						   }
						   if (p==2)                     //SLOT_LENGTH为单个时间片的长度
						   {
							   para.SLOT_LENGTH=strtol( frame.Mid(i,2), &endptr, 16);//SLOT_LENGTH占一个字节
							   i+=1;
						   }
						   if (p==3)                     //在FRI中有效的时间片的总数目
						   {
							   para.FREE_SLOTS  =strtol( frame.Mid(i,2), &endptr, 16);//FREE_SLOTS 占一个字节
							   i+=1;
						   }
						   if (p==4)                     //在FRI中的随机时间片的总数目
						   {
							   para.RAND_SLOTS=strtol( frame.Mid(i,2), &endptr, 16);//RAND_SLOTS占一个字节
							   i+=1;
						   }
						   if (p==5)                     //在认为一个包传输失败之前,重新传输的次数,
						   {                             //如在MAX_REP之后仍没收到响应,则考虑其他基站
							   para.MAX_REP=strtol( frame.Mid(i,2), &endptr, 16);//MAX_REP占一个字节
							   i+=1;
						   }
						   if (p==6)                     //在发送MRM中的块的最大数目

⌨️ 快捷键说明

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