51单片机和GSMtc35模块通讯问题,急求!

2019-07-16 03:44发布

用串口调试助手测试TC35,收发都正常。
但是用51单片机发送AT指令给TC35后,TC35,51收不到任何信息,无法进入中断。
程序应该没有问题,硬件上也没有问题,但就是收发布成功,代码见附件。
急求啊!!!! qq 77323436

部分代码
TC35部分:
#include "common.h"
char RxBuf[RxBuf_N]={0};                                        //定义串口接收数据缓冲区
uchar RxPoint;                                                                //Rx缓冲区指针
bit flag=0;                                                                        //用来等待发送信息结束后,接收TC35响应的标志
uchar PhoneNum[15]="+8613477144122";                //手机号码
const uchar *MsContent="Attention Please!";                //短信内容
sbit IGT=P1^1;
//查找字符串,在s中查找t
//返 回 值: s_temp(t在s中的位置)成功 0失败
char *LookFor_Str(uchar *s, uchar *t)
{
        uchar    *s_temp;      
        uchar    *m_temp;      
        uchar    *t_temp;     
        if (s == 0 ||t == 0) return 0;
        for (s_temp = s; *s_temp != ''; s_temp++)
        {
                m_temp = s_temp;
                for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);
                if (*t_temp == '') return s_temp;
        }
        return 0;
}
void start_tc35()
{
        IGT=0;
        delay_ms(150);
        IGT=1;
        delay_ms(250);
        IGT=0;                       
        delay_ms(150);
        IGT=1;
        delay_ms(150);
}
/*
void start_tc35()
{
          IGT=0;
        delay_ms(1000);
        IGT=1;
        delay_ms(1000);
} */
//发送"AT"联机指令,测试是否连接正确
void Send_AT(void)
{
        uchar *p;
        uchar i=10;
        while(i--)                                                                //测试10次,在某一次成功就退出
        {
                RxPoint=0;                                                        //buffer指针清0                                                                       
                SendString("AT ");                                        //发送AT回车
                Put_Str(3,0,"sending over");                                       
                ES=1;                                                                //必须中断 串口中断应许 等待应答"OK"                                                                                                               
            delay_ms(100);                                                //等待接受数据完成
                while(flag==0);
                flag=0;
                delay_ms(300);
            p=LookFor_Str(RxBuf,"OK");                   //接收到的数据存在RsBuf
                if(p!=0)                                                         //接收到"OK"
                {
                        PutStr(1,0,"GSM ready");
                        delay_ms(1000);
                        break;
                }
                PutStr(1,0,"GSM error");
                delay_ms(500);
        }
}

//设置短信模式 1:text模式 0:PDU模式
//串口发送数组命令到TC35,AT+CMGF=1
void Set_Mode(uchar mode)
{
          uchar *p,i=10;
        while(i--)                                                                //测试10次,在某一次成功就退出
        {
                RxPoint=0;                                                        //buffer指针清0
                if(mode) SendString("AT+CMGF=1 ");                //设置短消息模式  1 TEXT
                else           SendString("AT+CMGF=0 ");        //设置短消息模式  0 PDU模式               
            ES=1;                                                            //必须中断 串口中断应许 等待应答"OK"
            delay_ms(300);                                                //等待接受数据完成
                while(flag==0);
                flag=0;
                delay_ms(300);
                p=LookFor_Str(RxBuf,"OK");                   //接收到的数据存在RsBuf
            if(p!=0)                                                         //接收到"OK"
                {
                        PutStr(1,0,"短信模式:text");
                        delay_ms(1000);
                        break;
                }
                PutStr(1,0,"短信模式设置失败");
                delay_ms(500);
        }
}

//发送号码
void Send_PhoneNum(uchar *str)       
{
        uchar i=0;
        while(*str)                                                               
        {
                SendASC(*str) ;
                str++;
                i++;
                if(i==14) break;                                        //只发送14个
        }
}

