📄 modem.c
字号:
mdm_state1 = 2;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
}
break;
case 2:
if(ReadCMDLine()){
/* if (strncmp(mdmRtnbuf,
rtnPtr.pAck,
rtnPtr.lenAck)==0) {
mdm_state1 = 3;
mdm_index++;
if(mdm_sending_busy) mdm_sending_busy = 0;
}
else */if((strncmp(mdmRtnbuf,"ERROR\r\n",7)==0)/*命令错误错误*/
|| (strncmp(mdmRtnbuf,"NO DIALTONE\r\n",4)==0)//无拨号音
|| (strncmp(mdmRtnbuf,"BUSY\r\n",4)==0)/*拨号忙*/
|| (strncmp(mdmRtnbuf,"NO ANSWER\r\n",11)==0)/*无应答*/
|| (strncmp(mdmRtnbuf,"NO CARRIER\r\n",12)==0))/*无载波*/
{
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_FAIL;
}
else if(strncmp(mdmRtnbuf,"CONNECT",7)==0)
{/*连接成功*/
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_OK;
}
mdmRtnbuf_cnt = 0;
}
if(++mdm_wait1 > MAX_CONNECTTIME){
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_FAIL;
}
break;
default:
mdm_state1 = 0;
}
return 0;
}
uchar GPRSLogin_Proc()
{
//uchar i;
switch(mdm_state1){
case 0:
if(MDMRvBuf_H == MDMRvBuf_T) {//容错检查
mdmRtnbuf_cnt = 0;
mdm_wait1 = 0;
mdm_state1 = 1;
ModemLineCount = 0;
}
ReadCMDLine();
break;
case 1:
if(++mdm_wait1>SWAIT3S)
{/*当MODEM开电复位后,要注册网络, 如果还未注册网络前,发拨号命令将会不成功
因此此处延时等待确保注册完成后拨号.*/
SetDTR(0, ON);
mdm_wait1 = 0;
mdm_state1 = 2;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
mdm_index = 0;
}
break;
case 2:
rtnPtr = GPRSModemDialString[mdm_index];
if (rtnPtr.lenAck == 255){
mdm_state1 = 4;
mdm_wait1 = 0;
}
else{
if((mdm_index>=3)&&(mdm_index<=7))
SendATCmd(rtnPtr.pSend, strlen(rtnPtr.pSend), 0x80+mdm_index);
else
SendATCmd(rtnPtr.pSend, strlen(rtnPtr.pSend), 0);
mdm_wait1 = 0;
//SetLEDWarn(LED_ON,0);
RunLed_Period = 255;
mdm_state1 = 3;
}
break;
case 3:
if(ReadCMDLine()){
//SetLEDWarn(LED_OFF,0);
RunLed_Period = 1;
if (strncmp(mdmRtnbuf,
rtnPtr.pAck,
rtnPtr.lenAck)==0) {
mdm_state1 = INIT_MDM_GSM_SEND_ATCMD;
mdm_index++;
if(mdm_sending_busy) mdm_sending_busy = 0;
/*if(++mdm_index>7) return INIT_OK; 初始化正确,完成*/
}
else if((strncmp(mdmRtnbuf,"ERROR\r\n",7)==0)
&&(rtnPtr.lenAck != 0))
{/*响应错误*/
mdm_state1 = INIT_MDM_WAIT_POWEROK;
//SetLEDWarn(LED_ON,0);
RunLed_Period = 255;
return INIT_FAIL;
}
else if(strncmp(mdmRtnbuf,rtnPtr.pSend,strlen(rtnPtr.pSend)-2)==0)//回显开
{;
}
mdmRtnbuf_cnt = 0;
}
if(++mdm_wait1 > SWAIT10S){
mdm_state1 = 0;
return INIT_FAIL;
}
break;
case 4:
if(++mdm_wait1 > SWAIT3S){
mdm_state1 = 0;
return INIT_OK;/*初始化正确,完成*/
}
break;
default:
mdm_state1 = 0;
}
return 0;
}
uchar ModemAnswer_Proc()
{
// uchar i;
//if(NetPara.CommMode != COMM_MODE_PSTN_DATA) return INIT_FAIL;
switch(mdm_state1){
case 0:
SetDTR(0, ON);
rtnPtr = ModemOperateCMDString[6];
SendATCmd(rtnPtr.pSend, strlen(rtnPtr.pSend), 1);
mdm_wait1 = 0;
mdm_state1 = 1;
RingCount = 0;
//SetLEDWarn(LED_ON, SWAIT500MS);
RunLed_Period = SWAIT500MS;
break;
case 1:
if(ReadCMDLine()){
if((strncmp(mdmRtnbuf,"ERROR\r\n",7)==0)/*命令错误错误*/
|| (strncmp(mdmRtnbuf,"BUSY\r\n",4)==0)/*拨号忙*/
|| (strncmp(mdmRtnbuf,"NO ANSWER\r\n",11)==0)/*无应答*/
|| (strncmp(mdmRtnbuf,"NO CARRIER\r\n",12)==0))/*无载波*/
{
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_FAIL;
}
else if(strncmp(mdmRtnbuf,"CONNECT",7)==0)
{/*连接成功*/
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_OK;
}
mdmRtnbuf_cnt = 0;
}
if(++mdm_wait1 > MAX_CONNECTTIME){
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_FAIL;
}
break;
default:
mdm_state1 = 0;
}
return 0;
}
uchar ath_p()
{
// uchar i;
if(NetPara.CommMode != COMM_MODE_PSTN_DATA) return INIT_FAIL;
switch(mdm_state1){
case 0:
SetDTR(0, OFF);
SendATCmd(ModemOperateCMDString[7].pSend,
strlen(ModemOperateCMDString[7].pSend), 1);
mdm_wait1 = 0;
mdm_state1 = 1;
//SetLEDWarn(LED_ON, SWAIT100MS);
RunLed_Period = SWAIT100MS;
break;
case 1:
if(++mdm_wait1>SWAIT200MS){//delay 500ms
SetDTR(0, ON);
SendATCmd(ModemOperateCMDString[8].pSend,
strlen(ModemOperateCMDString[8].pSend), 1);
mdm_wait1 = 0;
mdm_state1 = 2;
//SetLEDWarn(LED_ON, SWAIT100MS);
RunLed_Period = SWAIT100MS;
}
break;
case 2:
if(ReadCMDLine()){
if (strncmp(mdmRtnbuf,"OK\r\n",4)==0) {
mdm_state1 = 2;
mdm_index++;
if(mdm_sending_busy) mdm_sending_busy = 0;
//SetLEDWarn(LED_ON, SWAIT100MS);
RunLed_Period = SWAIT100MS;
return INIT_OK;
}
else if((strncmp(mdmRtnbuf,"ERROR\r\n",7)==0)
&&(rtnPtr.lenAck != 0))
{/*命令错误错误*/
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_FAIL;
}
else if((strncmp(mdmRtnbuf,"BUSY\r\n",4)==0)
&&(rtnPtr.lenAck != 0))
{/*拨号忙*/
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_FAIL;
}
else if((strncmp(mdmRtnbuf,"NO ANSWER\r\n",11)==0)
&&(rtnPtr.lenAck != 0))
{/*无应答*/
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_FAIL;
}
else if((strncmp(mdmRtnbuf,"NO CARRIER\r\n",12)==0)
&&(rtnPtr.lenAck != 0))
{/*无载波*/
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_FAIL;
}
mdmRtnbuf_cnt = 0;
}
if(++mdm_wait1 > SWAIT3S){/*超时退出*/
mdm_state1 = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
return INIT_FAIL;
}
break;
default:
mdm_state1 = 0;
}
return 0;
}
uchar SearchMDMBuffer_Proc(uchar *str)
{
uchar i,j;
uint l;
j = strlen(str);
if(mdmRtnbuf_cnt < j) return 0;
//查找字符串
l = 0;
i = 0;
while(l<mdmRtnbuf_cnt)
{
if(str[i] == mdmRtnbuf[l]) i++;
else i = 0;
l++;
if(i >= j) return 1;
}
return 0;
}
void Modem_Control()
{
uchar rtn;
switch(mdm_state){
case MAIN_MDM_RESET:
//SetLEDWarn(LED_ON, 0);
RunLed_Period = 255;
Reset_Modem(0);
PrintToUartB("Init MODEM, Reset ON!",21);
if ((NetPara.CommMode == COMM_MODE_UART)
||((NetPara.EquipNo > 0)&&(NetPara.EquipNo < 0xff)))//从机时也当作串口直接连接
{
mdm_state = MAIN_MDM_UART_COMM;
//SetLEDWarn(LED_OFF, 0);
RunLed_Period = 1;
}
else{
mdm_state = MAIN_MDM_RESET1;
}
mdm_wait = 0;
mdm_wait1 = 0;
mdm_state1 = 0;
ModemLineCount = 0;//2006-8-11增加,解决网管提取到上次包的问题。
MDMRvBuf_H = MDMRvBuf_T = 0;
break;
case MAIN_MDM_RESET1:
RunLed_Period = 5;//MODEm初始化,指示灯快闪
if(++mdm_wait>50){
//SetLEDWarn(LED_ON, 0);
RunLed_Period = 255;
Reset_Modem(1);
mdm_index = 0;
//S_CommandA(0x28, 0, 1); //定时上报,
PrintToUartB("Init MODEM, Reset Off!",22);
mdm_state = MAIN_MDM_INIT;
mdm_state1 = 0;
}
break;
case MAIN_MDM_INIT:
RunLed_Period = 5;//MODEm初始化,指示灯快闪
rtn = Init_Modem_Proc();
if (rtn == INIT_OK){
//SetLEDWarn(LED_OFF, 0);
RunLed_Period = 1;
mdm_state1 = 0;
PrintToUartB("Init MODEM, Success!",20);
if(EqInfo.WorkMode == WORKMODE_UPGRADE){
mdm_state1 = 0;
mdm_state = MAIN_MDM_GPRS_DIAL;
}
else{
if (NetPara.CommMode == COMM_MODE_PSTN_DATA)
{/*数传模式*/
mdm_state = MAIN_MDM_WAIT;
}
else
{
mdm_state = MAIN_MDM_SMS;
}
}
RunLed_Period = 12;
}
else if (rtn == INIT_FAIL){
mdm_state = MAIN_MDM_RESET;
}
break;
case MAIN_MDM_SMS:
switch(Wait_SMS_Proc()) {
case 1://ring in
//SetLEDWarn(LED_ON, SWAIT500MS);
RunLed_Period = SWAIT500MS;
if(++RingCount>=MAX_RINGIN){
mdm_state1 = 0;
mdm_state = MAIN_MDM_ANSWER;
PrintToUartB("Ring In, Modem Answer!",22);
}
break;
case 2:
break;
case 3:
mdm_state = MAIN_MDM_RESET;
break;
}
if(EqInfo.WorkMode == WORKMODE_UPGRADE){
mdm_state = MAIN_MDM_GPRS_DIAL;
}
/*if (NetPara.CommMode == COMM_MODE_UART)
mdm_state = MAIN_MDM_RESET;*/
/* if(mdm_ATCCED_timer > MAX_SEND_CCED_TIME){//15分钟 检测modem是否在线
mdm_ATCCED_timer = 0;
mdm_state = MAIN_MDM_SEND_ATCCED;
mdm_state1 = 0;
}*/
/*else mdm_state = MAIN_MDM_RESET;*/
break;
case MAIN_MDM_WAIT:
if(ReadCMDLine()){
if((strncmp(mdmRtnbuf,"RING\r\n",6)==0))
{/*振铃转应答*/
//SetLEDWarn(LED_ON, SWAIT500MS);
RunLed_Period = SWAIT500MS;
if(++RingCount>=MAX_RINGIN)
mdm_state = MAIN_MDM_ANSWER;
}
else if(strncmp(mdmRtnbuf,"+CLIP:",6)==0)/*获取来电号*/
{
GetSMSPick_Proc(2);
//SetLEDWarn(LED_ON, SWAIT100MS);
RunLed_Period = SWAIT100MS;
}
else if(strncmp(mdmRtnbuf,"CONNECT",7)==0)
{/*自动应答连接成功*/
mdm_state = MAIN_MDM_CONNECT;
mdm_state1 = MAIN_MDM_ANSWER;
mdm_wait = 0;
}
mdmRtnbuf_cnt = 0;
}
if((NetPara.CommMode == COMM_MODE_PSTN_DATA)
&&(MDMSendBuf_H!=MDMSendBuf_T))
{//如果有数据要发送则 拨号
mdm_state = MAIN_MDM_DIAL;
}
if(EqInfo.WorkMode == WORKMODE_UPGRADE){
mdm_state = MAIN_MDM_GPRS_DIAL;
}
break;
case MAIN_MDM_DIAL:
RunLed_Period = 5;//MODEm通信,指示灯快闪
rtn = ModemDial_Proc();
if (rtn == INIT_OK){
mdm_state = MAIN_MDM_CONNECT;
mdm_state1 = MAIN_MDM_DIAL;
mdm_wait = 0;
}
else if (rtn == INIT_FAIL){
mdm_state = MAIN_MDM_ONHOOK;//MAIN_MDM_RESET;
}
break;
case MAIN_MDM_GPRS_DIAL:
RunLed_Period = 5;//MODEm通信,指示灯快闪
rtn = GPRSLogin_Proc();
if (rtn == INIT_OK){
mdm_state = MAIN_MDM_CONNECT;
mdm_state1 = MAIN_MDM_GPRS_DIAL;
mdm_wait = 0;
}
else if (rtn == INIT_FAIL){
mdm_state = MAIN_MDM_ONHOOK;//MAIN_MDM_RESET;
}
break;
case MAIN_MDM_ANSWER:
RunLed_Period = 5;//MODEm通信,指示灯快闪
rtn = ModemAnswer_Proc();
if (rtn == INIT_OK){
mdm_state = MAIN_MDM_CONNECT;
mdm_state1 = MAIN_MDM_ANSWER;
PrintToUartB("MODEM Connecting!",17);
mdm_wait = 0;
}
else if (rtn == INIT_FAIL){
mdm_state = MAIN_MDM_ONHOOK;//MAIN_MDM_RESET;
}
break;
case MAIN_MDM_UART_COMM:
Rev_OK = ReadRS232();//GetMDMCMD();
if((NetPara.EquipNo == 0)||(NetPara.EquipNo == 0xff)){
if (NetPara.CommMode != COMM_MODE_UART)
mdm_state = MAIN_MDM_RESET;
}
break;
case MAIN_MDM_CONNECT:
RunLed_Period = 5;//MODEm通信,指示灯快闪
Rev_OK = ReadRS232();//GetMDMCMD();
if((CheckCarrierStatus(0) == 0)&&(mdm_wait > SWAIT5S)){
RunLed_Period = SWAIT1S;
mdm_state = MAIN_MDM_ONHOOK;
PrintToUartB("Hi,CARRIER LOST!",16);
}
if(Rev_OK)//GetMDMCMD();
{//20050804, 数传收到结束命令的处理
if(SearchMDMBuffer_Proc("NO CARRIER\r\n") > 0)
{
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
mdm_state = MAIN_MDM_ONHOOK;
Rev_OK = 0;
PrintToUartB("String:NO CARRIER!",18);
}
else if(SearchMDMBuffer_Proc("BUSY\r\n") > 0)
{
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
mdm_state = MAIN_MDM_ONHOOK;
Rev_OK = 0;
}
else if(SearchMDMBuffer_Proc("ERROR\r\n") > 0)
{
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
mdm_state = MAIN_MDM_ONHOOK;
Rev_OK = 0;
}
else Rev_OK = 1;
}
mdm_wait++;
if(mdm_state1 == MAIN_MDM_DIAL)
{//有条件挂断
if(((MDMSendBuf_H==MDMSendBuf_T) && (AlmSmsBufIsBlank() > 0)&&(mdm_wait > SWAIT5S))
|| (mdm_wait > SWAIT50S)){
mdm_state = MAIN_MDM_ONHOOK;
//SetLEDWarn(LED_ON, SWAIT500MS);
RunLed_Period = SWAIT500MS;
}
}
else if(mdm_wait > MAX_HOOKONTIME)
{//超时退出
mdm_state = MAIN_MDM_ONHOOK;
}
break;
case MAIN_MDM_ONHOOK:
RunLed_Period = 12;//MODEm通信,指示灯快闪
rtn = ath_p();
if (rtn == INIT_OK){
mdm_state = MAIN_MDM_RESET;//MAIN_MDM_INIT;
mdm_state1 = 0;
mdm_wait = 0;
mdm_state1 = 0;
}
else if (rtn == INIT_FAIL){
mdm_state = MAIN_MDM_RESET;
}
break;
case MAIN_MDM_SEND_ATCCED:
/* rtn = AT_CCED_Proc();
if (rtn == INIT_OK){
mdm_state = MAIN_MDM_SMS;*/
mdm_state1 = 0;
/* }
else if (rtn == INIT_FAIL){
mdm_state = MAIN_MDM_RESET;
}*/
break;
default:
mdm_state = MAIN_MDM_RESET;
mdm_state1 = 0;
break;
}
if(Rev_OK) {
Rev_OK = 0;
//SetLEDWarn(LED_ON, SWAIT1S);
RunLed_Period = SWAIT1S;
ModemMsg_Proc(0,mdmRtnbuf,mdmRtnbuf_cnt);
mdmRtnbuf_cnt = 0;
}
/* if (last_cmd_wait){
if(--last_cmd_wait==0) {
last_cmd = 0;
}
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -