找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1859|回复: 0
打印 上一主题 下一主题
收起左侧

sim800A模块收不到消息

[复制链接]
跳转到指定楼层
楼主
ID:884420 发表于 2021-3-22 17:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬帮忙看看这个程序哪里有问题,我用串口调试助手可以发出消息,但是用了这个程序就收不到消息。

#include "config.h"
#include "string.h"
#include "delay.h"
#include "uart.h"


#define Buf1_Max 200                                           //串口2缓存长度
/*************        本地常量声明        **************/
sbit RUNING_LED = P3^2;                                        //运行指示灯

static unsigned char *content="0891683110401305F00011000D91689158222612F60008AA0C80014EBA672A670D836F";//发送短信内容
/************************短信内容解析**************************************/
/*08913181022026F90011000D919158222612F60008AA0C80014EBA672A670D836F
   //短信中心号(倒序)      目标手机(倒序)         短信内容(测试已经完成)
     8613800756500F          8613798985989F         
0891 683108706505F0 11000D91 683197985889F9 0008AA0C 6D4B8BD55DF27ECF5B8C6210
0891 683110401305F0 11000D91 689158222612F6 0008AA0C 80014EBA672A670D836F         
*/
/*************  本地变量声明        **************/

xdata u8 Uart1_Buf[Buf1_Max];

u8 Times=0,First_Int = 0,shijian=0;

bdata u8 Flag;//定时器标志位
sbit Timer0_start =Flag^0;        //定时器0延时启动计数器



/*************        本地函数声明        **************/
void GPIO_config(void); //端口初始化配置
void Timer0Init(void);  //定时器0初始化
void CLR_Buf1(void);    //清除串口2接收缓存
u8 Find(u8 *a);         //查找字符串
void Second_AT_Command(u8 *b,u8 *a,u8 wait_time); //发送AT指令函数
void Set_Pdu_Mode(void);//设置短信模式PDU
void Wait_CREG(void);   //查询等待模块注册成功
void Send_Pdu_Sms(void);//发送一条中文短信
/*************  外部函数和变量声明*****************/




/*******************************************************************************
* 函数名 : main
* 描述   : 主函数
* 输入   :
* 输出   :
* 返回   :
* 注意   : 串口波特率是9600,GPRS模块默认波特率是115200,需要自己通过串口助手修改
                                   为9600方可使用。
*******************************************************************************/
void main(void)
{
        Timer0Init();  //初始化定时器0
        GPIO_config();
        EA=1;        //开总中断
        Uart1Init();    //初始化串口9600
        Wait_CREG();    //查询等待模块注册成功
        Set_Pdu_Mode();//设置短信为PDU模式
        Send_Pdu_Sms();//发送一条短消息
        while(1)
        {
                ;
        }
       
}

