📄 mascdriverdlg.cpp
字号:
{
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 + -