📄 sms232.c
字号:
uchar htod(uchar hnumber)
{
uchar i;
switch(hnumber)
{
case 'A':
i=10;
break;
case 'B':
i=11;
break;
case 'C':
i=12;
break;
case 'D':
i=13;
break;
case 'E':
i=14;
break;
case 'F':
i=15;
break;
default:
i=hnumber-0x30;
break;
}
return(i);
}
bit sendmsg_touser(void)
{
uint i,j;
uchar a;
uchar msgtype;
uchar mymsg[4];
i=MOBILE_BASE_ADDRESS+5;
j=TEMP_BASE_ADDRESS;
do{
dog();
if(i>=MAX_SRAM_ADDRESS)return(1);
if(XBYTE[i-5]!='+') {i=i+1;continue;}
if(XBYTE[i-4]!='C') {i=i+2;continue;}
if(XBYTE[i-3]!='M') {i=i+3;continue;}
if(XBYTE[i-2]!='T') {i=i+4;continue;}
if(XBYTE[i-1]!=':') {i=i+5;continue;}
break;
}while(1);
while(XBYTE[i]!='\"')
{
dog();
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
}
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
while(XBYTE[i]!='\"') //把手机号码存到临时缓冲区
{
dog();
if(j>=MOBILE_BASE_ADDRESS)return(1);
XBYTE[j]=XBYTE[i];
i++;
j++;
if(i>=MAX_SRAM_ADDRESS)return(1);
}
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
for(a=0;a<2;a++)
{
while(XBYTE[i]!='\"')
{
dog();
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
}
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
}
for(a=0;a<4;a++)
{
while(XBYTE[i]!=',')
{
dog();
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
}
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
}
msgtype=XBYTE[i];
if(j>=MOBILE_BASE_ADDRESS)return(1);
XBYTE[j]=','; //把,存到临时缓冲区
j++;
while(XBYTE[i]!='\n')
{
dog();
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
}
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
if(msgtype=='0')
{
while(XBYTE[i]!='\r') //把信息内容存到临时缓冲区
{
dog();
if(j>=MOBILE_BASE_ADDRESS)return(1);
XBYTE[j]=XBYTE[i];
i++;
j++;
if(i>=MAX_SRAM_ADDRESS)return(1);
}
}
else if(msgtype=='8')
{
a=0;
while(XBYTE[i]!='\r') //把信息内容存到临时缓冲区
{
dog();
mymsg[a]=XBYTE[i];
i++;
if(i>=MAX_SRAM_ADDRESS)return(1);
a++;
if(a==4)
{
a=0;
mymsg[2]=htod(mymsg[2]);
mymsg[3]=htod(mymsg[3]);
if(j>=MOBILE_BASE_ADDRESS)return(1);
XBYTE[j]=mymsg[2]*16+mymsg[3];
j++;
}
}
}
ComOutChar0('\n'); //发送启始字符LF
ComOutChar0('0'); //发送识别符,0(ASCII)表示向用户发的是信息
for(i=TEMP_BASE_ADDRESS;i<j;i++)
{
ComOutChar0(XBYTE[i]);
}
ComOutChar0('\r'); //发送结束字符CR
return(0);
}
/**************************************************
串口0中断
**************************************************/
void Int_serial0() interrupt 4 using 1
{
if(RI)
{
RI=0;
if((user_command==0) && (SBUF=='\n'))
{
seri0_rnum=USER_BASE_ADDRESS;
XBYTE[seri0_rnum]=SBUF;
do{
while(RI==0);
RI=0;
seri0_rnum++;
if(seri0_rnum>=TEMP_BASE_ADDRESS){do{;}while(1);}
XBYTE[seri0_rnum]=SBUF;
}while(XBYTE[seri0_rnum]!='\r');
user_command=XBYTE[USER_BASE_ADDRESS+1];
}
}
}
/**************************************************
串口1中断
**************************************************/
void Int_serial1() interrupt 7 using 2
{
if(RI_1)
{
RI_1=0;
if(seri1_rnum>=MAX_SRAM_ADDRESS){seri1_rnum=MOBILE_BASE_ADDRESS;goto serial1_end;}
XBYTE[seri1_rnum]=SBUF1;
seri1_rnum++;
if(seri1_rnum>=(MOBILE_BASE_ADDRESS+2))
{
if(XBYTE[seri1_rnum-2]!='\r')goto serial1_begin;
if(XBYTE[seri1_rnum-1]!='\n')goto serial1_begin;
seri1_rnum=MOBILE_BASE_ADDRESS;
goto serial1_end;
}
serial1_begin:
switch(seri1_rmode)
{
case 0:
if(r_msg==0)
{
if(seri1_rnum>=(MOBILE_BASE_ADDRESS+5))
{
if(XBYTE[seri1_rnum-5]!='+') goto serial1_end;
if(XBYTE[seri1_rnum-4]!='C') goto serial1_end;
if(XBYTE[seri1_rnum-3]!='M') goto serial1_end;
if(XBYTE[seri1_rnum-2]!='T') goto serial1_end;
if(XBYTE[seri1_rnum-1]!=':') goto serial1_end;
MOBILELED=0;
crlf_number=0;
do{
while(RI_1==0);
RI_1=0;
if(seri1_rnum>=MAX_SRAM_ADDRESS){seri1_rnum=MOBILE_BASE_ADDRESS;goto serial1_end;}
XBYTE[seri1_rnum]=SBUF1;
seri1_rnum++;
if(XBYTE[seri1_rnum-2]!='\r')continue;
if(XBYTE[seri1_rnum-1]!='\n')continue;
crlf_number++;
}while(crlf_number<2);
r_msg=1;
seri1_rnum=MOBILE_BASE_ADDRESS;
MOBILELED=1;
}
}
break;
case 1:
if(seri1_rend)
{
if(seri1_rnum>=(MOBILE_BASE_ADDRESS+2))
{
if(XBYTE[seri1_rnum-2]!='O') goto serial1_end;
if(XBYTE[seri1_rnum-1]!='K') goto serial1_end;
MOBILELED=0;
do{
while(RI_1==0);
RI_1=0;
if(seri1_rnum>=MAX_SRAM_ADDRESS){seri1_rnum=MOBILE_BASE_ADDRESS;goto serial1_end;}
XBYTE[seri1_rnum]=SBUF1;
seri1_rnum++;
if(XBYTE[seri1_rnum-2]!='\r')continue;
if(XBYTE[seri1_rnum-1]!='\n')continue;
break;
}while(1);
seri1_rend=0;
seri1_rnum=MOBILE_BASE_ADDRESS;
MOBILELED=1;
}
}
break;
case 2:
if(seri1_rend)
{
MOBILELED=0;
if(seri1_rnum>=(MOBILE_BASE_ADDRESS+2))
{
if(XBYTE[seri1_rnum-2]!='>') goto serial1_end;
if(XBYTE[seri1_rnum-1]!=SPACE)goto serial1_end;
seri1_rend=0;
seri1_rnum=MOBILE_BASE_ADDRESS;
MOBILELED=1;
}
}
break;
case 3:
if(seri1_rend)
{
MOBILELED=0;
if(seri1_rnum>=(MOBILE_BASE_ADDRESS+2))
{
if(XBYTE[seri1_rnum-2]!='O') goto msgcancle1;
if(XBYTE[seri1_rnum-1]!='K') goto msgcancle1;
do{
while(RI_1==0);
RI_1=0;
if(seri1_rnum>=MAX_SRAM_ADDRESS){seri1_rnum=MOBILE_BASE_ADDRESS;goto serial1_end;}
XBYTE[seri1_rnum]=SBUF1;
seri1_rnum++;
if(XBYTE[seri1_rnum-2]!='\r')continue;
if(XBYTE[seri1_rnum-1]!='\n')continue;
break;
}while(1);
msgready_flag=1;
goto msgcancle2;
msgcancle1:if(XBYTE[seri1_rnum-2]!='>') goto serial1_end;
if(XBYTE[seri1_rnum-1]!=SPACE)goto serial1_end;
msgready_flag=0;
msgcancle2:seri1_rend=0;
seri1_rnum=MOBILE_BASE_ADDRESS;
MOBILELED=1;
}
}
break;
}
serial1_end:;
}
}
/**************************************************
定时器0中断
**************************************************/
void second_int(void) interrupt 1 using 3
{
TH0=0x4b;
TL0=0xfd; /*timer0 is 50ms at 11.0592MHZ*/
time_1s++;
if(time_1s>=delaytime) /*delaytime=400:20s*/
{
time_1s=0;
timeout=1;
}
}
void start(void)
{
seri1_rmode=1;
seri1_rend=0;
r_msg=0;
crlf_number=0;
seri1_rnum=MOBILE_BASE_ADDRESS; //指向GSM模块接收缓冲区(W77E58内部SRAM)基地址,
seri0_rnum=USER_BASE_ADDRESS; //指向用户接收缓冲区(W77E58内部SRAM)基地址,
user_command=0;
}
main()
{
USERLED=0;
msec(20000);
start();
init_w77e58();
init_interrupt();
while(init_Mobile());
USERLED=1;
do{
dog();
POWERLED=0;
seri1_rmode=0;
if(r_msg)
{
USERLED=0;
if(sendmsg_touser()){;}
r_msg=0;
USERLED=1;
}
if(user_command)
{
USERLED=0;
if(sendmsg())senderr_touser();
else sendok_touser();
user_command=0;
USERLED=1;
}
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -