|
本人想利用单片机控制gsm模块通过串口中断接收发送端发过来的数据,下面是自己写的串口中断接收程序
void uart(void) interrupt 4
{
unsigned char tmp;
unsigned int i,j;
if(RI==1)
{
tmp=SBUF;
if(tmp=='+') //“+”开头?
{
mode=1;
}
else if(mode==1)
{
//命令种类判断
cmd[byte_count]=tmp; //接收字符放入类型缓存
if(byte_count>=4)
{ //如果类型数据接收完毕,判断类型
if(cmd[0]=='C') //头是“+CMTI:”?有新短信到来的标志
{
if(cmd[1]=='M')
{
if(cmd[2]=='T')
{
if(cmd[3]=='I')
{
if(cmd[4]==':')
{
mode=3;
byte_count=0;
}
}
}
else if(cmd[2]=='G') //头是“+CMGR:”读短信
{
if(cmd[3]=='R')
{
if(cmd[4]==':')
{
mode=2;
byte_count=0;
i=0;
j=0;
}
}
}
}
}
}
}
else if(mode==2) //接收数据处理
{
if(byte_count>37&&byte_count<76) //38字节开始才是数据,丢弃前面的数据
{
if(tmp==0x30) tmp='0';
else if(tmp==0x31) tmp='1';
else if(tmp==0x32) tmp='2';
else if(tmp==0x33) tmp='3';
else if(tmp==0x34) tmp='4';
else if(tmp==0x35) tmp='5';
else if(tmp==0x36) tmp='6';
else if(tmp==0x37) tmp='7';
else if(tmp==0x38) tmp='8';
else if(tmp==0x39) tmp='9';
else if(tmp==0x2E) tmp='.';
if(i<9) //纬度数据接收
{
WD=tmp;
i++;
}
else if(j<10) //经度数据接收
{
JD[j]=tmp;
j++;
}
}
}
else if(mode==3) //是“+CMTI”开头吗?是,提取接收的短信号
{
if(byte_count==6)
msnum=tmp;
}
byte_count++; //接收数位加1
}
RI=0;
}
但是经开发板调试,没用接收到数据,自己是菜鸟,希望熟悉AT指令牛人指点指点。 |
|