OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4520|回复: 8

用单片机连接GSM模块,发不出去短信,可以帮我检查下代码吗?

[复制链接]

4

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-1-20
在线时间
3 小时
发表于 2016-1-25 22:59:25 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f10x.h"
#include "string.h"
#include "delay.h"

#include "GUI.h"
#include "usart.h"
#include "mq2.h"
#include "stdarg.h"
#include "stdio.h"

#include "beep.h"
#include "ds18b20.h"
#include "led.h"
#include "remote.h"

#define FONT_SIZE    24           //ÑìÎí′«¸DÆ÷                    
#define MQ2_ADC_POS  (0*FONT_SIZE)
#define DS18B20_ADC_POS  (1*FONT_SIZE)
//#define DS18B20_ADC_POS2  (2*FONT_SIZE)

#define MQ2_HANDLER_TIME_MSECS   2000

float MQ2_Adc;
                                    
short temperature;        
float temp;             

void MQ2_Handler(void);
void LCD_Printf(int y,char  *format, ...);
void DS18B20_Handler(void);
void Sensor_Periodic_Handle(u32 localtime);


int main()
{
    u32 time;
    SysTick_Config(SystemCoreClock / 1000);
    delay_ms(200);                  //éÏμçÎ趨oó
    NVIC_Configuration();          //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏ輶£¬2λÏìó|óÅÏ輶
    uart_init(9600);       //USART3õê¼»ˉ

          GUI_Init();
    GUI_SetBkColor(GUI_WHITE);
    GUI_SetColor(GUI_RED);
    GUI_Clear();
    GUI_SetFont(&GUI_Font24_1);


    MQ2_Init();                //ÑìÎíÄ£¿é3õê¼»ˉ
          DS18B20_Init();           //DS18b203õê¼»ˉ
          LED_Init();               //LED3õê¼»ˉ
    time = 0;
         
           delay_ms(3000);//Ñóê±3Ãë               
                printf("AT+CSCS=\"GSM\"\r\n");
                delay_ms(3000);//Ñóê±3Ãë
                printf("AT+CMGF=1\r\n");
                delay_ms(3000);//Ñóê±3Ãë
                printf("AT+CMGS=\"18060614154\"\r\n");//′Ë′|DT¸ÄÎa¶Ô·½μÄμç»°oÅ
                delay_ms(5000);//Ñóê±3Ãë
                printf("THIS IS GSM SIM900A TEST!\r\n");//DT¸Ä¶ìDÅÄúèY
                delay_ms(3000);//Ñóê±3Ãë               
                USART_SendData(USART1,0x1a);
                delay_ms(3000);//Ñóê±20Ãë
       

    while(1)
    {
        time = GetCurTime();      
        Sensor_Periodic_Handle(time);  
       
    }
}
//................................................
void Sensor_Periodic_Handle(u32 localtime)     
{
    static u32 SensorTimer = 0;   
    static u32 time = 0;

    if (localtime - SensorTimer >= 1)
    {
        SensorTimer =localtime;

        if(time%MQ2_HANDLER_TIME_MSECS == 0)
        {
            MQ2_Handler();                 
                                          DS18B20_Handler();       
        }
        time ++;
    }

}

//.................ÑìÎí′«¸DÆ÷′úÂë............................
void MQ2_Handler()   
{
    float res_adc;

    MQ2_Adc = MQ2_ReadADC();
    res_adc = RES_ReadADC();

    if(MQ2_Adc > 1.9)
    {
        LCD_Printf(MQ2_ADC_POS, "ADC:MQ2 Alarm  RES:%.3fV",res_adc);
                          //BEEP_Init( );
                          LED0=0;//»Æé«μÆ
                         //Uart1Sends("DF70FE9635758B533C50C78FD89A0CFFF78BE86C0F61");//¶ìDÅÄúèYunicon±àÂë  ÑìÎíμçÑ1Öμ1y¸ß£¬Çë×¢òa  
    }
    else
    {
        LCD_Printf(MQ2_ADC_POS, "ADC:MQ2:%.3fV  RES:%.3fV", MQ2_Adc,res_adc);
    }
}
//...................DS18B20′úÂë.......................
void DS18B20_Handler()
{       
            // u8 t=0;   
    //NVIC_Configuration();            //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏ輶£¬2λÏìó|óÅÏ輶

while(DS18B20_Init()==1)               //DS18B203õê¼»ˉerror       
        {
                  LCD_Printf(DS18B20_ADC_POS, "DS18B20 Alarm T ");       
                  delay_ms(200);
        }                                                                  
                        
       //  delay_ms(2);
         temperature=DS18B20_Get_Temp();       
               temp=temperature/10;
               //delay_ms(200);
       if(temp<19.0)          //3&#172;1y30é&#227;ê&#207;&#182;è&#212;ò±¨&#190;ˉ
                                {
            LCD_Printf(DS18B20_ADC_POS, "DS18B20 %3.1f",temp);//
            delay_ms(200);
        }       
                                else
                                {                
                                  LCD_Printf(DS18B20_ADC_POS, "DS18B20 Alarm %3.1f",temp);
                                          //BEEP_Init( );
                                          LED1=0;//oìé&#171;μ&#198;
                                         delay_ms(200);
                                        //Uart1Sends("296EA65EF25DC78FD89A0CFFF78BE86C0F61");//&#182;ìD&#197;&#196;úèYunicon±à&#194;&#235;&#161;£&#161;£&#161;£&#206;&#194;&#182;èò&#209;1y&#184;&#223;£&#172;&#199;&#235;×¢òa
                                        //Uart1Sends("A");
                                }         
                            LED1=1;//oìé&#171;μ&#198;       
}

