📄 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 + -