51单片机控制Q2406B收发短信

seairensheng   2008-10-29 22:00 楼主
最近在用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了
请问哪个大侠知道是什么原因?

回复评论 (1)

这个程序在MC39I上实现了,但是移植到Q2406B的时候就不行了
点赞  2008-10-29 22:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复