//...................LCD&#207;&#212;ê&#190;oˉêy.....................
char  buf_str[201u];

void LCD_Printf(int y,char  *format, ...)     
{
    va_list   v_args;


    va_start(v_args, format);
    (void)vsnprintf((char       *)&buf_str[0],
                    (size_t      ) sizeof(buf_str),
                    (char const *) format,
                    v_args);
    va_end(v_args);


    memset(&buf_str[strlen(buf_str)], ' ', 60 > strlen(buf_str)?60 - strlen(buf_str):0);
    buf_str[60] = 0;

    GUI_DispStringAt(buf_str, 0,y);
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2016-1-26 00:13:40 | 显示全部楼层
本帖最后由 miaoguoqiang 于 2016-1-26 00:15 编辑

显然问题太多,返回值都没有,肯定不知道哪里错了。开机时间太短 模块都还没初始化完成。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-1-23
在线时间
1 小时
发表于 2016-1-26 02:28:37 | 显示全部楼层
用mdk的debug功能看下USart有没有数据输出,跟踪一下程序运行情况
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-1-20
在线时间
3 小时
 楼主| 发表于 2016-1-26 13:44:04 | 显示全部楼层
miaoguoqiang 发表于 2016-1-26 00:13
显然问题太多,返回值都没有,肯定不知道哪里错了。开机时间太短 模块都还没初始化完成。

模块初始化时可以的,你说的返回值问题,可以详细说说吗
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-1-20
在线时间
3 小时
 楼主| 发表于 2016-1-26 13:49:27 | 显示全部楼层
探索者丸丸号 发表于 2016-1-26 02:28
用mdk的debug功能看下USart有没有数据输出,跟踪一下程序运行情况

我对这个软件业不太熟,然后刚刚应该大概试了一些,好像是在延迟函数中出不来了,但不知道是不是我操作有问题?
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-1-23
在线时间
1 小时
发表于 2016-1-26 16:29:56 | 显示全部楼层
可以上网查下mdk硬件dubug的教程,应该蛮多;先用run,等一段时间,再用stop.看程序停在哪里。然后res(复位一下),重复操作。看程序是否停在上次的地方,就可以差不多断定程序卡在哪里;至于看外设状况,菜单栏里有个peripheral,它里面就有相应外设可选。USart里——CR指控制寄存器,——DR指数据寄存器,程序停止时,看——DR栏显示的数据是不是自己想要的。主要基本就这些,详细自己去看相关介绍教程。
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2016-1-26 16:50:50 | 显示全部楼层
alics0 发表于 2016-1-26 13:44
模块初始化时可以的,你说的返回值问题,可以详细说说吗

就是说你每发送一次,模块会给你返回是否成功。如果不成功你还继续操作,那么肯定是发不出短信的。
如果没写串口接收中断,又不会操作mdk,还可以用ttl转串口的模块接到模块的TX引脚上,看gsm的返回值是什么,一步一步的查错。
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-1-20
在线时间
3 小时
 楼主| 发表于 2016-1-27 22:58:50 | 显示全部楼层
miaoguoqiang 发表于 2016-1-26 16:50
就是说你每发送一次,模块会给你返回是否成功。如果不成功你还继续操作,那么肯定是发不出短信的。
如果 ...

printf("AT+CSCS=\"GSM\"\r\n");
                delay_ms(5000);
                printf("AT+CMGF=1\r\n");
                delay_ms(5000);
有没有什么办法可以编写像这样的程序,然后看它的返回值的
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2016-1-29 20:52:52 | 显示全部楼层
alics0 发表于 2016-1-27 22:58
printf("AT+CSCS=\"GSM\"\r\n");
                delay_ms(5000);
                printf("AT+CMGF=1\r\n");

论坛里边的历程都有有的啊
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 07:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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