/*******************************************************************************
* 函数名 : Uart1
* 描述   : 串口1中断服务入口函数
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Uart1() interrupt 4
{
    if (RI)
    {
      RI = 0;                 //清除RI位
                        Uart1_Buf[First_Int] = SBUF;            //将接收到的字符串存到缓存中
                        First_Int++;                                        //缓存指针向后移动
                        if(First_Int > Buf1_Max)                       //如果缓存满,将缓存指针指向缓存的首地址
                        {
                                First_Int = 0;
                        }
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
    }
}
/*******************************************************************************
* 函数名 : Timer0_ISR
* 描述   : 定时器0中断服务入口函数,20ms中断一次
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Timer0_ISR() interrupt 1
{
        static u8 Time_count=0;
  TL0 = 0x00;                  //重置定时器初值
        TH0 = 0xB8;                  //重置定时器初值       
        TR0=0;//关定时器
        Time_count++;
        if(Time_count>=50)
        {
                Time_count = 0;
                RUNING_LED =~RUNING_LED;
        }
        if(count_20ms) //20ms延时计数器
                count_20ms--;
        if(Timer0_start)
        Times++;
        if(Times > (50*shijian))
        {
                Timer0_start = 0;
                Times = 0;
        }
        TR0=1;//开定时器
}
/*******************************************************************************
* 函数名 : GPIO_config
* 描述   : IO口配置函数
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void        GPIO_config(void)
{
                RUNING_LED=0;
}
/*******************************************************************************
* 函数名 : Timer0Init
* 描述   : 定时器0初始化,20ms定时
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Timer0Init(void)                //20毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //
        TMOD |= 0x01;                //设置定时器模式,16位定时器
        TL0 = 0x00;                  //设置定时器初值
        TH0 = 0xB8;                  //设置定时器初值
        TF0 = 0;                    //清TF0标志
        TR0 = 1;                    //定时器0开始计时
        ET0 = 1;              //使能定时器0中断
}
/*******************************************************************************
* 函数名 : CLR_Buf1
* 描述   : 清除串口2缓存数据
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void CLR_Buf1(void)
{
        u16 k;
        for(k=0;k<Buf1_Max;k++)      //将缓存内容清零
        {
                Uart1_Buf[k] = 0x00;
        }
    First_Int = 0;              //接收字符串的起始存储位置
}

/*******************************************************************************
* 函数名 : Find
* 描述   : 判断缓存中是否含有指定的字符串
* 输入   :
* 输出   :
* 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
* 注意   :
*******************************************************************************/

u8 Find(u8 *a)
{
  if(strstr(Uart1_Buf,a)!=NULL)
            return 1;
        else
                        return 0;
}

/*******************************************************************************
* 函数名 : Second_AT_Command
* 描述   : 发送AT指令函数
* 输入   : 发送数据的指针、发送等待时间(单位:S)
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/

void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)         
{
        u8 i;
        u8 *c;
        c = b;                                                                                //保存字符串地址到c
        CLR_Buf1();
  i = 0;
        while(i == 0)                    
        {
                if(!Find(a))           //查找需要应答的字符
                {
                        if(Timer0_start == 0)//超时重新发送命令
                        {
                                b = c;                                                 //将字符串地址给b
                                for (b; *b!='\0';b++)
                                {
                                        UART1_SendData(*b);
                                }
                                UART1_SendLR();       
                                Times = 0;
                                shijian = wait_time;
                                Timer0_start = 1;  //开始计时
                   }
    }
          else
                {
                        i = 1;
                        Timer0_start = 0;  
                }
        }
        CLR_Buf1();
}

/*******************************************************************************
* 函数名 : Set_Pdu_Mode
* 描述   : 设置短信为TEXT文本模式
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Set_Pdu_Mode(void)
{
        Second_AT_Command("ATE0","OK",3);                                                                                  //取消回显       
        Second_AT_Command("AT+CMGF=0","OK",3);                                                                //设置PDU模式       
        Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中进行
}
/*******************************************************************************
* 函数名 : Send_Pdu_Sms
* 描述   : 发送PDU文本短信
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Send_Pdu_Sms(void)
{

        Second_AT_Command("AT+CMGS=25",">",3); //发送数据长度:27(具体的计算方法看串口调试比较)接收到“>”才发送短信内容
        UART1_SendString(content);     //发送短信内容
        UART1_SendData(0X1A);          //发送结束符
}

/*******************************************************************************
* 函数名 : Wait_CREG
* 描述   : 等待模块注册成功
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Wait_CREG(void)
{
        u8 i;
        u8 k;
        i = 0;
        CLR_Buf1();
  while(i == 0)                               
        {
                CLR_Buf1();        
                UART1_SendString("AT+CREG?");//查询模块网络注册状态
                UART1_SendLR();
                delay_ms(250);                                                 
            for(k=0;k<Buf1_Max;k++)                             
            {
                        if(Uart1_Buf[k] == ':')
                        {
                                if((Uart1_Buf[k+4] == '1')||(Uart1_Buf[k+4] == '5')) //表明网络注册成功
                                {
                                        i = 1;
                                  break;
                                }
                        }
                }
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表