//发送TEXT短信 AT+CMGS="+8613477144122"
//*dialnum 目的号码    *text短信内容
//返回:1 发送成功  0 发送失败               
uchar TransmitText(uchar *dialnum,uchar *text)  
{
        uchar i=10,j=10;
        uchar *p;
        while(i--)
        {
                RxPoint=0;                                                                  //buffer指针清0
                SendString("AT+CMGS=");                                        //信息发送指令 AT+CMGS="+8613477144122"
                SendASC('"');
                Send_PhoneNum(dialnum);                                 //号码
                SendASC('"');
                SendASC(' ');                                                        //回车
                while(flag==0);
                flag=0;
                delay_ms(300);
                p=LookFor_Str(RxBuf,">");                                //">"
                if(p!=0)                                                                        //如果接受到 >  发送text
                {       
                        RxPoint=0;                                                                  //清空接收缓冲区
                        SendString(text);                                                //发送短信内容
                        SendString("x1a ");                                        //'x1a'结束符(相当CTRL+Z) ' '回车符                                       
                        while(flag==0);
                        flag=0;
                        delay_ms(5000);                                                //这里要延时足够长时间,否则会读取错误
                        p=LookFor_Str(RxBuf,"OK");                        //查找OK
                        if(p!=0)                                                        //发送成功
                        {
                                PutStr(2,0,"To: ");
                                PutStr(2,2,dialnum+3);
                                PutStr(3,0,"发送成功 ^_^");
                                return 1;
                        }
                        else
                        {
                                PutStr(2,0,"发送失败");
                                delay_ms(1000);
                                PutStr(2,0,"正在重发");
                        }
                }
        }
        PutStr(2,0,"多次重发失败");
        return 0;
}

//完整的短信发送函数       
//dialnum:手机号码 text:短信内容
void Send_Message(uchar *dialnum,uchar *text)
{

        Send_AT();                                                        //发送AT

        Set_Mode(1);                                                //设置短信模式:text

        TransmitText(dialnum,text);        //设置
}


通讯部分代码:
#ifndef _USART_INCLUDED_
#define _USART_INCLUDED_
#include "common.h"
//延时函数ms(condition:11.0592M HSE)
uchar         RxIn=0;//串口入口
void delay_ms(unsigned int time)
{
        unsigned char tres;
        for(;time>0;time--)
        {
                tres=150;
                while(tres--);
        }
}   
void USART_Init()
{
        //ES=0;
        SCON=0x50;   //UART方式1:8位UART;  :允许接收
        PCON=0x00;   //SMOD=0:波特率不加倍
        TMOD=0x20;   //T1方式2,用于UART波特率
        TH1=0xFD;
        TL1=0xFD;   //UART波特率设置:9600
        TR1=1;
    //ES=1;
        EA=1;
}

/*void SendASC(uchar dat)                                                                                                                  
{
        TI=0;
        ES=0;
        if(dat==' '){ES=1;}    //收到回车 开ES       
        SBUF=dat;      
        while(TI==0);{TI=0;}
}*/
void SendASC(uchar d)
{
        SBUF=d;
        while(!TI);
        TI=0;
       
}

void SendString(uchar *str)       
{
        //TI=0;
        while(*str)
        {
                SendASC(*str) ;
                str++;
        //        delay_ms(100);
        }
}


//  通讯中断接收程序   中断函数无返回值
void USART_Interrupt(void)  interrupt 4          //放在这里 和放在main()里面是一样的
{
        EA=0;
        if(RI)
        flag=1;
        if(TI)
        Put_Str(4,0,"interrupt in");
        {
                Put_Str(3,0," RI interrupt");
                //delay_ms(1000);
                RI=0;
                if(RxPoint<RxBuf_N)
                {
                        RxBuf[RxPoint++]=SBUF;        //write                                
                   }
                RI=0;
        }
        EA=1;
}

#endif     


程序部分[new].rar 下载积分: 积分 -1 分
52.41 KB, 下载次数: 77, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。