欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: sim800A模塊收不到消息 [打印本頁]

作者: 大富豪    時間: 2021-3-22 17:47
標題: sim800A模塊收不到消息
各位大佬幫忙看看這個程序哪里有問題,我用串口調試助手可以發出消息,但是用了這個程序就收不到消息。

#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;
                                }
                        }
                }
        }
}







歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1