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