📄 modem.c
字号:
mdm_wait1 = SWAIT3S;
}
break;
case INIT_READALL_SMS_WAIT:
mdm_wait1--;
if(mdm_wait1 == 0) mdm_state1 = INIT_DEL_SMS;
break;
case INIT_DEL_SMS:
if(mdm_sending_busy==0){
SendATCmd(ModemOperateCMDString[13].pSend, strlen(ModemOperateCMDString[13].pSend), 0);
mdm_state1 = INIT_DEL_SMS_WAIT;
mdm_wait1 = SWAIT1S;
}
break;
case INIT_DEL_SMS_WAIT:
mdm_wait1--;
if(mdm_wait1 == 0) {
return INIT_OK;//初始化正确,完成
}
break;*/
default:
mdm_state1 = 0;
}
return 0;
}
void GetSMSPick_Proc(uchar flag)
{
uchar i,j;
i = j = 0;
if(flag)
{
while(i < mdmRtnbuf_cnt){
if(mdmRtnbuf[i] == ':') break;
i++;
}
i=i+2;
while(i < mdmRtnbuf_cnt){
if(mdmRtnbuf[i] == ',') break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
EEBuf[j++] = '\0';
SmsIndexBuf[SmsBT] = StrToUChar(&EEBuf[0]);
if(++SmsBT >= 40) SmsBT = 0;
}
i = j = 0;
for(j=0;j<mdmRtnbuf_cnt;j++) if(mdmRtnbuf[j]=='"') break;/*查找第一个",*/
j++;
/* +CMGL: 15,"REC UNREAD","+8613927413598",,"05/06/10,09:04:10+00"*/
if(flag)
{
if (NetPara.CommMode == COMM_MODE_CDMA_SMS)//CDMA
j = j + 5;/*取掉"REC UNREAD",*/
else{
while(j<mdmRtnbuf_cnt)
{
if(mdmRtnbuf[j]=='"')break;/*查找第二个",*/
j++;
}
j++;
while(j<mdmRtnbuf_cnt)
{
if(mdmRtnbuf[j]=='"')break;/*查找第三个",*/
j++;
}
j++;
}
}
/*直通方式解包*/
/*GSM====>+CMT: "+8613927413598",,"05/06/10,09:08:06+00"*/
/*CDMA===>+CMT:"13927413598","05/06/22,12 :20 :12",129,0,2,0,"13927413598",15
X ARE YOU OK? X */
while(i<mdmRtnbuf_cnt){
if(mdmRtnbuf[i+j]=='"') break;/*查找第二个",电话号结束*/
SMSPick.tel[i] = mdmRtnbuf[j+i];
i++;
}
SMSPick.tel[i++] = 0;
if(NetPara.CommMode != COMM_MODE_PSTN_DATA)
{
if (NetPara.CommMode == COMM_MODE_CDMA_SMS){/*CDMA*/
SMSPick.year = (mdmRtnbuf[j+i+2]<<4)+(mdmRtnbuf[j+i+3]&0x0f);
SMSPick.month = (mdmRtnbuf[j+i+5]<<4)+(mdmRtnbuf[j+i+6]&0x0f);
SMSPick.day = (mdmRtnbuf[j+i+8]<<4)+(mdmRtnbuf[j+i+9]&0x0f);
SMSPick.hour = (mdmRtnbuf[j+i+11]<<4)+(mdmRtnbuf[j+i+12]&0x0f);
SMSPick.minute = (mdmRtnbuf[j+i+15]<<4)+(mdmRtnbuf[j+i+16]&0x0f);
SMSPick.second = (mdmRtnbuf[j+i+19]<<4)+(mdmRtnbuf[j+i+20]&0x0f);
SMSPick.gst = 0;
}
else{/*GSM*/
SMSPick.year = (mdmRtnbuf[j+i+3]<<4)+(mdmRtnbuf[j+i+4]&0x0f);
SMSPick.month = (mdmRtnbuf[j+i+6]<<4)+(mdmRtnbuf[j+i+7]&0x0f);
SMSPick.day = (mdmRtnbuf[j+i+9]<<4)+(mdmRtnbuf[j+i+10]&0x0f);
SMSPick.hour = (mdmRtnbuf[j+i+12]<<4)+(mdmRtnbuf[j+i+13]&0x0f);
SMSPick.minute = (mdmRtnbuf[j+i+15]<<4)+(mdmRtnbuf[j+i+16]&0x0f);
SMSPick.second = (mdmRtnbuf[j+i+18]<<4)+(mdmRtnbuf[j+i+19]&0x0f);
SMSPick.gst = (mdmRtnbuf[j+i+21]<<4)+(mdmRtnbuf[j+i+22]&0x0f);
}
}
}
uchar GetSMSIndex()
{//+CMTI: "SM",17
uchar i=0,j=0;
while(i < mdmRtnbuf_cnt){
if(mdmRtnbuf[i] == ',') break;
i++;
}
i++;
while(i < mdmRtnbuf_cnt){
if((mdmRtnbuf[i] == 0x0d)||(mdmRtnbuf[i] == 0)) break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
EEBuf[j++] = '\0';
return(StrToUChar(&EEBuf[0]));
}
schar GetCSQPara_Proc()
{//+CSQ: 30,99
uchar i=0,j=0;
while(i < mdmRtnbuf_cnt){
if(mdmRtnbuf[i] == ':') break;
i++;
}
i++;
while(i < mdmRtnbuf_cnt){
if((mdmRtnbuf[i] == ',')) break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
EEBuf[j++] = '\0';
i = StrToUChar(&EEBuf[0]);
if(i > 32) i = 32;//处理当为99时, 则查表返回值为0;
return (ModemCSQ_Tab[i]);
}
void GetCCEDPara_Proc()
{//+CCED: 460, 00, 2532, 1039, 47, 594, 56,,,0,,,0,460,00,2532,0f48,43,66,59,460,00,2532,
// MCC, MNC,LAC(HEX),CI(HEX), BSIC,BCCH,RxLev,RxLev Full
uchar i=0,j=0;
//uint l;
while(i < mdmRtnbuf_cnt){
if(mdmRtnbuf[i] == ':') break;
i++;
}
i++;
while(i < mdmRtnbuf_cnt){
if((mdmRtnbuf[i] == ',')) break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
i++;
EEBuf[j++] = '\0';
RealPara.MCC = StrToUInt(&EEBuf[0]);
j=0;
while(i < mdmRtnbuf_cnt){
if((mdmRtnbuf[i] == ',')) break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
i++;
EEBuf[j++] = '\0';
RealPara.MNC = StrToUChar(&EEBuf[0]);
j=0;
while(i < mdmRtnbuf_cnt){
if((mdmRtnbuf[i] == ',')) break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
i++;
EEBuf[j++] = '\0';
RealPara.LAC = StrHexToUInt(&EEBuf[0]);
j=0;
while(i < mdmRtnbuf_cnt){
if((mdmRtnbuf[i] == ',')) break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
i++;
EEBuf[j++] = '\0';
RealPara.CI = StrHexToUInt(&EEBuf[0]);
j=0;
while(i < mdmRtnbuf_cnt){
if((mdmRtnbuf[i] == ',')) break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
i++;
EEBuf[j++] = '\0';
RealPara.BSIC = StrToUChar(&EEBuf[0]);
j=0;
while(i < mdmRtnbuf_cnt){
if((mdmRtnbuf[i] == ',')) break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
i++;
EEBuf[j++] = '\0';
RealPara.BCCH = StrToUInt(&EEBuf[0]);
j=0;
while(i < mdmRtnbuf_cnt){
if((mdmRtnbuf[i] == ',')) break;
EEBuf[j++] = mdmRtnbuf[i];
i++;
}
EEBuf[j++] = '\0';
RealPara.RxLev = (schar) StrToUChar(&EEBuf[0]);
}
uchar Wait_SMS_Proc()
{
uchar ucRtn=0, i, j;
switch(mdm_state1){
case 0:
mdm_state1 = 1;
mdm_ATCCED_timer = MAX_SEND_CCED_TIME - 10;
break;
case 1:/*等待消息*/
Rev_OK = ReadCMDLine();
if(Rev_OK){
if (strncmp(mdmRtnbuf,"+CMT:",5)==0) {/*直通时,收到短信*/
GetSMSPick_Proc(0);
if (NetPara.CommMode == COMM_MODE_CDMA_SMS){
//next_state1 = 1;
SendATCmd(ModemOperateCMDString[0].pSend,
strlen(ModemOperateCMDString[0].pSend), 0);
mdm_state1 = 4;
mdm_wait1 = SWAIT5S;
mdm_sending_busy = 1;
}
else{
mdm_state1 = 1;
//next_state1 = 0;
mdm_wait1 = SWAIT1S;
}
mdmRtnbuf_cnt = 0;
}
else if ((strncmp(mdmRtnbuf,"+CMGR:",6)==0)
/*|| (strncmp(mdmRtnbuf,"+CMGL:",6)==0)*/)
{/*读取到短信*/
GetSMSPick_Proc(1);
mdm_state1 = 5;
mdm_wait1 = SWAIT1S;
mdmRtnbuf_cnt = 0;
msgA_state = 4;
PrintToUartB("Notify...Read SMS!",18);
}
else if (/*(strncmp(mdmRtnbuf,"+CMGR:",6)==0)
|| */(strncmp(mdmRtnbuf,"+CMGL:",6)==0))
{/*读取到短信*/
GetSMSPick_Proc(1);
//mdm_state1 = 5;
//mdm_wait1 = SWAIT1S;
mdmRtnbuf_cnt = 0;
msgA_state = 4;
}
else if (strncmp(mdmRtnbuf,"OK\r\n",4) == 0)/*收到OK*/
{
if(mdm_sending_busy) mdm_sending_busy = 0;
Rev_OK = 0;
mdmRtnbuf_cnt = 0;
}
else if (strncmp(mdmRtnbuf,"+CSQ:",5) == 0)/*收到OK*/
{
GetCSQPara_Proc();
//if(mdm_sending_busy) mdm_sending_busy = 0;
Rev_OK = 0;
mdmRtnbuf_cnt = 0;
}
else if (strncmp(mdmRtnbuf,"+CCED:",6) == 0)/*收到OK*/
{
GetCCEDPara_Proc();
//if(mdm_sending_busy) mdm_sending_busy = 0;
Rev_OK = 0;
mdmRtnbuf_cnt = 0;
}
else if((strncmp(mdmRtnbuf,"RING\r\n",6)==0))
{/*振铃转应答*/
ucRtn = 1;
}
else if(strncmp(mdmRtnbuf,"+CLIP:",6)==0)/*获取来电号*/
{
GetSMSPick_Proc(2);
//SetLEDWarn(LED_ON, SWAIT100MS);
RunLed_Period = SWAIT100MS;
}
// if(mdmRtnbuf[0] != SYNCB) mdmRtnbuf_cnt = 0;
}
if(mdm_sending_busy == 0){
if (SmsBH != SmsBT){
mdm_state1 = 5;
mdm_wait1 = SWAIT50MS;
}
else if(mdm_ATCCED_timer >= MAX_SEND_CCED_TIME)
{//15分钟 检测modem是否在线
mdm_ATCCED_timer = 0;
mdm_state1 = 7;
mdm_ReadSMS_Timer = 0;
mdm_wait1 = SWAIT3S;
}
else if(mdm_ReadSMS_Timer >= MDM_READSMS_TIME){
mdm_ReadSMS_Timer = 0;//保证操作modem之后, 间隔时间MDM_READSMS_TIME
mdm_state1 = 2;
mdm_wait1 = SWAIT3S;
}
}
else{
mdm_ReadSMS_Timer = 0;
}
break;
case 2:/*非直通时,读取短信*/
if((mdm_sending_busy == 0) && (mdm_wait1 == 0)){
/*if (NetPara.CommMode == COMM_MODE_CDMA_SMS){
SendATCmd(ModemOperateCMDString[3].pSend, strlen(ModemOperateCMDString[3].pSend), 0);
}
else{*/
if (SmsBH != SmsBT){
mdm_state1 = 5;
mdm_wait1 = SWAIT50MS;
}
else{
SendATCmd(ModemOperateCMDString[12].pSend, strlen(ModemOperateCMDString[12].pSend), 0);
mdm_state1 = 4;
mdm_wait1 = SWAIT10S;
mdm_sending_busy = 1;
RevSmsIndicator = 0;
}
}
if(mdm_wait1 > 0) mdm_wait1--;
Rev_OK = ReadCMDLine();
if(Rev_OK){
if (strncmp(mdmRtnbuf,"OK\r\n",2) == 0)//收到OK
{
mdm_sending_busy = 0;
Rev_OK = 0;
mdmRtnbuf_cnt = 0;
}
else if ((strncmp(mdmRtnbuf,"+CMGR:",6)==0)
|| (strncmp(mdmRtnbuf,"+CMGL:",6)==0))
{//读取到短信
//mdm_sending_busy = 0;
GetSMSPick_Proc(1);
mdmRtnbuf_cnt = 0;
msgA_state = 4;
//mdm_state1 = 6;
//mdm_wait1 = SWAIT1S;
mdmRtnbuf_cnt = 0;
}
}
break;
case 3:/*如果是 CDMA系统时,发送AT+CNMA确认信号*/
// if(mdm_sending_busy == 0){
/*
SendATCmd(ModemOperateCMDString[0].pSend, strlen(ModemOperateCMDString[0].pSend), 0);
mdm_state1 = 4;
mdm_wait1 = WAIT1S;
mdm_sending_busy = 1;*/
mdm_state1 = 4;
mdm_wait1 = 0;
// }
break;
case 4:/*延时*/
mdm_wait1--;
Rev_OK = ReadCMDLine();
if(Rev_OK){
if (strncmp(mdmRtnbuf,"OK\r\n",2) == 0)//收到OK
{
mdm_sending_busy = 0;
Rev_OK = 0;
mdm_wait1 = SWAIT100MS;
/* if(next_state1){
mdm_state1 = next_state1;
next_state1 = 0;
}
else*/
if(RevSmsIndicator>0)//没有读取到SMS则不执行删除操作
mdm_state1 = 5;
else
mdm_state1 = 1;
mdmRtnbuf_cnt = 0;
}
else if ((strncmp(mdmRtnbuf,"+CMGR:",6)==0)
|| (strncmp(mdmRtnbuf,"+CMGL:",6)==0))
{//读取到短信
//mdm_sending_busy = 0;
GetSMSPick_Proc(1);
mdmRtnbuf_cnt = 0;
msgA_state = 4;
//mdm_state1 = 6;
//mdm_wait1 = SWAIT1S;
RevSmsIndicator++;
}
}
else if((mdm_wait1 == 0)/*||(mdm_sending_busy == 0)*/){
mdm_sending_busy = 0;
if(RevSmsIndicator>0)//没有读取到SMS则不执行删除操作
mdm_state1 = 5;
else
mdm_state1 = 1;
mdmRtnbuf_cnt = 0;
}
break;
case 5:
if((mdm_sending_busy == 0)&&(--mdm_wait1 == 1)){
// mdm_sending_busy = 0;
// SendATCmd(ModemOperateCMDString[13].pSend, strlen(ModemOperateCMDString[13].pSend), 0);
// mdm_state1 = 6;
// mdm_wait1 = SWAIT10S;
// mdm_sending_busy = 1;
mdm_sending_busy = 0;
SendATCmd(ModemOperateCMDString[2].pSend, strlen(ModemOperateCMDString[2].pSend), 0);
j = UCharToStrCRLF(SmsIndexBuf[SmsBH], &EEBuf[0],1);
if(++SmsBH >= 40) SmsBH = 0;
for(i = 0; i < j; i++)
{
atcmd[atpt++] = EEBuf[i];
}
mdm_state1 = 6;
mdm_wait1 = SWAIT10S;
mdm_sending_busy = 1;
}
break;
case 6:/*读取短信内容*/
Rev_OK = ReadCMDLine();
if(Rev_OK)
{
if (strncmp(mdmRtnbuf,"OK\r\n",2) == 0)/*收到OK*/
{
mdm_sending_busy = 0;
Rev_OK = 0;
mdm_state1 = 1;
mdmRtnbuf_cnt = 0;
msgA_state = 0;
}
else if ((strncmp(mdmRtnbuf,"+CMGR:",6)==0)
|| (strncmp(mdmRtnbuf,"+CMGL:",6)==0))
{//读取到短信
//mdm_sending_busy = 0;
GetSMSPick_Proc(1);
mdmRtnbuf_cnt = 0;
msgA_state = 4;
//mdm_state1 = 6;
//mdm_wait1 = SWAIT1S;
}
}
if(--mdm_wait1 == 0){
mdm_state1 = 1;
}
break;
case 7://发送:AT+CCED=0
SendATCmd(ModemOperateCMDString[10].pSend, strlen(ModemOperateCMDString[10].pSend), 0);
mdm_state1 = 1;
mdm_sending_busy = 1;
break;
case 8:/*删除卡上短信*/
if((mdm_wait1 == 0)||(mdm_sending_busy == 0)){
mdm_state1 = 0;
return INIT_FAIL;//重新初始化MODEM,使短信处于直通方式
}
mdm_wait1--;
break;
default:
mdm_state1 = 0;
}
return ucRtn;
}
/*==========================================================
此函数的作用是定时检查MODEM是否注册网络,是否接收到网络信号,如果没有
检测到网络信号,则重新开关MODEM电,重新查找网络.
*/
uchar AT_CCED_Proc()
{
uchar i;
switch(mdm_state1){
case 0:/*Initiallize*/
//next_state1 = 0;
mdm_state1 = 1;
break;
case 1:/*ready to send AT CCED command.*/
if(mdm_sending_busy == 0)
{
next_state1++;
SendATCmd(ModemOperateCMDString[4].pSend, strlen(ModemOperateCMDString[4].pSend), 0);
mdm_state1 = 2;
mdm_wait1 = 0;
mdm_sending_busy = 1;
}
break;
case 2:/*wait response*/
Rev_OK = ReadCMDLine();
if(Rev_OK){
if((strncmp(mdmRtnbuf,"+CSQ",4)==0)
&&(rtnPtr.lenAck != 0))
{
mdm_sending_busy = 0;
if (NetPara.CommMode == COMM_MODE_CDMA_SMS)/* +CSQ:16, 99 */
i = ((mdmRtnbuf[5]&0x0f) * 10) + (mdmRtnbuf[6]&0x0f);
else/*+CSQ: 29,99*/
i = ((mdmRtnbuf[6]&0x0f) * 10) + (mdmRtnbuf[7]&0x0f);
if(i <= 31)/* MODEM OK*/
return INIT_OK;
else if(next_state1 > 2)
{
return INIT_FAIL;
}
else{
mdm_state1 = 1;
}
}
mdmRtnbuf_cnt = 0;
}
if(++mdm_wait1 > SWAIT20S){
if(next_state1 > 2)
return INIT_FAIL;
else
mdm_state1 = 1;
}
break;
default:
mdm_state1 = 0;
}
return 0;
}
uchar ModemDial_Proc()
{
//uchar i;
if(NetPara.CommMode != COMM_MODE_PSTN_DATA) return INIT_FAIL;
switch(mdm_state1){
case 0:
mdm_wait1 = 0;
mdm_state1 = 1;
break;
case 1:
if(++mdm_wait1>SWAIT3S)
{/*当MODEM开电复位后,要注册网络, 如果还未注册网络前,发拨号命令将会不成功
因此此处延时等待确保注册完成后拨号.*/
SetDTR(0, ON);
SendATCmd(ModemOperateCMDString[5].pSend,
strlen(ModemOperateCMDString[5].pSend), 3);
mdm_wait1 = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -