📄 st3lib10.c
字号:
uchar i, j, cc, dd;
uint OverTime, OverTime2;
ulong HangupTimes;
i = _ModemReset();
if( i != (DEF_MODEM_RESET | DEF_MODEM_STATUS_OK) )
return i;
/*
if( strcmp(PUB_TelNo, pTelNo) == 0 )
{
OverTime = 400;
while ( 1 )
{
HangupTimes = _GetTickCount() - PUB_Hang_Timer;
if( HangupTimes > (ulong)OverTime)
break;
_Delay(100);
}
}
else
{
strcpy(PUB_TelNo, pTelNo);
}
*/
XBYTE[DEF_MODEM_DR];
_SelAddrMain();
PUB_HIGH_Card = (PUB_HIGH_Card | 0x10);
XBYTE[DEF_HIGH_Card] = PUB_HIGH_Card;
_SelAddrModem();
XBYTE[DEF_MODEM_CR0] = 0x05;
XBYTE[DEF_MODEM_CR1] = 0x30;
XBYTE[DEF_MODEM_TR] = 0x00;
i = j = 0;
while ( i < 0xFF )
{
_Delay(10);
cc = XBYTE[DEF_MODEM_DR];
if ( cc & 0x02 )
{
j++;
if ( j >= 50 ) break;
}
else
j = 0;
i++;
}
if ( i == 0xFF )
{
_ModemHangUp();
return DEF_MODEM_DIAL | DEF_MODEM_STATUS_NOLINE;
}
for (i=0; i<10; i++)
{
cc = XBYTE[DEF_MODEM_DR];
if ( (cc & 0x02) == 0 )
{
_ModemHangUp();
return DEF_MODEM_DIAL | DEF_MODEM_STATUS_BUSY;
}
_Delay(100);
}
_SelAddrMain();
PUB_HIGH_Card_Rest = PUB_HIGH_Card_Rest | 0x40;
XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
_SelAddrModem();
dd = strlen(pTelNo);
for (i=0; i<dd; i++)
{
j = pTelNo[i];
if ( (j<'0') || (j >'9') )
_Delay(1000);
else
{
cc = j & 0x0F;
if ( cc == 0x00 )
cc = 0x0A;
XBYTE[DEF_MODEM_TR] = 0x10 | cc;
XBYTE[DEF_MODEM_CR0] = 0x07;
_Delay(100);
XBYTE[DEF_MODEM_CR0] = 0x05;
_Delay(50);
}
}
_SelAddrMain();
PUB_HIGH_Card_Rest = (PUB_HIGH_Card_Rest & (~0x40));
XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
_SelAddrModem();
XBYTE[DEF_MODEM_CR0] = 0x05;
XBYTE[DEF_MODEM_CR1] = 0x30;
XBYTE[DEF_MODEM_TR] = 0x80;
OverTime2 = i = j = 0; OverTime = 15000;
while (1)
{
_Delay(1);
cc = XBYTE[DEF_MODEM_DR];
if ( cc & 0x02 )
OverTime2++;
else
{
if ( (OverTime2>150) && (OverTime2<8000) )
{
j++;
if ( j > 4 )
{
_ModemHangUp();
return DEF_MODEM_DIAL | DEF_MODEM_STATUS_BUSY;
}
}
OverTime2 = 0;
}
if ( (cc&0x08) && (cc&0x10) )
{
i++;
if ( i >= 15 ) break;
}
else
i = 0;
if ( _KeyBoardTest() )
if (_KeyBoardGet() == 0x1B)
{
_ModemHangUp();
return DEF_MODEM_DIAL | DEF_MODEM_STATUS_USERCANCEL;
}
_SelAddrModem();
OverTime--;
if ( OverTime == 13000 )
{
_SelAddrMain();
PUB_HIGH_Card_Rest = PUB_HIGH_Card_Rest | 0x40;
XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
_SelAddrModem();
}
if ( OverTime == 0 )
{
_ModemHangUp();
return DEF_MODEM_DIAL | DEF_MODEM_STATUS_NOANSWER;
}
}
_SelAddrMain();
PUB_HIGH_Card_Rest = (PUB_HIGH_Card_Rest & (~0x40));
XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
_SelAddrModem();
XBYTE[DEF_MODEM_CR1] = 0xA0;
XBYTE[DEF_MODEM_CR0] = 0x07;
OverTime = 3000;
while (1)
{
cc = XBYTE[DEF_MODEM_DR];
if ( (cc&0x08) && (cc&0x20) )
{
XBYTE[DEF_MODEM_TR] = 0x00;
break;
}
else
{
_Delay(1); OverTime--;
if ( OverTime == 0 )
{
_ModemHangUp();
return DEF_MODEM_DIAL | DEF_MODEM_STATUS_NOCARRY;
}
}
}
DEF_MODEM_TXD = 0x01;
XBYTE[DEF_MODEM_CR1] = 0x20;
return DEF_MODEM_DIAL | DEF_MODEM_STATUS_OK;
}
uchar _ModemHeadTail(uchar ht)
{
bit rTXCLK = 1;
uchar Tcounter = 0;
uchar NoCarryCount = 0;
_SelAddrModem();
while ( 1 )
{
if ( (XBYTE[DEF_MODEM_DR] & 0x08) == 0 )
{
if ( (++NoCarryCount) > 20 )
{
_ModemHangUp();
return DEF_MODEM_SEND | DEF_MODEM_STATUS_NOCARRY;
}
}
else
NoCarryCount = 0;
if ( rTXCLK != DEF_MODEM_TXC )
{
rTXCLK = DEF_MODEM_TXC;
if ( rTXCLK )
{
if ( (Tcounter == 0) || (Tcounter == 7) )
DEF_MODEM_TXD = 0x00;
else
DEF_MODEM_TXD = 0x01;
Tcounter++;
if (( Tcounter == 8 )&&(ht==0)) break;
if ( Tcounter >= 14 ) break;
}
}
}
return DEF_MODEM_SEND | DEF_MODEM_STATUS_OK;
}
uchar _ModemSd(uchar *SendBuff, uint SendLen)
{
bit rTXCLK = 1;
uchar Tcounter = 0;
uchar Bit1CounterT = 0;
uint Pt = 0;
uchar NoCarryCount = 0;
uchar Tdata;
uint CrcBuff;
uchar CRC = 0;
_SelAddrModem();
Tdata = PUB_AddrNo;
while ( 1 )
{
if ( (XBYTE[DEF_MODEM_DR] & 0x08) == 0 )
{
if ( (++NoCarryCount) > 20 )
{
_ModemHangUp();
return DEF_MODEM_SEND | DEF_MODEM_STATUS_NOCARRY;
}
}
else
NoCarryCount = 0;
if ( rTXCLK != DEF_MODEM_TXC )
{
rTXCLK = DEF_MODEM_TXC;
if ( rTXCLK )
{
if ( Bit1CounterT == 5 )
{
DEF_MODEM_TXD = 0x00;
Bit1CounterT = 0x00;
continue;
}
if ( (Tdata & 0x01 ) == 0x00 )
Bit1CounterT = 0;
else
Bit1CounterT++;
DEF_MODEM_TXD = Tdata & 0x01;
Tdata = Tdata >> 1;
Tcounter++;
if ( Tcounter == 8 )
{
Tcounter = 0;
Pt++;
if ( Pt == 1 )
{
if ( PUB_SendData )
Tdata = (PUB_NS << 1) | 0x10 | (PUB_NR << 5 );
else
Tdata = PUB_SendCtrlData;
CrcBuff = CrcData(0xFFFF, PUB_AddrNo);
CrcBuff = CrcData(CrcBuff, Tdata);
}
else
{
if ( PUB_SendData )
{
if ( Pt < (SendLen+2) )
{
Tdata = SendBuff[Pt-2];
CrcBuff = CrcData(CrcBuff,Tdata);
continue;
}
}
switch ( CRC )
{
case 0:
CrcBuff = CrcBuff ^ 0xFFFF;
Tdata = CrcBuff >> 8;
CRC++;
break;
case 1:
Tdata = CrcBuff & 0xFF;
CRC++;
break;
case 2:
if ( Bit1CounterT == 5 )
{
Bit1CounterT = 0;
Tdata = 0x00;
Tcounter = 7;
}
else
return DEF_MODEM_SEND | DEF_MODEM_STATUS_OK;
}
}
}
}
}
}
}
uchar _ModemRc(uchar *RecBuff, uint *RecLen)
{
bit rTXCLK = 1;
bit rRXCLK = 1;
uchar Tcounter = 0, Rcounter = 0;
uchar Rdata = 0;
uchar Bit1CounterR = 0;
uchar RecStatus = DEF_REC_STATUS_NULL;
bit Flag_ToExitRec = 0;
bit BitData;
uchar CtrlData;
uint CrcBuff, RecCount,OverTime;
uchar NoCarryCount = 0;
OverTime=12000;
_SelAddrModem();
while ( 1 )
{
if ( (XBYTE[DEF_MODEM_DR] & 0x08) == 0 )
{
if ( (++NoCarryCount) > 20 )
{
_ModemHangUp();
return DEF_MODEM_REC | DEF_MODEM_STATUS_NOCARRY;
}
}
else
NoCarryCount = 0;
if ( rTXCLK != DEF_MODEM_TXC )
{
rTXCLK = DEF_MODEM_TXC;
if ( rTXCLK )
{
if ( (Tcounter==0) || (Tcounter==7) )
DEF_MODEM_TXD = 0x00;
else
DEF_MODEM_TXD = 0x01;
Tcounter++;
if ( Tcounter >= 8 )
{
Tcounter = 0;
if ( Flag_ToExitRec ) break;
}
}
}
if ( Flag_ToExitRec ) continue;
if ( rRXCLK != DEF_MODEM_RXC )
{
rRXCLK = DEF_MODEM_RXC;
if( rRXCLK == 0 )
{
OverTime--;
if(OverTime==0)
{
_ModemHangUp();
return DEF_MODEM_REC | DEF_MODEM_STATUS_OVERTIME;
}
if ( DEF_MODEM_RXD )
{
BitData = 1;
Bit1CounterR++;
if ( Bit1CounterR > 6 )
{
RecStatus = DEF_REC_STATUS_NULL;
continue;
}
}
else
{
BitData = 0;
if ( Bit1CounterR == 6 )
{
if ( (RecStatus==DEF_REC_STATUS_INFO) ||
(RecStatus==DEF_REC_STATUS_CTRLCRC) )
{
Flag_ToExitRec = 1;
continue;
}
else
{
CrcBuff = 0xFFFF;
RecStatus = DEF_REC_STATUS_ADDR;
Rdata = 0x00;
Rcounter = 0;
Bit1CounterR = 0;
continue;
}
}
else
{
if ( Bit1CounterR == 5 )
{
Bit1CounterR = 0;
continue;
}
else
Bit1CounterR = 0;
}
}
Rdata = Rdata >> 1;
if ( BitData ) Rdata |= 0x80;
if ( (++Rcounter) < 8 )
continue;
Rcounter = 0;
CrcBuff = CrcData(CrcBuff, Rdata);
switch( RecStatus )
{
case DEF_REC_STATUS_ADDR:
PUB_AddrNo2 = Rdata;
RecStatus = DEF_REC_STATUS_CTRL;
break;
case DEF_REC_STATUS_CTRL:
CtrlData = Rdata;
if ( Rdata & 0x01 )
RecStatus = DEF_REC_STATUS_CTRLCRC;
else
{
RecStatus = DEF_REC_STATUS_INFO;
RecCount = 0;
}
break;
case DEF_REC_STATUS_INFO:
*(RecBuff + RecCount) = Rdata;
RecCount++;
break;
}
}
}
}
if ( CrcBuff != DEF_CRC_OK )
{
if ( RecStatus == DEF_REC_STATUS_INFO )
{
*RecLen = RecCount;
PUB_SendCtrlData = 0x11 | (PUB_NR << 5);
return DEF_MODEM_DATAINFO | DEF_DATAINFO_CANCEL;
}
}
if ( RecStatus == DEF_REC_STATUS_INFO )
{
if ( ((PUB_NS+1) & 0x07) == (CtrlData >> 5) )
PUB_NS = ( PUB_NS+1) & 0x07;
PUB_NR = (((CtrlData & 0x0f) >> 1 ) + 1 ) & 0x07;
PUB_SendCtrlData = 0x11 | ( PUB_NR << 5);
*RecLen = RecCount;
return DEF_MODEM_DATAINFO | DEF_DATAINFO_END ;
}
if ( (CtrlData & 0x0F) == 0x01 )
{
if ( ((PUB_NS+1) & 0x07) == (CtrlData >> 5) )
{
PUB_NS = ( PUB_NS+1) & 0x07;
if ( PUB_SendData )
PUB_ModemStatus = 1;
}
if ( PUB_ModemStatus )
{
PUB_SendCtrlData = 0x11 | (PUB_NR << 5);
PUB_SendData = 0;
}
else
{
PUB_SendData = 1;
}
CtrlData = CtrlData & 0x0F;
}
else if (CtrlData == 0x93)
{
PUB_AddrNo = PUB_AddrNo2;
PUB_NS = PUB_NR = 0;
PUB_SendCtrlData = 0x73;
PUB_ModemStatus = 1;
PUB_SendData = 0;
}
return CtrlData;
}
void _ModemSetStatus(uchar Val)
{
PUB_ModemStatus = (bit)Val;
return;
}
void _ModemGetErrStr(uchar ErrCode, uchar *ErrString)
{
uchar Buf[20];
memset(Buf, 0, 20);
BCDtoChar(&ErrCode, 1, Buf);
switch (ErrCode & 0x0F)
{
case DEF_MODEM_STATUS_NOMODEM : strcat(Buf, ":没有Modem"); break;
case DEF_MODEM_STATUS_NOLINE : strcat(Buf, ":未连接线路"); break;
case DEF_MODEM_STATUS_BUSY : strcat(Buf, ":线路忙"); break;
case DEF_MODEM_STATUS_NOCARRY : strcat(Buf, ":载波不存在"); break;
case DEF_MODEM_STATUS_NOANSWER: strcat(Buf, ":没有应答"); break;
case DEF_MODEM_STATUS_NOHDLC : strcat(Buf, ":没有HDLC"); break;
case DEF_MODEM_STATUS_USERCANCEL: strcat(Buf, ":用户中断"); break;
case DEF_MODEM_STATUS_OVERTIME: strcat(Buf, ":超时退出"); break;
case DEF_MODEM_STATUS_CRCERROR: strcat(Buf, ":CRC错误"); break;
default: strcat(Buf, ":未知错误"); break;
}
strcpy(ErrString, Buf);
return;
}
void _ModemDispErr(uchar ErrCode, DispLine)
{
uchar Buf[20];
_ModemGetErrStr(ErrCode, Buf);
_Display(DispLine, Buf);
return;
}
uchar _ModemDial(uchar *pTelNo)
{
uchar cc, j,k;
uint i;
cc = _ModemDl( pTelNo );
if ( (cc & 0x0F) != 0 )
return cc;
else
{
j = 0;
while ( 1 )
{
cc = _ModemRc(PixelBuff, &i);
if((cc == (DEF_MODEM_REC | DEF_MODEM_STATUS_NOCARRY))||(cc ==(DEF_MODEM_REC | DEF_MODEM_STATUS_OVERTIME)) )
return cc;
if ( cc == 0x93 )
{
_ModemHeadTail(0);
_ModemHeadTail(0);
_ModemSd(PixelBuff, 1 );
_ModemHeadTail(0);
k= 10;
do
{
cc = _ModemRc(PixelBuff, &i);
k -- ;
} while ((cc != 01) && (cc != (DEF_MODEM_REC | DEF_MODEM_STATUS_NOCARRY))
&&(cc !=(DEF_MODEM_REC | DEF_MODEM_STATUS_OVERTIME)) && (k !=0 ));
_ModemHeadTail(1);
if (cc != 01) return cc;
return DEF_MODEM_CONNECT | DEF_MODEM_STATUS_OK;
}
j++;
if ( j > 10 )
return DEF_MODEM_CONNECT | (cc & 0x0F);
}
}
}
uchar _ModemSend(uchar *SendBuff, uint SendLen)
{
uchar cc,j;
uint i;
_ModemHeadTail(0);
cc = _ModemSd(SendBuff, 1);
_ModemHeadTail(0);
if ( cc == (DEF_MODEM_SEND | DEF_MODEM_STATUS_NOCARRY) )
return DEF_MODEM_SEND | DEF_MODEM_STATUS_NOCARRY;
_ModemSetStatus(0);
j= 10 ;
do
{
cc = _ModemRc(PixelBuff, &i);
j -- ;
} while ((cc != 01) && (cc != (DEF_MODEM_REC | DEF_MODEM_STATUS_NOCARRY))
&&(cc !=(DEF_MODEM_REC | DEF_M
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -