6973| 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;//发送一次 } |
似乎就卡在这里了
额,在代码中我给了几个较长的延时,我之所以这样做,是因为我认为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:25 不好意思弄错了,代码是: 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级信息 } } |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed