📄 modem.~c
字号:
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 + -