📄 cgtm900.cpp
字号:
read_numl+='0';
clr_at_rxbuf();
tab_sp=at_cmd_cmgr;
write_at_cmd(); //发送CMGR,读短信
if((read_numh!='0')&&(read_numh!='1')) read_numh='0';
//if((read_numl<'1')||(read_numl>'9')) read_numl='1';
if(read_numh>'0')
{
uart.SendByte(read_numh); //numh
}
uart.SendByte(read_numl);
write_at_crlf();//
for(j=0;j<20;j++)
{
wait_for_ack(25); //等待回复帧
if(rec_count>0) break;
}
//len=check_cmgr();
len=check_cmgr_pdu();
return len;
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 函数名称: SaveSemIP(void)
// 功能描述: 保存短信发过来的IP地址,要进行ASICC到HEX的转换
// 输 入: //"218.017.105.150",6000转化成6个数据,符合协议
//
// 输 出:
//
// 全局变量: 无
// 调用模块:
// 调用类:
//创 建 人: 杨虎岳
//日 期: 2006年6月7日
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 内 容:
//------------------------------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/*void CGtm900::SaveSemIP(void)
{
//"218.017.105.150",6000
INT8U i=1,j=0,l=0,k=0,m=0;
INT8U ipport[6];
INT8U temp;
INT16U temp16;
CParameterTianJin ip;
//前三个IP地址
for(m=0;m<3;m++)
{
//j=i;
k=0;
temp=0;
while((ip_addr[i++]!='.')&&(i<ip_addr_count)) k++;
j=i-2;
temp+=ip_addr[j-(--k)]-'0';
while(k>0)
{
temp*=10;
temp+=ip_addr[j-(--k)]-'0';
}
ipport[l++]=temp;
}
//第四个IP地址
k=0;
temp=0;
while((ip_addr[i]!='"')&&(i<ip_addr_count))
{
k++;
i++;
}
j=i-2;
temp+=ip_addr[j-(--k)]-'0';
while(k>0)
{
temp*=10;
temp+=ip_addr[j-(--k)]-'0';
}
ipport[l++]=temp;
//端口号
i+=1;
k=ip_addr_count-i;
j=ip_addr_count-1;
temp16=0;
temp16+=ip_addr[j-(--k)]-'0';
while(k>0)
{
temp16*=10;
temp16+=ip_addr[j-(--k)]-'0';
}
ipport[l++]=temp16;
ipport[l++]=temp16>>8;
ip. Write(PAP0F3ADD,ipport,6);
}*/
//---------------------------------
//关闭回显:连续5次不正常,提示
//---------------------------------
INT8U CGtm900:: write_at_ate0()//发送ATE0,关闭回显
{
INT8U i;
clr_at_rxbuf(); //清除接收at信息
tab_sp=at_cmd_ate0;
write_at_cmd(); //发送ATE0,关闭回显
write_at_crlf(); //发送<CR><LF>
for(i=0;i<40;i++)
{
wait_for_ack(5); //等待回复帧
if(rec_count>0) break;
}
check_OK(); //是否是OK,产生b_ackOK
if(!b_ackOK)
{
get_fse(0x0a,2,0x0a,3);//从第1个换行符,到第2个换行符
if(char_end>char_sta)
{if((rs232_data[char_sta]=='O')&&(rs232_data[char_sta+1]=='K'))
b_ackOK=1;
}
}
return b_ackOK;
}
//---------------------------------
//信号强度:连续5次不正常,提示
//---------------------------------
INT8U CGtm900:: write_at_csq()//信号强度
{
INT8U signsen=0;
INT8U i;
clr_at_rxbuf(); //清除接收at信息
tab_sp=at_cmd_csq;
write_at_cmd(); //发送ATE0,关闭回显
write_at_crlf(); //发送<CR><LF>
for(i=0;i<50;i++)
{
wait_for_ack(25); //等待回复帧
if(rec_count>0x10) break;
}
//if(rec_count<15)
// wait_for_ack(200);
if(rec_count>0)
signsen=check_csq();//是否返回+CSQ:99,99
return signsen;
}
//---------------------------------
//设置短信模式:连续5次不正常,提示
//---------------------------------
void CGtm900:: write_at_cmgf()//设置短信模式
{
INT8U i;
clr_at_rxbuf(); //清除接收at信息
tab_sp=at_cmd_cmgf;
write_at_cmd(); //发送CMGF,txt模式
write_at_crlf(); //发送<CR><LF>
for(i=0;i<10;i++)
{
if(rec_count>0) break;
wait_for_ack(25); //等待回复帧
}
//if(rec_count<14) wait_for_ack(200); //等待回复帧
check_OK(); //是否是OK,产生b_ackOK
}
//---------------------------------
//设置新短信提示:连续5次不正常,提示
//---------------------------------
void CGtm900::write_at_cnmi()//设置新短信提示
{ INT8U i;
clr_at_rxbuf(); //清除接收at信息
tab_sp=at_cmd_cnmi;
write_at_cmd(); //发送CNMI,新短信提示
write_at_crlf(); //发送<CR><LF>
for(i=0;i<10;i++)
{
if(rec_count>0) break;
wait_for_ack(25); //等待回复帧
}
//if(rec_count<14) wait_for_ack(200); //等待回复帧
check_OK(); //是否是OK,产生b_ackOK
}
//---------------------------------
//初始化PDP,击活参数,正常返回OK
//---------------------------------
void CGtm900:: write_at_cgd()//初始化PDP,配置APN,击活参数,正常返回OK
{
INT8U i;
INT8U apnbuf[20];
//INT8U useapnbuf[20];
//const cmnetsm[5]={67,77,78,69,84}
// const tjout[3]={46,84,74}
// const cmnetbg[5]={99,109,110,101,116};
ip.Read(PAP0F3ADD+24,16, apnbuf);
i=0;
while(apnbuf[i]!=0x00&&i<16)
i++;
/* if(endfg==FALSE)
{ while(i<16)
{
if(apnbuf[i]==cmnetsm[0]) break;
i++;
}
j=0; //
while (j<5&&i<16)
{
if(apnbuf[i]!=cmnetsm[j])
{
break;
}
i++;
j++;
}
if(j>4) endfg=TRUE;
}
if(endfg==FALSE)
{ while(i<16)
{
if(apnbuf[i]==cmnetbg[0]) break;
i++;
}
j=0; //
while (j<5&&i<16)
{
if(apnbuf[i]!=cmnetbg[j])
{
break;
}
i++;
j++;
}
if(j>4) endfg=TRUE;
}
if(endfg==FALSE)
{ while(i<16)
{
if(apnbuf[i]==tjout[0]) break;
i++;
}
j=0; //
while (j<5&&i<16)
{
if(apnbuf[i]!=tjout[j])
{
break;
}
i++;
j++;
}
if(j>1) endfg=TRUE;
}
*/
clr_at_rxbuf(); //清除接收at信息
tab_sp=at_cmd_cgd;
write_at_cmd(); //at+cgdcont=1,"ip","cmnet"
uart.SendByte('"');
uart.SendNByte(apnbuf,i);
uart.SendByte('"');
//'"','C','M','N','E','T','"'
write_at_crlf(); //发送<CR><LF>
for(i=0;i<60;i++)
{
wait_for_ack(25); //等待回复帧
if(rec_count>5) break;
} //等待回复帧
check_OK(); //是否是OK,产生b_ackOK
}
//选择HEX字符节
void CGtm900::write_at_cscs(void)
{
clr_at_rxbuf(); //清除接收at信息
tab_sp=at_cmd_cscs;
write_at_cmd(); //at+cgdcont=1,"ip","cmnet"
write_at_crlf(); //发送<CR><LF>
wait_for_ack(50); //等待回复帧
check_OK(); //是否是OK,产生b_ackOK
}
//---------------------------------
//初始化TCPIP,正常返回OK
//---------------------------------
void CGtm900::write_at_etcp()//初始化TCPIP,正常返回OK
{
INT8U i;
clr_at_rxbuf(); //清除接收at信息
tab_sp=at_cmd_etcp;
write_at_cmd(); //at%etcpip
write_at_crlf(); //发送<CR><LF>
for(i=0;i<100;i++)//要等5秒钟才行。
{
wait_for_ack(25); //等待回复帧3-60秒不等
if(rec_count>5)
{
check_OK();
break;
}
}
//是否是OK,产生b_ackOK
}
//---------------------------------
//设置用户数据接口,正常返回OK
//---------------------------------
void CGtm900::write_at_iomode()//设置用户数据接口,正常返回OK
{ INT8U i;
clr_at_rxbuf(); //清除接收at信息
tab_sp=at_cmd_iomode;
write_at_cmd(); //at%iomode=0
write_at_crlf(); //发送<CR><LF>
for(i=0;i<5;i++)
{
wait_for_ack(25); //等待回复帧
if(rec_count>5)
{ check_OK(); //是否是OK,产生b_ackOK
break;
}
}
}
//----------------------------------------------
//写at命令子程序
//----------------------------------------------
void CGtm900:: write_at_cmd()
{
//C4851 uart1;
do
{
uart.SendByte(*tab_sp);
//uart1.SendByte485(*tab_sp);//555555555555
tab_sp++; //sp指向tab下一个值
}
while(*tab_sp!=0x0);
}
//--------------------------------------
void CGtm900::write_at_crlf() //写回车换行符
{
uart.SendByte(0x0d); //<cr>
uart.SendByte(0x0a); //<lf>
}
void CGtm900::clr_at_rxbuf(void)
{
uart.ClrRcvBuf();
rec_count=0;
}
//--------------------------------------
//等待回复帧
//--------------------------------------
void CGtm900::wait_for_ack(INT8U t)//10MS
{
INT8U temp;
INT8U i;
//C4851 m485;
//WatchDog_Task();
for(i=0;i<t;i++)
{
//WatchDog_Task();
OSTimeDly(OS_TICKS_PER_SEC/100);//指延时多长时间开始接收数据。是帖间的延时
}
// while(!rec_count)
//{
while(uart.ReadBuf(2,&temp)&&rec_count<Uart0BufRcvMaxData)
{
MokRcvfg.clr();
rs232_data[rec_count++]=temp;
GRestGprsFg=0x00;
GMoudleRstcnt=0x00;
if(rec_count>=MaxTempBufLen) break;
}
MokRcvfg.set();
//}
if(rec_count==0x00) GRestGprsFg++;
//m485.SendNByte485(rs232_data,rec_count);
}
//--------------------------------------
//处理帧数据(获得需处理字符起始位,结束及有效位位数)
//输入:起始字符,起始字符位置,结束字符,结束字符位置
//取出需要信息的起始/结束/个数
void CGtm900:: get_fse(INT8U c_sta,INT8U s_num,INT8U c_end,INT8U e_num)
{
INT16U i,cs_num,ce_num;//变量长度前后一定要一致
char_sta=0;//起始位清零
char_end=0;//起始位清零
cs_num=0x0;//记录第几个起始符
ce_num=0x0;//记录第几个结束符
char_count=0;//有效位计数器清零
for(i=0;i<rec_count;i++)
{
if(char_sta!=0x0)
{
char_count+=1;//开始计数
}
/////////////////////////////////////
if(rs232_data[i]==c_sta) //是起始字符
{
cs_num+=1;
if(cs_num==s_num)
{
char_sta=i+1;//记录起始位置
}
}
/////////////////////////////////////
if(rs232_data[i]==c_end) //是结束字符
{
ce_num+=1;
if(ce_num==e_num)
{
char_end=i-1;//记录结束位置
}
}
}
}
//返回是否是OK
void CGtm900::check_OK()
{
b_ackOK=0;
if(rec_count)
{
get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
if((rs232_data[char_sta]=='O')&&(rs232_data[char_sta+1]=='K'))
b_ackOK=1;
}
}
void CGtm900::check_error()//返回是否是ERROR:
{
INT8U i;
b_ackOK=0;
if(rec_count)
{
get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
b_ackOK=1;
i=0; //
do
{
if(rs232_data[char_sta+i]!=at_ack_errn[i])
b_ackOK=0;
i+=1;
}while (at_ack_errn[i]!=0);
}
}
//是否是准备就绪
void CGtm900::check_cpas() //
{
INT8U i;
b_ackOK=0;
if(rec_count)
{
get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
b_ackOK=1;
i=0; //
do
{
if(rs232_data[char_sta+i]!=at_ack_cpas[i])
b_ackOK=0;
i+=1;
}while (at_ack_cpas[i]!=0);
}
}
//是否是有短消息,返回短信条数
INT8U CGtm900::check_cpms() //
{
INT8U i;
if(rec_count)
{
get_fse(0x0a,1,0x0a,2);//从第1个换行符,到第2个换行符
i=0; //
do
{
if(rs232_data[char_sta+i]!=at_ack_cpms[i])
{
GNoteOkFalg=0;
return FALSE;
}
i+=1;
}while (at_ack_cpms[i]!=0);
i=0;
get_fse(',',0x01,',',0x02);
if(char_sta==char_end)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -