最近在用51单片机控制Q2406B收发短信
实现了一下几个函数:
功 能:设置传输速率
设置方法:AT+ipr=9600
**********************************************************************/
Set_Speed(void)
{
SELInt_off();
Cls_Rebuf();
Ser_TXDstring(TC_HEAD,3);//发送AT+
Ser_TXDstring(TC_IPR,8);//ipr
gsm_Over();//回车换行
SELInt_on();
P2=0XF1;
while(Rev_count<18);
P2=0X02;
Rev_count=0;
Excrescent();
for(i=15+xx;i<17+xx;i++)
{
temp[i-15-xx]=Rev_Buf;
}
if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;
}
/**********************************************************************
功 能:设置短消息格式,0为PDU ,1为TEXT
设置方法:向模块发送"AT+CMGF=1(0)",成功则返回OK
**********************************************************************/
MES_Mode(unsigned char mode)
{
SELInt_off();
Cls_Rebuf();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CMGF,5);
Ser_TxDchar(mode+0x30);//输入的mode参数需要转换为ASCII码
gsm_Over();//回车换行
SELInt_on();
while(Rev_count<16);
Rev_count=0;
Excrescent();
for(i=13+xx;i<15+xx;i++)
{
temp[i-13-xx]=Rev_Buf;
}
if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;
}
/**********************************************************************
功 能:设置信息提醒
发送指令:AT+CNMI=2,1
**********************************************************************/
Auto_Prompt(void)
{
SELInt_off();
Cls_Rebuf();
Ser_TXDstring(TC_HEAD,3);//发送AT+
Ser_TXDstring(TC_CNMI,8);
gsm_Over();//回车换行
SELInt_on();
while(Rev_count<18);
Rev_count=0;
Excrescent();
for(i=15+xx;i<17+xx;i++)
{
temp[i-15-xx]=Rev_Buf;
}
if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;
}
以上几个函数单独运行的时候,均返回真,但是连起来的时候:
void INIT_GSM(void)//MC39i初始化
{
if(Set_Speed())//设置传输速率 {
{
if(MES_Mode(1))//设置短消息格式,0为PDU ,1为TEXT
{
if(Store_Location())//选择短信存储载体
{
if(Auto_Prompt())//设置信息提醒
led=0;
}
}
}
Cls_Rebuf();
}
执行到第二个函数MES_Mode(1)就停止了 ,查过原因是中断函数了接收缓冲区的指针Rev_count的数值不对,导致执行到 这个语句的时候while(Rev_count<16);
程序停在那里了 。
另外 还有一个函数实现不了
/**********************************************************************
功 能:选择短信存储载体
发送指令:AT+CPMS="SM","SM"
**********************************************************************/
Store_Location(void)
{
Cls_Rebuf();
SELInt_off();
Ser_TXDstring(TC_HEAD,3);//发送AT+
Ser_TXDstring(TC_CPMS,5);//发送CPMS
Ser_TxDchar(0x22);//发送双引号
Ser_TXDstring(TC_SM,2);//发送SM
Ser_TxDchar(0x22);//发送双引号
Ser_TxDchar(0x2C);//发送逗号
Ser_TxDchar(0x22);//发送双引号
Ser_TXDstring(TC_SM,2);//发送SM
Ser_TxDchar(0x22);//发送双引号
gsm_Over();//回车换行
SELInt_on();
while(Rev_count<46);
Rev_count=0;
Excrescent();
for(i=38+xx;i<40+xx;i++)
{
temp[i-38-xx]=Rev_Buf;
}
if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;
}
也是执行到while(Rev_count<41);就停在那里了
检查过,原因是接收缓冲区的指针Rev_count只有33,正常情况下,Q2406B模块应该会返回46个字节的数据的。
我的中断函数是:
void Ser_Rev() interrupt 4 using 0//中断接收
{
SELInt_off();
if(RI==1)
RI=0;
Rev_Buf[Rev_count++]=SBUF;
if(Rev_count==60)
Rev_count=0;
SELInt_on();
}
我把 接收缓冲区的大小设置为60了
请问哪个大侠知道是什么原因?
这个程序在MC39I上实现了,但是移植到Q2406B的时候就不行了