6755浏览
查看: 6755|回复: 5

[求助] SIM808调试过程中遇到的一些问题

[复制链接]
新人求教,我在调试SIM808时遇到了一些问题。

我想实现的功能是:
1、当按钮(4)按下后,发送包含地理位置的短息到指定号码。
2、当SIM808收到查询短信后,反馈包含地理位置的短息到指定号码。


具体遇到的问题是:
1、进入SIM808后没有反馈地理位置信息(如图所示)
2、按下按钮后电脑会响应表示串口弹开,同时手机没有反。


可排除的干扰是:
1、卡是有话费的。
2、接线是正确的。
3、电源是9V 1A
4、单独测试SIM808(功能开关拨到2),各个命令(获取GPS数据,发送短信)均可正确响应。


在调试之前我参考了沧海笑前辈的帖子:https://mc.dfrobot.com.cn/forum. ... mp;highlight=sim808
同时也看了官方库里给的示列(SIM808_SMSread)



附代码如下:


#include <DFRobot_sim808.h>
#include <sim808.h>
DFRobot_SIM808 sim808(&Serial);
#include <SoftwareSerial.h>
        /*
         短信
         */

         //定义变量
        float lat,lon; //经纬度
        int smsnum=1;//发送次数     

        //读取短信缓存
        #define MESSAGE_LENGTH 160
        char message[MESSAGE_LENGTH];
        int messageIndex = 0;

        char phone[16];
        char datetime[24];

        //缓存发送内容

        String msg ="";             //位置短信内容



    void setup() {
           Serial.begin(9600);
          //按钮及其指示灯定义//
           pinMode(4,INPUT);               //d4--按键

           pinMode(13, OUTPUT);           //GPS指示灯定义
           pinMode(12, OUTPUT);           //发送指示灯定义

           /*用于显示收到查询短信(快闪动3次,500ms)
             并且发送位置短信*/
           digitalWrite(12, LOW);
           digitalWrite(13, LOW);
           Serial.print("Sim808 begin\r\n");
                   while(!sim808.init()) {
              delay(1000);
              Serial.print("Sim808 init error\r\n");
          }
        delay(3000);
                  if( sim808.attachGPS())
              Serial.println("Open the GPS power success");
          else
              Serial.println("Open the GPS power failure");

        }


  void loop() {
       int key =digitalRead(4);                   //读取d4数字口状态
       //************** 获取GPS数据 *******************
       if (sim808.getGPS()) {
        Serial.print("latitude :");
        Serial.println(sim808.GPSdata.lat);
        delay(10000);
        Serial.print("longitude :");
        Serial.println(sim808.GPSdata.lon);
         getgpsdata();

        /*关掉GPS电源*/
        sim808.detachGPS();

        /*指示灯*/
           digitalWrite(13, HIGH);   // LED13闪动2次,显示GPS数据收到
           delay(200);                    
            digitalWrite(13, LOW);  
           delay(200);
            digitalWrite(13, HIGH);  
            delay(200);                    
            digitalWrite(13, LOW);
            delay(2000);

//*********** 如果按钮按下(主动发送) ***********
        if (key==HIGH) {
         delay(60); //消抖延时
          if (key==HIGH)                          
            {
             digitalWrite(13, HIGH);   // LED13闪动1次
             delay(1000);                    
             digitalWrite(13, LOW);
              sendasms_s();//发送一次
           }
         }
     }

    messageIndex = sim808.isSMSunread();
    Serial.print("messageIndex: ");
    Serial.println(messageIndex);

    //*********** 如果读取到短信 (被动查询)***********
   if (messageIndex > 0) {
      sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);

   //***********读取完成后删除短信**********
      sim808.deleteSMS(messageIndex);
      Serial.print("From number: ");
      Serial.println(phone);  
      Serial.print("Datetime: ");
      Serial.println(datetime);        
      Serial.print("Recieved Message: ");
      Serial.println(message);
      digitalWrite(12, HIGH);   // LED13闪动1次
      delay(1500);                    
      digitalWrite(12, LOW);
      sendasms_u();                //发送一次
   }
  }  


  void getgpsdata() //获取gps数据函数
    {
    //第一步:************** Get GPS data *******************
        delay(2000);  
        Serial.print("lat :");
        Serial.println(sim808.GPSdata.lat);
        delay(2000);
        Serial.print("lon :");
        Serial.println(sim808.GPSdata.lon);
        delay(2000);
        lat=sim808.GPSdata.lat;
        delay(100);
        lon=sim808.GPSdata.lon;
      //第二步:生成经纬度短信内容
         //计算纬度
          msg ="";
          char s_lat[5];
          dtostrf(lat,2,2,s_lat);//把lat转换为两位整数,两位小数的字符串
          msg=msg+s_lat;
          //计算经度
          char s_lon[5];
          dtostrf(lon,2,2,s_lon);//把lon转换为两位整数,两位小数的字符串
               msg=msg+","+s_lon;
          Serial.println(msg);
       }







void sendasms_s() //发送函数_1 主动发送
    {
        delay(3000);
        Serial.println("send sms now...");
        char PHONE_NUMBER[12]= "147***********";//请替换为您的手机号
        char smsmessage[30];
        int msglen=msg.length()+1;
        msg.toCharArray(smsmessage, msglen);
        Serial.println(smsmessage);         //串口(PC端)显示转换后的内容,以便确认

        sim808.sendSMS(PHONE_NUMBER,smsmessage);   //发送短信
       //慢闪,表明已发送
        digitalWrite(13, HIGH);   // LED13闪动
        delay(2000);                    
        digitalWrite(13, LOW);  
        delay(1000);
        digitalWrite(13, HIGH);  
        delay(2000);                    
        digitalWrite(13, LOW);
        smsnum=0;//发送一次

    }

  void sendasms_u() //发送函数_2,查询信息
    {
        delay(3000);
        Serial.println("send sms now...");
        char PHONE_NUMBER[12]= "147***********";//请替换为您的手机号
        char smsmessage[30];
        int msglen=msg.length()+1;
        char sos = "SOS" ;
        msg.toCharArray(smsmessage, msglen);
        Serial.println(smsmessage);  //

        //发送短信

        sim808.sendSMS(PHONE_NUMBER,sos);
        sim808.sendSMS(PHONE_NUMBER,smsmessage);   

       //慢闪,表明已发送
        digitalWrite(13, HIGH);   // LED13闪动
        delay(2000);                    
        digitalWrite(13, LOW);  
        delay(1000);
        digitalWrite(13, HIGH);  
        delay(2000);                    
        digitalWrite(13, LOW);
        smsnum=0;//发送一次

    }







似乎就卡在这里了

似乎就卡在这里了

liuhu512  见习技师
 楼主|

发表于 2017-6-23 12:25:57

额,在代码中我给了几个较长的延时,我之所以这样做,是因为我认为GPS获取数据是需要时间的,所以预留出来。
同时,第一次上传的代码较长,看起来有些麻烦,我用代码折叠改了一下,同时把引脚定义省掉(引脚定义请参考第一次上传的代码)希望方便阅读。
void loop() {
       int key =digitalRead(4);                   //读取d4数字口状态
       //************** 获取GPS数据 *******************
       if (sim808.getGPS()) {
        Serial.print("latitude :");
        Serial.println(sim808.GPSdata.lat);
        delay(10000);
        Serial.print("longitude :");
        Serial.println(sim808.GPSdata.lon);
         getgpsdata();

        /*关掉GPS电源*/
        sim808.detachGPS();
        /*指示灯*/
           digitalWrite(13, HIGH);   // LED13闪动2次,显示GPS数据收到
           delay(200);                    
            digitalWrite(13, LOW);  
           delay(200);
            digitalWrite(13, HIGH);  
            delay(200);                    
            digitalWrite(13, LOW);
            delay(2000);

//*********** 如果按钮按下(主动发送) ***********
        if (key==HIGH) {
         delay(60); //消抖延时
          if (key==HIGH)                          
            {
             digitalWrite(13, HIGH);   // LED13闪动1次
             delay(1000);                    
             digitalWrite(13, LOW);
              sendasms_s();//发送一次内容为S级信息
           }
         }
     }

  }  

void getgpsdata() //获取gps数据函数
    {
    //第一步:************** Get GPS data *******************
        delay(2000);  
        Serial.print("lat :");
        Serial.println(sim808.GPSdata.lat);
        delay(2000);
        Serial.print("lon :");
        Serial.println(sim808.GPSdata.lon);
        delay(2000);
        lat=sim808.GPSdata.lat;
        delay(100);
        lon=sim808.GPSdata.lon;
      //第二步:生成经纬度短信内容
         //计算纬度
          msg ="";
          char s_lat[5];
          dtostrf(lat,2,4,s_lat);//把lat转换为两位整数,四位小数的字符串
          msg=msg+s_lat;
          //计算经度
          char s_lon[5];
          dtostrf(lon,2,4,s_lon);//把lon转换为两位整数,四位小数的字符串
               msg=msg+","+s_lon;
          Serial.println(msg);
       }


  void sendasms_s() //发送函数_1求救短信
    {
        delay(3000);
        Serial.println("send sms now...");
        char PHONE_NUMBER[12]= "147*******";//请替换为您的手机号
        char smsmessage[30];
        int msglen=msg.length()+1;
        msg.toCharArray(smsmessage, msglen);
        Serial.println(smsmessage);         //串口(PC端)显示转换后的内容,以便确认

        sim808.sendSMS(PHONE_NUMBER,smsmessage);   //发送短信
       //慢闪,表明已发送
        digitalWrite(13, HIGH);   // LED13闪动
        delay(2000);                    
        digitalWrite(13, LOW);  
        delay(1000);
        digitalWrite(13, HIGH);  
        delay(2000);                    
        digitalWrite(13, LOW);
        smsnum=0;//发送一次

    }

  void sendasms_u() //发送函数_2,查询信息
    {
        delay(3000);
        Serial.println("send sms now...");
        char PHONE_NUMBER[12]= "14785835246";//请替换为您的手机号
        char smsmessage[30];
        int msglen=msg.length()+1;
        char sos = "SOS" ;
        msg.toCharArray(smsmessage, msglen);
        Serial.println(smsmessage);  //串口(PC端)显示转换后的内容,以便确认

        //发送短信

        sim808.sendSMS(PHONE_NUMBER,sos);
        sim808.sendSMS(PHONE_NUMBER,smsmessage);   

       //慢闪,表明已发送
        digitalWrite(13, HIGH);   // LED13闪动
        delay(2000);                    
        digitalWrite(13, LOW);  
        delay(1000);
        digitalWrite(13, HIGH);  
        delay(2000);                    
        digitalWrite(13, LOW);
        smsnum=0;//发送一次

    }

  void Read()      //短信反馈函数
  {
    messageIndex = sim808.isSMSunread();
    Serial.print("messageIndex: ");
    Serial.println(messageIndex);

    //*********** 如果读取到短信(被动查询) ***********
   if (messageIndex > 0) {
      sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);

   //***********读取完成后删除短信**********
      sim808.deleteSMS(messageIndex);
      Serial.print("From number: ");
      Serial.println(phone);  
      Serial.print("Datetime: ");
      Serial.println(datetime);        
      Serial.print("Recieved Message: ");
      Serial.println(message);
      digitalWrite(12, HIGH);   // LED13闪动1次
      delay(1500);                    
      digitalWrite(12, LOW);
      sendasms_u();//发送一次,内容为U级信息   
   }
  }  





