?? modem.c
字號:
/****************************************************************************
* 名稱:GetModemState()
* 功能:讀取MODEM狀態值。
* 入口參數:無
* 出口參數:當前MODEM狀態值
****************************************************************************/
uint8 GetModemState(void)
{
return(ModemState);
}
/****************************************************************************
* 名稱:ModemInit()
* 功能:初始化MODEM。
* 入口參數:bps 串口波特率
* 出口參數:返回當前MODEM狀態值
****************************************************************************/
uint8 ModemInit(uint32 bps)
{
uint8 temp;
uint32 count;
ModemState = MODEM_CLOSE; // 設置MODEM已關閉狀態
UART1Init(bps); // 初始化UART1
temp=U1MSR;
/*if((temp & 0x30) != 0x30) // 判斷DSR、CTS是否有效
{
DelayNS(1);
if((temp & 0x30) != 0x30)
{
ModemState = NOT_FIND_MODEM; // 沒有發現MODEM
}
}*/
if(ModemState == MODEM_CLOSE) // 進行MODEM初始化
{
//ModemCommand("ATE0"); // 關閉命令回顯
ModemWrite("ATE0\r", 5); // 發送AT指令
count=0;
do{
if(count>20000)
{
ModemWrite("ATE0\r", 5);
count=0;
}
}while(RecPointer==0);
if(RecPointer==11||RecPointer==06||RecPointer==02||RecPointer==07) //ATE0\r\r\nOK\r\n,\r\nOK\r\n,0\r
{
if(RecPointer==11)
{
if(RecBuff[ReadPointer]=='A'||RecBuff[ReadPointer]=='a')
{
while(ReadPointer<RecPointer)
{
if(RecBuff[ReadPointer]=='O'||RecBuff[ReadPointer]=='o')
{
ReadPointer++;
if(RecBuff[ReadPointer]=='K'||RecBuff[ReadPointer]=='k')
{
U1IER &= (~ 0x01); // 允許接收中斷
RecPointer=ReadPointer=0;
U1IER = U1IER | 0x01; // 允許接收中斷
break;
}
}
ReadPointer++;
}
if(ReadPointer!=0)
{
RecPointer=ReadPointer=0;
return NOT_FIND_MODEM;
}
}
}
else if(RecPointer==07)
{
if(RecBuff[0]!='A'||RecBuff[1]!='T'||RecBuff[2]!='E'||RecBuff[3]!='0'||RecBuff[5]!='0')
{
RecPointer=ReadPointer=0;
return NOT_FIND_MODEM;
}
}
else if(RecPointer==06)
{
while(ReadPointer<RecPointer)
{
if(RecBuff[ReadPointer]=='O'||RecBuff[ReadPointer]=='o')
{
ReadPointer++;
if(RecBuff[ReadPointer]=='K'||RecBuff[ReadPointer]=='k')
{
U1IER &= (~ 0x01); // 允許接收中斷
RecPointer=ReadPointer=0;
U1IER = U1IER | 0x01; // 允許接收中斷
break;
}
}
ReadPointer++;
}
if(ReadPointer!=0)
{
RecPointer=ReadPointer=0;
return NOT_FIND_MODEM;
}
}
else
{
if(RecBuff[0]=='0'&&RecBuff[1]==13)
{
U1IER &= (~ 0x01); // 允許接收中斷
RecPointer=ReadPointer=0;
U1IER = U1IER | 0x01; // 允許接收中斷
}
else
{
return NOT_FIND_MODEM;
}
}
}
else
{
return NOT_FIND_MODEM;
}
ModemCommand("ATV0"); // 以數字形式返回結果碼
ModemCommand("AT&C1"); // 數據載波檢測(DCD)選擇有效
ModemCommand("AT&D2"); // 數據終端準備就緒(DTR)選擇,當DTR由ON-OFF時,MODEM將掛機,并返回命令狀態
ModemCommand("AT&R0"); // 請求發送(RTS)/清除發送(CTS)選擇,當MODEM在線時,CTS跟隨RTS的變化
ModemCommand("AT&S0"); // 數據設備就緒(DSR)選擇,DSR一直有效
ModemCommand("ATS0=2"); // 自動摘機應答設置,響鈴2次后MODEM自動摘機
}
DelayNS(10);
//ModemState=5;
return(ModemState);
}
/****************************************************************************
*
*
* 命令的應答
*
*
*
*****************************************************************************/
uint8 WaitCmdAck(void)
{
DelayNS(1);
while(ReadPointer<RecPointer)
{
if(RecBuff[ReadPointer]=='0')
{
U1IER &= (~ 0x01); // 允許接收中斷
RecPointer=ReadPointer=0;
U1IER = U1IER | 0x01; // 允許接收中斷
return(ModemState);
}
ReadPointer++;
}
if(ReadPointer!=0)
{
RecPointer=ReadPointer=0;
return MODEM_CMDERROR;
}
return ModemState;
}
/****************************************************************************
* 名稱:UART1_Exception()
* 功能:UART1中斷服務程序。
* 入口參數:無
* 出口參數:無
* 說明:
****************************************************************************/
void __irq UART1_Exception(void)
{
uint8 IIR, temp;
IIR=U1IIR;
//while(( IIR& 0x01) == 0)
//{ // 有中斷未處理完
switch (IIR & 0x0e)
{
case 0x00: // Modem狀態變化中斷
temp=U1MSR;
if ((temp & 0x80) != 0) //數據載波檢測
{
ModemState = MODEM_CONNECT;
}
else
{
ModemState = MODEM_CLOSE;
}
if ((temp & 0x40) != 0) //響鈴
{
ModemState = MODEM_RING;
}
if ((temp & 0x30) != 0x30) //數據設備就緒、清除發送
{
ModemState = NOT_FIND_MODEM;
}
break;
case 0x04: // 接收數據可用
//U1IER &= (~0x01); // 禁止接收及字符超時中斷
//if(Config_Finish)
//{
RecBuff[RecPointer]=U1RBR;
RecPointer++;
//}
//else
//{
//U1IER &= (~0x01); // 禁止接收及字符超時中斷
//}
break;
case 0x06: // 接收線狀態
temp = U1LSR;
break;
case 0x0c: // 字符超時指示
U1IER &= (~0x01); // 禁止接收及字符超時中斷
break;
case 0x02: //發送中斷
//后續
break;
default:
break;
}
//}
VICVectAddr = 0; // 通知中斷控制器中斷結束
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -