找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2137|回復(fù): 0
收起左側(cè)

sim800A模塊收不到消息

[復(fù)制鏈接]
ID:884420 發(fā)表于 2021-3-22 17:47 | 顯示全部樓層 |閱讀模式
各位大佬幫忙看看這個(gè)程序哪里有問題,我用串口調(diào)試助手可以發(fā)出消息,但是用了這個(gè)程序就收不到消息。

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


#define Buf1_Max 200                                           //串口2緩存長度
/*************        本地常量聲明        **************/
sbit RUNING_LED = P3^2;                                        //運(yùn)行指示燈

static unsigned char *content="0891683110401305F00011000D91689158222612F60008AA0C80014EBA672A670D836F";//發(fā)送短信內(nèi)容
/************************短信內(nèi)容解析**************************************/
/*08913181022026F90011000D919158222612F60008AA0C80014EBA672A670D836F
   //短信中心號(hào)(倒序)      目標(biāo)手機(jī)(倒序)         短信內(nèi)容(測(cè)試已經(jīng)完成)
     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;//定時(shí)器標(biāo)志位
sbit Timer0_start =Flag^0;        //定時(shí)器0延時(shí)啟動(dòng)計(jì)數(shù)器



/*************        本地函數(shù)聲明        **************/
void GPIO_config(void); //端口初始化配置
void Timer0Init(void);  //定時(shí)器0初始化
void CLR_Buf1(void);    //清除串口2接收緩存
u8 Find(u8 *a);         //查找字符串
void Second_AT_Command(u8 *b,u8 *a,u8 wait_time); //發(fā)送AT指令函數(shù)
void Set_Pdu_Mode(void);//設(shè)置短信模式PDU
void Wait_CREG(void);   //查詢等待模塊注冊(cè)成功
void Send_Pdu_Sms(void);//發(fā)送一條中文短信
/*************  外部函數(shù)和變量聲明*****************/




/*******************************************************************************
* 函數(shù)名 : main
* 描述   : 主函數(shù)
* 輸入   :
* 輸出   :
* 返回   :
* 注意   : 串口波特率是9600,GPRS模塊默認(rèn)波特率是115200,需要自己通過串口助手修改
                                   為9600方可使用。
*******************************************************************************/
void main(void)
{
        Timer0Init();  //初始化定時(shí)器0
        GPIO_config();
        EA=1;        //開總中斷
        Uart1Init();    //初始化串口9600
        Wait_CREG();    //查詢等待模塊注冊(cè)成功
        Set_Pdu_Mode();//設(shè)置短信為PDU模式
        Send_Pdu_Sms();//發(fā)送一條短消息
        while(1)
        {
                ;
        }
       
}

/*******************************************************************************
* 函數(shù)名 : Uart1
* 描述   : 串口1中斷服務(wù)入口函數(shù)
* 輸入   :
* 輸出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Uart1() interrupt 4
{
    if (RI)
    {
      RI = 0;                 //清除RI位
                        Uart1_Buf[First_Int] = SBUF;            //將接收到的字符串存到緩存中
                        First_Int++;                                        //緩存指針向后移動(dòng)
                        if(First_Int > Buf1_Max)                       //如果緩存滿,將緩存指針指向緩存的首地址
                        {
                                First_Int = 0;
                        }
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
    }
}
/*******************************************************************************
* 函數(shù)名 : Timer0_ISR
* 描述   : 定時(shí)器0中斷服務(wù)入口函數(shù),20ms中斷一次
* 輸入   :
* 輸出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Timer0_ISR() interrupt 1
{
        static u8 Time_count=0;
  TL0 = 0x00;                  //重置定時(shí)器初值
        TH0 = 0xB8;                  //重置定時(shí)器初值       
        TR0=0;//關(guān)定時(shí)器
        Time_count++;
        if(Time_count>=50)
        {
                Time_count = 0;
                RUNING_LED =~RUNING_LED;
        }
        if(count_20ms) //20ms延時(shí)計(jì)數(shù)器
                count_20ms--;
        if(Timer0_start)
        Times++;
        if(Times > (50*shijian))
        {
                Timer0_start = 0;
                Times = 0;
        }
        TR0=1;//開定時(shí)器
}
/*******************************************************************************
* 函數(shù)名 : GPIO_config
* 描述   : IO口配置函數(shù)
* 輸入   :
* 輸出   :
* 返回   :
* 注意   :
*******************************************************************************/
void        GPIO_config(void)
{
                RUNING_LED=0;
}
/*******************************************************************************
* 函數(shù)名 : Timer0Init
* 描述   : 定時(shí)器0初始化,20ms定時(shí)
* 輸入   :
* 輸出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Timer0Init(void)                //20毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                //
        TMOD |= 0x01;                //設(shè)置定時(shí)器模式,16位定時(shí)器
        TL0 = 0x00;                  //設(shè)置定時(shí)器初值
        TH0 = 0xB8;                  //設(shè)置定時(shí)器初值
        TF0 = 0;                    //清TF0標(biāo)志
        TR0 = 1;                    //定時(shí)器0開始計(jì)時(shí)
        ET0 = 1;              //使能定時(shí)器0中斷
}
/*******************************************************************************
* 函數(shù)名 : CLR_Buf1
* 描述   : 清除串口2緩存數(shù)據(jù)
* 輸入   :
* 輸出   :
* 返回   :
* 注意   :
*******************************************************************************/
void CLR_Buf1(void)
{
        u16 k;
        for(k=0;k<Buf1_Max;k++)      //將緩存內(nèi)容清零
        {
                Uart1_Buf[k] = 0x00;
        }
    First_Int = 0;              //接收字符串的起始存儲(chǔ)位置
}

