📄 main.c
字号:
dprintf1("AT\r\n");
num=0 ;
flag = 0 ;
while(num <10)
{
sprintf( str , "second=%d" , num+1 );
RunMsgPrintf(str);
num++;
delay_s(1);
if (ReadDownBuf( str , 9 ) ==0)continue ;
if( (strstr(str,"OK")!=0) || (strstr(str,"ok")!=0) )
{
flag = 1 ;
break ;
}
}
if (flag==0)//等待AT响应超时,模块没有相应
{
RunMsgPrintf("等待AT响应超时");
return 0 ;
}
RunMsgPrintf("gsm模块响应");
delay_s(1) ;
RunMsgPrintf("正在对gsm初始化...");
delay_s(20) ;
//关闭回显
dprintf1("ATE0\r\n");
delay_ms(500);
//短消息直接输出,不经过SIM卡
// dprintf1("AT+CNMI=1,1,0,0,0\r\n");
dprintf1("AT+CNMI=2,2,0,0,0\r\n");
delay_ms(500);
num = 0 ;
RunMsgPrintf("正在读取短信中心号码...");
while(num < 100)
{
num++;
ClearDownBuff() ;
dprintf1("AT+CSCA?\r\n");
delay_s(1);
for(kk=0; kk< DownBufMax; kk++)
{
len = ReadDownBuf( str , 59 );
if(len > 0)
{
if((strstr(str,"+CSCA:")!=0))
{
len = FindeCharInStr (str , len , 1 , '"');
myCopy( str , SysPara.ServerCenter , len+2 , 13 );
RunMsgPrintf("获得中心号码:");
RunMsgPrintf(SysPara.ServerCenter);
return 1;
}
}
}
}
return 0 ;
}
/*-----------------------------------------------------------------------
功能:清空下行数据缓冲区
-------------------------------------------------------------------------*/
void ClearDownBuff (void)
{
int j ;
DownBuf.BufBegin = 0 ;//清空接收缓冲区,使缓冲区处于可写不可读的状态
DownBuf.BufEnd = 0 ;
for ( j = 0 ; j < DownBufMax ; j++ )
{
DownBuf.Buff[j].len = 0 ;
DownBuf.Buff[j].state = writeonly ;
}
}
/*-----------------------------------------------------------------------
功能:清空上行数据缓冲区
-------------------------------------------------------------------------*/
void ClearUpBuff (void)
{
int j ;
UpBuf.BufBegin = 0 ;//清空接收缓冲区,使缓冲区处于可写不可读的状态
UpBuf.BufEnd = 0 ;
for ( j = 0 ; j < UpBufMax ; j++ )
{
UpBuf.Buff[j].len = 0 ;
UpBuf.Buff[j].state = writeonly ;
}
}
/*-----------------------------------------------------------------------
判断数据缓冲区中数据的类型
输入:p 来自GSM的信息,这里只处理跟短信有关的几条信息
1 +CMTI=class2短消息的指示信息
2 +CMGR=class2短消息的内容信息
3 +CMT=除class2短消息之外的其他类短消息的内容信息
[note]通常用手机发送的短消息,都是无类型的。
-------------------------------------------------------------------------*/
void CheckDownData(TBuff *p)
{
int i ;
SM_PARAM MySM_PARAM;
//短消息直接输出
if (strstr((*p).data , "\r\n+CMT:")!=NULL)
{
DecodeSms((*p).data, (*p).len, &MySM_PARAM );
centFrameDeal(MySM_PARAM.TP_UD, MySM_PARAM.TP_UDlen);
return ;
}
//TA返回短信
if (strstr((*p).data , "\r\n+CMGR:")!=NULL)
{
DecodeSms((*p).data, (*p).len, &MySM_PARAM );
centFrameDeal(MySM_PARAM.TP_UD, MySM_PARAM.TP_UDlen);
return ;
}
if (strstr((*p).data , "+CMTI:")!=NULL) //用于处理class2的短消息提示
{
if (sscanf((*p).data,"\r\n+CMTI: \"SM\",%d\r\n", &i) ==1)
{
dprintf1("AT+CMGR=%d\r\n" , i);
delay_s(3);
//等待终端接收完毕后删除短信
dprintf1("AT+CMGD=%d\r\n" , i);
}
return ;
}
}
//**************************************************************************
//函数:SendSms
//功能: 发送一条短信
//输入:MySM_PARAM=短信信息
//返回:0=发送失败,1=发送成功
//**************************************************************************
char SendSms(SM_PARAM *MySM_PARAM)
{
unsigned char pDst[350];
char cmd[20];
sprintf(MySM_PARAM->SCA , SysPara.ServerCenter);
sprintf(MySM_PARAM->TPA , BasicPara.CenterGsmNum);
MySM_PARAM->TP_DCS = GSM_8BIT;
delay_s(3);
sprintf(cmd, "at+cmgs=%d\r\n" , gsmEncodePdu( MySM_PARAM , pDst ));
myprintf1(cmd);
myprintf0(cmd);
delay_s(1);
myprintf0(pDst);
myprintf1(pDst);
delay_s(1);
return 1;
}
//**************************************************************************
//函数:解码短信
//功能: 解码一条短信
//输入:MySM_PARAM=短信信息
//返回:0=解码失败,1=解码成功
//**************************************************************************
char DecodeSms(unsigned char *sms , int smsLen, SM_PARAM *MySM_PARAM )
{
int i;
i = FindeCharInStr( sms , smsLen , 2 , 0x0a ) ;//定位换行符
if (i>-1)
{
gsmDecodePdu( sms + 1 +i , MySM_PARAM ) ; //解码pdu
}
return 1;
}
//**************************************************************************
//函数:DebugInfo
//功能: 显示运行信息
//**************************************************************************
void ConsolePrintf(unsigned char *info)
{
dprintf0("\r\n#ZF> %s", info);
}
void delay_s(int i)
{
int ss ;
if (i<=0)return ;
for(ss=0;ss<i;ss++)
delay_ms(8000);
}
void delay_ms(int i)
{
int kk ,hh ;
if (i<=0)return ;
for(kk=0;kk<i;kk++)
for(hh=0;hh<8000;hh++);
}
//**************************************************************************
//函数:ExplainCommand
//功能: 解释并响应console口的命令
//输入:cmd=console口输入命令,cmdLen=命令长度
//返回:0=不可识别命令,1=可识别命令
//**************************************************************************
char ExplainConsoleCmd (char *cmd, int cmdLen)
{
char flag = 0;
int kk, jj;
// SM_PARAM MySM_PARAM;
myprintf0("\r\n#ZF> ");
//换行
if (cmd[0]=='\r')return 0;
//以下全部当作命令处理
if ((cmdLen < 3)||(cmdLen > 100))
{
flag = 0;
}else if ((*cmd != 'T')||(*(cmd+1) != 'M'))
{
flag = 0;
}
else if (strcmp(cmd , "TM?\r")==0)//测试终端是否正常工作
{
myprintf0("\r\nTM\r\nOK\r\n");
flag = 1;
}
else if (strcmp(cmd , "TM+BPID=?\r")==0)//读取ID
{
dprintf0("\r\n+BPID: %s%s%s\r\nOK\r\n",
BasicPara.TM_Time,
BasicPara.TM_type,
BasicPara.TM_id
);
flag = 1;
}
else if (strstr(cmd , "TM+BPID=")!=0)//设置ID
{
if ( cmdLen == 25)
{
myCopy(cmd, BasicPara.TM_Time, 8, 6);
myCopy(cmd, BasicPara.TM_type, 8+6, 4);
myCopy(cmd, BasicPara.TM_id, 8+6+4, 6);
dprintf0("\r\n+BPID: %s%s%s\r\nOK\r\n",
BasicPara.TM_Time,
BasicPara.TM_type,
BasicPara.TM_id
);
Myeeprom_write_block( (void *)BasicPara.TM_Time, (void *)BP_TM_TIME_ADDR, 6);
Myeeprom_write_block( (void *)BasicPara.TM_type, (void *)BP_TM_TYPE_ADDR, 4);
Myeeprom_write_block( (void *)BasicPara.TM_id, (void *)BP_TM_ID_ADDR, 6);
flag = 1;
}
else
{
flag = 0;
}
}
else if (strcmp(cmd , "TM+BPCN=?\r")==0)//读取中心短信号码
{
dprintf0("\r\n+BPCN: %s\r\nOK\r\n", BasicPara.CenterGsmNum);
flag = 1;
}
else if (strstr(cmd , "TM+BPCN=")!=0)//设置中心短信号码
{
if (cmdLen == 9+CENTERNUMLEN)
{
if ((*(cmd+8)=='8')&&(*(cmd+9)=='6'))
{
myCopy(cmd, BasicPara.CenterGsmNum, 8, CENTERNUMLEN);
dprintf0("\r\n+BPCN: %s\r\nOK\r\n", BasicPara.CenterGsmNum);
Myeeprom_write_block( (void *)BasicPara.CenterGsmNum, (void *)BP_TM_CNTNUM_ADDR, 13);
// sprintf(MySM_PARAM.TP_UD, "01");
// MySM_PARAM.TP_UDlen = 2;
// SendSms(&MySM_PARAM);
flag = 1;
}
else
{
flag = 0;
}
}
else
{
flag = 0;
}
}
else if (strcmp(cmd , "TM+WPSB?\r")==0)//查询传感器报警门限列表
{
dprintf0("\r\n+WPSB: (1,%d),(0,65535)\r\nOK\r\n", SENSORSNUM);
flag = 1;
}
else if (strcmp(cmd , "TM+WPSB=?\r")==0)//查询传感器报警门限
{
myprintf0("\r\n+WPSB: ");
for(kk=0; kk< (SENSORSNUM-1); kk++)
{
dprintf0("%d:%d,", kk+1, WorkPara.SensorsBound[kk]);
}
dprintf0("%d:%d\r\nOK\r\n", SENSORSNUM, WorkPara.SensorsBound[SENSORSNUM-1]);
flag = 1;
}
else if (strstr(cmd , "TM+WPSB=")!=0)//设置传感器报警门限
{
if (sscanf(cmd, "TM+WPSB=%d,%d\r", &kk, &jj )== 2)
{
if ((kk > SENSORSNUM)||(kk<1))
{
flag = 0;
}
else
{
WorkPara.SensorsBound[kk-1] = jj;
dprintf0("\r\n+WPSB: %d,%d\r\nOK\r\n", kk,jj );
Myeeprom_write_block( (void *)WorkPara.SensorsBound, (void *)WP_SENSORBOUND_ADDR, 32);
flag = 1;
}
}
else
{
flag = 0;
}
}
else if (strcmp(cmd , "TM+WPSW?\r")==0)//查询传感器报警使能列表
{
myprintf0("\r\n+WPSW: (1,16),(0,1)\r\nOK\r\n");
flag = 1;
}
else if (strcmp(cmd , "TM+WPSW=?\r")==0)//查询传感器报警使能
{
myprintf0("\r\n+WPSW: ");
for(kk=0; kk<(SENSORSNUM-1); kk++)
{
if (BitCheck(WorkPara.SensorsWarnEnabled[kk/8], kk%8) > 1)dprintf0("%d:1,", kk+1);
if (BitCheck(WorkPara.SensorsWarnEnabled[kk/8], kk%8) == 1)dprintf0("%d:0,", kk+1);
}
if (BitCheck(WorkPara.SensorsWarnEnabled[(SENSORSNUM-1)/8], (SENSORSNUM-1)%8) == 1)dprintf0("%d:0\r\nOK\r\n", SENSORSNUM);
if (BitCheck(WorkPara.SensorsWarnEnabled[(SENSORSNUM-1)/8], (SENSORSNUM-1)%8) > 1)dprintf0("%d:1\r\nOK\r\n", SENSORSNUM);
flag = 1;
}
else if (strstr(cmd , "TM+WPSW=")!=0)//设置传感器报警使能
{
if (sscanf(cmd, "TM+WPSW=%d,%d\r", &kk, &jj) == 2)
{
if ((kk > 16)||(kk<1)||(jj<0)||(jj>1))
{
flag = 0;
}
else
{
//修改传感器报警使能位
if (jj==1)
{
SetBit(&(WorkPara.SensorsWarnEnabled[(kk-1)/8]), (kk-1)%8);
}
else
{
ClearBit(&(WorkPara.SensorsWarnEnabled[(kk-1)/8]), (kk-1)%8);
}
dprintf0("\r\n+WPSW: %d,%d\r\nOK\r\n", kk,jj );
Myeeprom_write_block( (void *)WorkPara.SensorsWarnEnabled, (void *)WP_SENSORWARNEN_ADDR, 2);
flag = 1;
}
}
else
{
flag = 0;
}
}
else if (strcmp(cmd , "TM+WPSS?\r")==0)//查询开关量正常状态列表
{
myprintf0("\r\n+WPSS: (1,16),(0,1)\r\nOK\r\n");
flag = 1;
}
else if (strcmp(cmd , "TM+WPSS=?\r")==0)//查询开关量正常状态
{
myprintf0("\r\n+WPSS: ");
for(kk=0; kk<(16-1); kk++)
{
if (BitCheck(WorkPara.SwitchNomalState[kk/8], kk%8) > 1)
{
dprintf0("%d:1,", kk+1);
continue;
}
if (BitCheck(WorkPara.SwitchNomalState[kk/8], kk%8) == 1)
{
dprintf0("%d:0,", kk+1);
continue;
}
}
if (BitCheck(WorkPara.SwitchNomalState[(16-1)/8], (16-1)%8) == 1)dprintf0("%d:0\r\nOK\r\n", 16);
if (BitCheck(WorkPara.SwitchNomalState[(16-1)/8], (16-1)%8) > 1)dprintf0("%d:1\r\nOK\r\n", 16);
flag = 1;
}
else if (strstr(cmd , "TM+WPSS=")!=0)//设置开关量正常状态
{
if (sscanf(cmd, "TM+WPSS=%d,%d\r", &kk, &jj )== 2)
{
if ((kk > 16)||(kk<1)||(jj<0)||(jj>1))
{
flag = 0;
}
else
{
//修改开关正常状态
if (jj==1)
{
SetBit(&(WorkPara.SwitchNomalState[(kk-1)/8]), (kk-1)%8);
}
else
{
ClearBit(&(WorkPara.SwitchNomalState[(kk-1)/8]), (kk-1)%8);
}
dprintf0("\r\n+WPSS: %d,%d\r\nOK\r\n", kk,jj );
Myeeprom_write_block( (void *)WorkPara.SwitchNomalState, (void *)WP_SWITCHNMSTATE_ADDR, 2);
flag = 1;
}
}
else
{
flag = 0;
}
}
else if (strcmp(cmd , "TM+WPSE?\r")==0)//查询开关量报警使能列表
{
myprintf0("\r\n+WPSE: (1,16),(0,1)\r\nOK\r\n");
flag = 1;
}
else if (strcmp(cmd , "TM+WPSE=?\r")==0)//查询开关量报警使能
{
myprintf0("\r\n+WPSE: ");
for(kk=0; kk<(16-1); kk++)
{
if (BitCheck(WorkPara.SwitchWarnEnable[kk/8], kk%8) > 1)
{
dprintf0("%d:1,", kk+1);
continue;
}
if (BitCheck(WorkPara.SwitchWarnEnable[kk/8], kk%8) == 1)
{
dprintf0("%d:0,", kk+1);
continue;
}
}
if (BitCheck(WorkPara.SwitchWarnEnable[(16-1)/8], (16-1)%8) > 1)dprintf0("%d:1\r\nOK\r\n", 16);
if (BitCheck(WorkPara.SwitchWarnEnable[(16-1)/8], (16-1)%8) == 1)dprintf0("%d:0\r\nOK\r\n", 16);
flag = 1;
}
else if (strstr(cmd , "TM+WPSE=")!=0)//设置开关量报警使能
{
if (sscanf(cmd, "TM+WPSE=%d,%d\r", &kk, &jj )== 2)
{
if ((kk > 16)||(kk<1)||(jj<0)||(jj>1))
{
flag = 0;
}
else
{
//修改开关量报警使能
if (jj==1)
{
SetBit(&(WorkPara.SwitchWarnEnable[(kk-1)/8]), (kk-1)%8);
}
else
{
ClearBit(&(WorkPara.SwitchWarnEnable[(kk-1)/8]), (kk-1)%8);
}
dprintf0("\r\n+WPSE: %d,%d\r\nOK\r\n", kk,jj );
Myeeprom_write_block( (void *)WorkPara.SwitchWarnEnable, (void *)WP_SWITCHWARNEN_ADDR, 2);
flag = 1;
}
}
else
{
flag = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -