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

📄 mascdriverdlg.cpp

📁 mobitex 网络的终端采用的串口通信程序。目前正在使用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						   {
							   para.MAX_ACCESS=strtol( frame.Mid(i,2), &endptr, 16);//MAX_ACCESS占一个字节
							   i+=1;
						   }
						   if (p==7)                     //在没有访问请求的条件下,在发送线性连接中的块的数目
						   {
							   para.MAX_SPEECH=strtol( frame.Mid(i,2), &endptr, 16);//MAX_SPEECH占一个字节
							   i+=1;
						   }
						   if (p==8)                     //电源的减少量
						   {
							   para.TXPOW=strtol( frame.Mid(i,2), &endptr, 16);//TXPOW占一个字节
							   i+=1;
						   }
						   if (p==9)                     //信号强度的测量方法:0=FRAME,1=CONTINUOUS
						   {
							   para.RSSI_PROC= strtol( frame.Mid(i,2), &endptr, 16);//RSSI_PROC占一个字节
							   i+=1;
						   }
						   if (p==10)                    //漫游运算所用的时间(0-255*20MS)
						   {
							   para.RSSI_PERIOD= strtol( frame.Mid(i,2), &endptr, 16);//RSSI_PERIOD占一个字节
							   i+=1;
						   }
						   if (p==11)                   //取SCAN_TIME字段的值,MODEM检测系统信道的时间(0-255*100ms)
						   {
							   para.SCAN_TIME= strtol( frame.Mid(i,2), &endptr, 16);//SCAN_TIME占一个字节
							   i+=1;
						   }
						   if (p==12)                   //信号最弱的基站
						   {
							   para.BAD_BASE=strtol( frame.Mid(i,2), &endptr, 16);//BAD_BASE占一个字节
							   i+=1;
						   }
						   if (p==13)                   //信号最强的基站
						   {
							   para.GOOD_BASE=strtol( frame.Mid(i,2), &endptr, 16);//GOOD_BASE占一个字节
							   i+=1;
						   }
						   if (p==14)
						   {
								para.BETTER_BASE=strtol( frame.Mid(i,2), &endptr, 16);//BEETER_BASE占一个字节
								i+=1;
						   }
						   if (p==15)                    //在队列中当前的位置(等对话)
						   {
							   para.QPOS =strtol( frame.Mid(i,2), &endptr, 16);//QPOS占一个字节
							   i+=1;
						   }
						   if (p==16)                    //MODEM通信所在基站的区域ID和基站ID
						   {
							   {
								   int temp;
								   temp=strtol( frame.Mid(i,4), &endptr, 16);//区域ID和BASE_ID共占用2个字节
								   para.CURRENT_BASE_AREA_ID=temp & 0x3F;        //0x3F变成二进制为00111111,因为CURRENT_BASE_AREA_ID占用这两个字节中的低6位.与03F相与过滤取出 
								   para.CURRENT_BASE_BASE_ID=(temp & 0xFC0) >>6; //0xFC0变成二进制为111111000000.因为CURRENT_BASE_AREA_ID占用这两个字节中的7-12位.与0XFC0相与取出.
							   }
							   i+=3;
						   }
						   if (p==17)                    //被MODEM选择的随机时间片
						   {
							   para.CHOSE_SLOT=strtol( frame.Mid(i,2), &endptr, 16);//CHOSE_SLOT占用一个字节
							   i+=1;
						   }
						   if (p==18)                    //优先级,当超过MAX_REP时,置位
						   {
							   para.PRIO=strtol( frame.Mid(i,2), &endptr, 16);//PRIO占用一个字节
							   i+=1;
						   }
						   if (p==19)                    //上行频率
						   {
							   para.UPFREQ=strtol(frame.Mid(i,4),&endptr,16);//UPFREQ占用两个字节
							   i+=3;
						   }
						   if (p==20)                    //正通信的基站信道
						   {
							   para.DOFREQ=strtol(frame.Mid(i,4),&endptr,16);//DOFREQ占用两个字节
							   i+=3;
						   }
						   if (p==21)                    //在改变信道之后,基站的接收信道
						   {
							   para.ACCESS_CHANNEL_UPFREQ=frame.Mid(i,4);//ACCESS_CHANNEL_UPFREQ占用两个字节
							   i+=3;
						   }
						   if (p==22)                    //在改变信道之后,基站的发送信道
						   {
							   para.ACCESS_CHANNEL_DOFREQ=frame.Mid(i,4);//ACCESS_CHANNEL_DOFREQ占用两个字节
							   i+=3;
						   }
						   if (p==23)                    //MODEM现在传输信号所用的基站网络ID
						   {
							   para.NETWORK_IDTX=frame.Mid(i,4);//NETWORK_IDTX占用两个字节
							   i+=3;
						   }
						   if (p==24)                    //MODEM现在接收信号所用的基站网络ID
						   {
							   para.NETWORK_IDRX=frame.Mid(i,4);//NETWORK_IDRX占用二个字节
							   i+=3;
						   }
						   if (p==25)                    //MODEM所在的区域ID
						   {
							   para.AreaID=frame.Mid(i,2);//AreaID占一个字节
							   i+=1;
						   }
						}
					}
					Li_PA01(para);
				}
				
				break;
		   case '2':
			   {
				   //跟据p进行定位.
				   char * endptr;
				   int TermininalMan;        //由网络管理员赋予的MAN号
				   CString ESN;              //MODEM的电子序列号,占4个字节
				   int FLEXLIST[7];          //定义MAN号列表 ,占21个字节
				   int GROUPLIST[15];        //定义组列表,最多15个组,占45个字节.
				   int SEQ_NUM_UP;           //包含的下一个序列号(0-14)MODEM要发送到基站的MRM,每发一个MRM,SEQ_NUM_UP加1;占一个字节
				   int SEQ_NUM_DO[15];       //基站最近所收到的一个序列号,被存储在基站,可存15个组MAN号,占16个字节
				   int i;                    //指向字符串中字符的'指针'
				   int p=0;                  //指向字符串中当前","的位置
				   int q=0;                  //FLEXLIST中的MAN个数
				   int m=0;                  //组的个数
				   int n=0;                  //
				   
				   TermininalMan=strtol( frame.Mid(5,6), &endptr, 16);//取MAN 号
				   ESN=frame.Mid(12,8);                               //取电子序列号
				   for (i=21;i<(frame.GetLength()-1);i++ )  //因为字符串中有 ':'.从21位后为FLEXLIST\GROUPLIST及其它参数,依次取出	
				   {
					   if (frame.GetAt(i)==',')
						   p+=1;
					   else 
					   {
						   if((p>=0) &&(p<=6))              //FLEXLIST中有7个MAN,故取7次
						   {
							   FLEXLIST[p]=strtol( frame.Mid(i,6), &endptr, 16);//从第i位起取6位(作为一个MAN),赋给数组FLEXLIST[]
							   i+=5;                        //跳跃到下一个MAN(不管其是否为空,它始终占6位,所以+5,再加上FOR循环中的I++,正好为6)
							   q+=1;                        //FLEXLIST中的MAN个数
						   }
						   if ((p>=7) && (p<=21))           //从第7个字段到第21个字段为GROUPLIST(包含15个组,一个组MAN 号6位),
						   {
							   GROUPLIST[p-7]=strtol( frame.Mid(i,6), &endptr, 16);//从第i位起取6位(作为一个组MAN),赋给数组GROUPLIST[]
							   i+=5;                        //跳跃到下一个组MAN
							   m+=1;                        //组的个数
						   }
						   if (p==22)                       //包含的下一个序列号(0-14)在MODEM要发送到基站的MRM,每发一个MRM,SEQ_NUM_UP加1;
						   {
							   SEQ_NUM_UP= strtol( frame.Mid(i,2), &endptr, 16);//从第i位起取2位(作为下一个要发送MRM序列号(0-14)).
							   i+=1;
						   } 
						   if (p>=23)                       //基站最近所收到的一个序列号,被存储在基站,可存15个组MAN号
						   {
							   SEQ_NUM_DO[p-23]= strtol( frame.Mid(i,2), &endptr, 16);
							   i+=1;
							   n+=1;                        //基站最近所收到的MRM序列号(最多可包含15个)
						   }
					   }
					   
				   };
				   Li_PA02(TermininalMan, FLEXLIST,q, GROUPLIST,m, SEQ_NUM_UP, SEQ_NUM_DO,n);
			   }	
			   break;
		   case '3':                                //请求默认的信道列表参数
			   {
				   int ChannelList;                //列表的内容:01=DEFAULT_LIST, 02=CURRENT_LIST,03=TEMP_DEFAULT-LIST.
				   int NO_CHAN_IN_LIST;             //包含在列表中信道的总数目.占二个字节
				   int NO_CHAN_IN_COM;              //当前要发送的MRM中包含的信道数目,占一个字节.
								                   //分配一块内存(40个字节大小),存放各个信道的参数
				    int LIST[80];
				   char * endptr;
				   ChannelList = strtol( frame.Mid(5,2), &endptr, 16);  //从5-6位取出参数CHANNEL_LIST,并将16进制转成字符形式.
				   NO_CHAN_IN_LIST=strtol( frame.Mid(8,4), &endptr, 16); //第7位为',',从8-11位取出参数NO_CHAN_IN_LIST,并将16进制转成字符形式.
				   NO_CHAN_IN_COM=strtol( frame.Mid(13,2), &endptr, 16); //第12位为',',从13-14位取出参数NO_CHAN_IN_COM,并将16进制转成字符形式.
				   
				   int i,p;                                              //i为字符串的指针,P为第?个信道的参数
				   p=0;
				   for (i=16;i<frame.GetLength()-1;i++)                  //依次将后面的信道 的参数全部取出(除去最后的:)
				   {
					   LIST[p]=strtol( frame.Mid(i,4), &endptr, 16);     //从第i位开始取出参数CH?_UPFREQ (在列表中的第?个信道的上行频率)和CH?_DOFREQ(在列表中的第?个信道的下行频率),存于数组LIST[].
					   i+=4;                                             //后移四位,(加上for循不的i++),i指向下一个信道的两个参数.
					   p+=1;
				   }
				   
				   
				   Li_PA03(ChannelList,NO_CHAN_IN_LIST,NO_CHAN_IN_COM,LIST);
				   
			   }	
			   break;
		   case '4':                                                         //请求MODEM的电源控制参数
			   {
				   
				   int Pmax;                                                 //最大输出功率,占一个字节
				   int RSSI_OFFSET;                                          //GOOD_BASE的偏移量,上一个字节
				   int ROAM_VALUE;                                           //当前基站最近的信号强度值,占1个字节(单位dbuv)
				   int GOOD_BASE;                                            //
				   int TXADJ;                                                //动态输出功率,占一个字节
				   int TXPOW;                                                //实际输出功率,占一个字节
				   int Pout;                                                 //MODEM当前的输出功率,占一个字节
				   char * endptr;
				   Pmax=strtol( frame.Mid(5,2), &endptr, 16);                //从5-6位取出参数 Pmax
				   RSSI_OFFSET=strtol( frame.Mid(8,2), &endptr, 16);         //第7位为',',从8-9位取出参数RSSI_OFFSET
				   ROAM_VALUE=strtol( frame.Mid(11,2), &endptr, 16);         //第10位为',',从11-12位取出参数ROAM_VALUE
				   GOOD_BASE=strtol( frame.Mid(14,2), &endptr, 16);          //第13位为',',从14-15位取出参数GOOD_BASE
				   TXADJ=strtol( frame.Mid(17,2), &endptr, 16);              //第16位为',',从17-18位取出参数TXADJ
				   TXPOW=strtol( frame.Mid(20,2), &endptr, 16);              //第19位为',',从20-21位取出参数TXPOW
				   Pout=strtol( frame.Mid(23,2), &endptr, 16);               //第22位为',',从23-24位取出参数Pout
				   Li_PA04(Pmax,RSSI_OFFSET,ROAM_VALUE,GOOD_BASE,TXADJ,TXPOW,Pout);
			   }	
			   break; 
		   case '5':                                                           //从MODEM请求参数
			   {
				   
				   int NO_BASE_IN_LIST;                                       //列表中信道的总数目,占一个字节
				   int CURRENT_BASE_ID;                                       //列表中基站ID和区域ID,占二个字节
				   int CURRENT_BASE_AREA_ID;                                  //当前的区域ID
				   int CURRENT_BASE_BASE_ID;                                  //当前的基站ID
				   int ROAMING_VALUE_CURRENT;                                 //当前基站信号强度的平均值,占一个字节
				   int DO_FREQ_CH[20];                                        //基站?的下行频率,占二个字节
				   int ROAMING_VALUE_CH[20];                                  //基站?的信号强度,占一个字节
				   char * endptr;                                             //存放字段的临时指针变量
				   int q=0;                                                   //说明为第几个信道的参数
				   NO_BASE_IN_LIST=strtol( frame.Mid(5,2), &endptr, 16);      //从5-6位中取出参数NO_BASE_IN_LIST
				   if (NO_BASE_IN_LIST==0) 
					   return;
				   CURRENT_BASE_ID=strtol( frame.Mid(8,4), &endptr, 16);      //第7位为',',从8-11位取出参数CURRENT_BASE_ID
				   CURRENT_BASE_AREA_ID=CURRENT_BASE_ID & 0x3F;               //取出CURRENT_BASE_AREA_ID,在CURRENT_BASE_ID的低6位(因为占两个字节),
				   CURRENT_BASE_BASE_ID=(CURRENT_BASE_ID & 0xFC0) >>6;        //取出CURRENT_BASE_BASE_ID,在CURRENT_BASE_ID的7-12位.
				   ROAMING_VALUE_CURRENT=strtol( frame.Mid(13,2), &endptr, 16);//从13-14位取出参数ROAMING_VALUE_CURRENT		
				   int i;                                                     //i用来为字符串定位
				   for (i=16;i<frame.GetLength()-1;i++)                        //从第16位后为基站?的下行频率及其信号强度值(两个为一组,说明一个基站)                   
				   {
					   if (frame.GetAt(i)!=',')
					   {
						   if ((q%2)==0)                                                     //基站?的下行频率
						   {
							   DO_FREQ_CH[q/2]=strtol( frame.Mid(i,4), &endptr, 16);         //从第i位开始取四位将参数DO_FREQ_CH取出赋给数组DO_FREQ_CH[]
							   i+=3;                                                         //将定位指针向后移3位,(加上for循环中的i++)共移四位,指向下一个字段
						   }
						   if ((q%2)==1 )                                                     //基站?的信号强度值
						   {
							   ROAMING_VALUE_CH[q/2]=strtol( frame.Mid(i,2), &endptr, 16);	 //从第i位开始取二位将参数ROAMING_VALUE_CH取出赋给数组ROAMING_VALUE_CH[]
							   i+=1;                                                         //将定位指针向后移1位,(加上for循环中的i++)共移四位,指向下一个字段
						   }
					   }else q+=1;                                                           //q指向下一个信道的参数
				   }
				   Li_PA05(NO_BASE_IN_LIST,CURRENT_BASE_BASE_ID,CURRENT_BASE_AREA_ID,ROAMING_VALUE_CURRENT,DO_FREQ_CH,ROAMING_VALUE_CH);
			   }
			   	  
			   break;
		   case '7':                                   //请求电源节能模式协议的参数
			   {
				   
				   int CYCLE_TIME;                     // 
				   int TIME_TO_NEXT;                   //MODEM从收到一帧的第一位开始,到MODEM进入操作状态的时间,占一个字节(值为0-255*250ms)
				   int TRANSACTION_TIME;               //MODEM在收到ACK之前的时间(停留在操作状态),占一个字节(值为0-255*250ms)
				   int EVAL_CURRENT;                   //计算在当前系统信道上的时间,占一个字节(值为0-255 SEC)
				   int EVAL_OTHER;                     //计算在其它信道的时间,占一个字节(值为0-255 RSSI periods) 
				   char * endptr;
				   CYCLE_TIME=strtol( frame.Mid(5,2), &endptr, 16);	      //从5-6位取出CYCLE_TIME参数
				   TIME_TO_NEXT=strtol( frame.Mid(8,2), &endptr, 16);	  //第7位为',',从8-9取出TIME_TO_NEXT参数
				   TRANSACTION_TIME=strtol( frame.Mid(11,2), &endptr, 16);//第10位为',',从11-12位取出TRANSACTION_TIME参数
				   EVAL_CURRENT=strtol( frame.Mid(14,2), &endptr, 16);    //第13位为',',从14-15位取出EVAL_CURRENT参数
				   EVAL_OTHER=strtol( frame.Mid(17,2), &endptr, 16);      //第16位为',',从17-18位取出EVAL_OTHER参数
				   Li_PA07(CYCLE_TIME,TIME_TO_NEXT,TRANSACTION_TIME,EVAL_CURRENT,EVAL_OTHER);
			   }
			   break;
		   /*case '9':                                     //用于请求无效列表参数(INVALID LIST),
			   //如果INVALID_LIST是空的,参数COUNT为0,且只有MAXREJ和REJTIM被给出.
			   
			   { 
				   char * endptr;
				   int MAXREJ;                           //在此参数被放进INVALID LIST之前,表明它被一个信道拒绝的次数.
				   int REJTIME;                          //表明被拒绝的最大时间(以5秒为一个单位)
				   int RSSI_PROC;                        //当它为00时,为FRAME模式;为01时,为CONTINoUS模式.
				   int COUNT;                            //标明基站的数目
				   int BASE_ID_or_CH_NO[20];
				   int REPCOUNT[20];                     //标明当前循环计数器的值
				   int REPTIME[20];                      //标明被拒绝的次数(以5秒为单位)
				   MAXREJ=strtol( frame.Mid(5,2), &endptr, 16);    //前四位为PA0?,从第五位开始为参数列表,5-6位为MAXREJ,将其取出存放于变量MAXREJ;	
				   REJTIME=strtol( frame.Mid(8,2), &endptr, 16);   //因为第7位为',',所以从第8位开始为参数REJTIME,共两位	
				   RSSI_PROC=strtol( frame.Mid(11,2), &endptr, 16);//第10位为',',11-12为RSSI_PROC
				   COUNT=strtol( frame.Mid(14,2), &endptr, 16);    //第13位为',',14-15为COUNT
				   int i;
				   int q=0;                                        //q纪录从第17位之后有多少个字段.
				   for(i=17;i<frame.GetLength()-1;i++)             //第16位为',',从第17位开始取随后的参数;i为字符的总数目
				   {                                               //FRAME.GETLENGTH()-1为减去参数列表之后的':'
					   if (frame.GetAt(i)!=',')
					   {
						   if ((q%3)==0)                           //之后每隔三个字段为一个信道的三个参数,依次为BASE_ID_or_CH_NO?\REPCOUNT_CH?\REPTIME
						   {
							   BASE_ID_or_CH_NO[q/3]=strtol( frame.Mid(i,4), &endptr, 16);//将BASE_ID_or_CH_NO?(占四位)取出,赋给数组BASE_ID_or_CH_NO[]
							   i+=3;                                                      //取出BASE_ID_or_CH_NO?,将定位指针向后移三位.(FOR循环里的i++略过','.然后i指向下一个字段.
						   }
						   if ((q%3)==1)                                                  //取第n个信道的第二个字段.
						   {
							   REPCOUNT[q/3]=strtol( frame.Mid(i,2), &endptr, 16);	      //将REPCOUNT_CH?(占二位)取出,赋给数组REPCOUNT[].
							   i+=1;                                                      //将定位指针向后移一位.(FOR循环里的i++略过','.然后i指向下一个字段.
						   }
						   if ((q%3)==2)                                                  //取第n个信道的第三个字段.
						   {
							   REPTIME[q/3]=strtol( frame.Mid(i,2), &endptr, 16);         //将REPTIME取出赋给数组REPTIME[]
							   i+=1;                                                      //将定位指针向后移一位.(FOR循环里的i++略过','.然后i指向下一个字段.
						   }
					   }else q+=1;                                //进入下个信道的三个参数.直到命令结束.
					   
				   }
				   
				   Li_PA09(MAXREJ,REJTIME,RSSI_PROC,COUNT,BASE_ID_or_CH_NO,REPCOUNT,REPTIME);	
				   
			   }*/	
			   break;
		 } 
		 else if(frame.GetAt(2)=='1')                  //是否PA10帧
		 {
			 if(frame.GetAt(3)=='0')
			 {
				 int MODE;                            //MODE=1为普通模式,MODE=2为电源节能模式
				 int SKIPNUM;
				 char * endptr;
				 MODE=strtol( frame.Mid(5,1), &endptr, 16);     //因为前四位为PA10,故从第5位开始,取MODE字段,
				 SKIPNUM=strtol( frame.Mid(7,1), &endptr, 16);  //第6位为',',所以第7位为SIPNUM参数
				 Li_requestMode_SKIPNUM_para(MODE,SKIPNUM);
			 }
			 if(frame.GetAt(3)=='1')
			 {
				int adcVal;
				int rssiVal;
				char * endptr;
				adcVal=	strtol( frame.Mid(5,4), &endptr, 16);
				rssiVal =strtol(frame.Mid(10,4), &endptr, 16);
				Li_PA11(adcVal,rssiVal);
			 }
			 
		 }
		 
}
void CMascdriverDlg::HandleQCommand(CString frame)
{
	if (frame.GetAt(1)=='A')                    //因为第0位为P,所以判断第1位否为A,即是否为QA命令
		if (frame.GetAt(2)=='0' ) 
			switch(frame.GetAt(3) )             //判断是QA?命令
		{
				case '1':                       //QA01命令:请求地区列表信息(只用于8kbps的传输速率)
					{
						if (frame.GetAt(5)!=',')//判断第5位是否为','号,是则表明列表为空,AREA_LIST占8个字节,command占一个字节
						{
							unsigned int a;    
							unsigned int b;
							int command;
							char * endptr;
							a=strtol(frame.Mid(5, 8),&endptr,16); //将AREA_LIST的前四个字节取出,放于变量a中
							b=strtol(frame.Mid(13, 8),&endptr,16);//将AREA_LIST的后四个字节取出,放于变量b中
							BOOL bitmap[64];                      //用于存放AREA_LIST的数组,共64位
							int i;                                //字符'指针'

⌨️ 快捷键说明

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