/*******************************************************************************
* 函數(shù)名 : Find
* 描述   : 判斷緩存中是否含有指定的字符串
* 輸入   :
* 輸出   :
* 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
* 注意   :
*******************************************************************************/

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

/*******************************************************************************
* 函數(shù)名 : Second_AT_Command
* 描述   : 發(fā)送AT指令函數(shù)
* 輸入   : 發(fā)送數(shù)據(jù)的指針、發(fā)送等待時(shí)間(單位: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))           //查找需要應(yīng)答的字符
                {
                        if(Timer0_start == 0)//超時(shí)重新發(fā)送命令
                        {
                                b = c;                                                 //將字符串地址給b
                                for (b; *b!='\0';b++)
                                {
                                        UART1_SendData(*b);
                                }
                                UART1_SendLR();       
                                Times = 0;
                                shijian = wait_time;
                                Timer0_start = 1;  //開始計(jì)時(shí)
                   }
    }
          else
                {
                        i = 1;
                        Timer0_start = 0;  
                }
        }
        CLR_Buf1();
}

/*******************************************************************************
* 函數(shù)名 : Set_Pdu_Mode
* 描述   : 設(shè)置短信為TEXT文本模式
* 輸入   :
* 輸出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Set_Pdu_Mode(void)
{
        Second_AT_Command("ATE0","OK",3);                                                                                  //取消回顯       
        Second_AT_Command("AT+CMGF=0","OK",3);                                                                //設(shè)置PDU模式       
        Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中進(jìn)行
}
/*******************************************************************************
* 函數(shù)名 : Send_Pdu_Sms
* 描述   : 發(fā)送PDU文本短信
* 輸入   :
* 輸出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Send_Pdu_Sms(void)
{

        Second_AT_Command("AT+CMGS=25",">",3); //發(fā)送數(shù)據(jù)長度:27(具體的計(jì)算方法看串口調(diào)試比較)接收到“>”才發(fā)送短信內(nèi)容
        UART1_SendString(content);     //發(fā)送短信內(nèi)容
        UART1_SendData(0X1A);          //發(fā)送結(jié)束符
}

/*******************************************************************************
* 函數(shù)名 : Wait_CREG
* 描述   : 等待模塊注冊(cè)成功
* 輸入   :
* 輸出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Wait_CREG(void)
{
        u8 i;
        u8 k;
        i = 0;
        CLR_Buf1();
  while(i == 0)                               
        {
                CLR_Buf1();        
                UART1_SendString("AT+CREG?");//查詢模塊網(wǎng)絡(luò)注冊(cè)狀態(tài)
                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')) //表明網(wǎng)絡(luò)注冊(cè)成功
                                {
                                        i = 1;
                                  break;
                                }
                        }
                }
        }
}


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表