回复

使用道具 举报

liuhu512  见习技师
 楼主|

发表于 2017-6-23 12:29:35

liuhu512 发表于 2017-6-23 12:25
额,在代码中我给了几个较长的延时,我之所以这样做,是因为我认为GPS获取数据是需要时间的,所以预留出来 ...

不好意思弄错了,代码是:
  void loop() {
       int key =digitalRead(4);                   //读取d4数字口状态
       //************** 获取GPS数据 *******************
       if (sim808.getGPS()) {
        Serial.print("latitude :");
        Serial.println(sim808.GPSdata.lat);
        delay(10000);
        Serial.print("longitude :");
        Serial.println(sim808.GPSdata.lon);
         getgpsdata();
         
        /*关掉GPS电源*/
        sim808.detachGPS();
   
        /*指示灯*/
           digitalWrite(13, HIGH);   // LED13闪动2次,显示GPS数据收到
           delay(200);                    
            digitalWrite(13, LOW);  
           delay(200);
            digitalWrite(13, HIGH);  
            delay(200);                    
            digitalWrite(13, LOW);
            delay(2000);

//*********** 如果按钮按下(主动发送) ***********
        if (key==HIGH) {
         delay(60); //消抖延时
          if (key==HIGH)                          
            {
             digitalWrite(13, HIGH);   // LED13闪动1次
             delay(1000);                    
             digitalWrite(13, LOW);
              sendasms_s();//发送一次内容为S级信息
           }
         }
     }

  }  
   

  void getgpsdata() //获取gps数据函数
    {
   
       }




  void sendasms_s() //发送函数_1求救短信
    {
      
      
    }
   
  void sendasms_u() //发送函数_2,查询信息
    {
      
    }

  void Read()      //短信反馈函数
  {
    messageIndex = sim808.isSMSunread();
    Serial.print("messageIndex: ");
    Serial.println(messageIndex);

    //*********** 如果读取到短信(被动查询) ***********
   if (messageIndex > 0) {
      sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
                 
   //***********读取完成后删除短信**********
      sim808.deleteSMS(messageIndex);
      Serial.print("From number: ");
      Serial.println(phone);  
      Serial.print("Datetime: ");
      Serial.println(datetime);        
      Serial.print("Recieved Message: ");
      Serial.println(message);
      digitalWrite(12, HIGH);   // LED13闪动1次
      delay(1500);                    
      digitalWrite(12, LOW);
      sendasms_u();//发送一次,内容为U级信息   
   }
  }  
   
   
   
回复

使用道具 举报

liuhu512  见习技师
 楼主|

发表于 2017-6-23 12:31:10

liuhu512 发表于 2017-6-23 12:29
不好意思弄错了,代码是:
  void loop() {
       int key =digitalRead(4);                   //读取d ...

Read()函数卸载loop的最后一行,对不起忘记加了
回复

使用道具 举报

沧海笑  高级技师

发表于 2017-7-4 19:05:14

回帖奖励 +2 创造力

1、您运行我的例子是否顺利。
2、请把您的代码打包作为附件。如果有时间我看一下。当时查询---发送功能我也未能实现。
回复

使用道具 举报

liuhu512  见习技师
 楼主|

发表于 2017-7-5 18:18:39

沧海笑 发表于 2017-7-4 19:05
1、您运行我的例子是否顺利。
2、请把您的代码打包作为附件。如果有时间我看一下。当时查询---发送功能我也 ...

感谢关注。运行您的列子十分顺利,我已经实现查询发送功能,但是程序不稳定(查询完毕之后需要复位),同时最近忙会考,不知能不能留下邮箱,我一定尽快回复。
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail