SIM900A读取短信求助-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 20595|回复: 26

[已解决] SIM900A读取短信求助

[复制链接]
发表于 2015-4-25 19:20 | 显示全部楼层 |阅读模式
本帖最后由 Jeffrey18 于 2015-4-26 18:42 编辑

为什么短信读取的内容不完整,代码如下,请高手看一下,O(∩_∩)O谢谢!!!

#include <Arduino.h>
#include <String.h>
void setup()
{
  Serial.begin(9600);
}

void loop(){
  Read_Message();
}

void Read_Message(){
  Scan_Message();
  String inString="";
  while (Serial.available()>0){
    char inChar=Serial.read();
    inString += (char)inChar;
    delay(10);
  }
  if (inString!="")
  {
    Serial.println(inString);
  }
}

void Scan_Message(){
  Serial.print("AT+CMGR=1\r\n");
  delay(1000);
}

发表于 2015-4-25 22:16 | 显示全部楼层
(1)Serial 的緩存區只有 64 bytes,
    如果送過來的超過 64 且沒被 .read( ) 則緩存區滿了後送來的就會掉字 !
(2)你在 loop( ) 內不斷的下命令讀去 #1 短信,
    這確定是要故意這樣嗎?
(3)先試這看看,
   如果仍收不完整, 那就必須去偷改庫內的 Serial 之緩存區, 例如改為 256 應該就夠用

[mw_shl_code=bash,true]#include <Arduino.h>
#include <String.h>
void setup()
{
  Serial.begin(9600);
  Scan_Message();
}

void loop(){
  Read_Message();
}

void Read_Message(){
  ///
  String inString="";
  while (Serial.available()>0){
    char inChar=Serial.read();
    inString += (char)inChar;
    delay(2);
  }
  if (inString!="")
  {
    Serial.println(inString);
  }
}

void Scan_Message(){
  Serial.print("AT+CMGR=1\r\n");
  delay(38);
}[/mw_shl_code]
 楼主| 发表于 2015-4-25 22:26 | 显示全部楼层
tsaiwn 发表于 2015-4-25 22:16
(1)Serial 的緩存區只有 64 bytes,
    如果送過來的超過 64 且沒被 .read( ) 則緩存區滿了後送來的就會掉 ...

可以读出来了,非常感谢!
 楼主| 发表于 2015-4-25 23:01 | 显示全部楼层
tsaiwn 发表于 2015-4-25 22:16
(1)Serial 的緩存區只有 64 bytes,
    如果送過來的超過 64 且沒被 .read( ) 則緩存區滿了後送來的就會掉 ...

但是这样我发现不是很稳定,比如开始的时候#1并没有短信,然后发送一条就会出现乱码。
发表于 2015-4-26 00:20 | 显示全部楼层
Jeffrey18 发表于 2015-4-25 23:01
但是这样我发现不是很稳定,比如开始的时候#1并没有短信,然后发送一条就会出现乱码。 ...


比較正確應該是等 Sim900 通知你有短信你再去收
短信來的時候, Sim900 會給你含有  "+CMTI" 的訊息
你檢查到信息含有 "+CMTI"
再發 AT+CMGR=1\r 給它
可以參考
   http://www.arduino.cn/thread-10824-5-1.html
差別只是他用 SoftwareSerial 軟串口, 你用硬串口

另外請參考:
   http://www.electrodragon.com/w/SIM908_SIM900_Common_AT_Commands
   http://elecfreaks.com/store/down ... %20Manual_V1.03.pdf
   http://www.cooking-hacks.com/doc ... gsm-quadband-sim900
 楼主| 发表于 2015-4-26 13:42 | 显示全部楼层
tsaiwn 发表于 2015-4-26 00:20
比較正確應該是等 Sim900 通知你有短信你再去收
短信來的時候, Sim900 會給你含有  "+CMTI" 的訊息
你檢 ...

我试着重新写了一下,但是输出了AT+CMGR=1后就读不出短信了。
我是初学者,可能会犯很初级的错误,谢谢你啦!
#include <Arduino.h>
#include <String.h>
void setup()
{
  Serial.begin(9600);
  Set_Message();
}

void loop(){
  GetSMS();
  
}
void GetSMS(){
  String inStr1="";
  while (Serial.available()>0){
    char inChar1=Serial.read();
    inStr1 += (char)inChar1;
    delay(2);
  }
  while(inStr1.indexOf("+CMTI")!=-1){
    Read_Message();
    break;
  }
}

void Read_Message(){
  Serial.print("AT+CMGR=1\r\n");
  delay(38);
  String inString="";
  while (Serial.available()>0){
    char inChar=Serial.read();
    inString += (char)inChar;
    delay(2);
  }
  if (inString!="")
  {
    Serial.println(inString);
  }
}
void Set_Message(){
  Serial.print("AT+CMGF=1\r\n");
  Serial.print("AT+CNMI=2,1\r\n");
}
发表于 2015-4-26 17:49 | 显示全部楼层
本帖最后由 tsaiwn 于 2015-4-26 17:58 编辑
Jeffrey18 发表于 2015-4-26 13:42
我试着重新写了一下,但是输出了AT+CMGR=1后就读不出短信了。
我是初学者,可能会犯很初级的错误,谢谢你 ...

有可能是 SIM900 還沒回應,
然後繞回  void loop( )  之後被你的  GetSMS( ) 讀去檢查 +CMTI 了
以下改為送出 AT+CMGR=1後 最多等大約 3.8 秒, 這樣應該足夠
不過, 注意如果短信沒刪除, 但你每次用 AT+CMGR=1 則都是讀到第一個短信 !

[mw_shl_code=bash,true]#include <Arduino.h>
#include <String.h>
boolean haveSMS = false;  // 有短信嗎 ?
void setup()
{
  Serial.begin(9600);
  Set_Message();
}

void loop(){
  checkSMS();
  if(haveSMS) {
    haveSMS = false;
    Read_Message();
  }// if(
  //...
}
void checkSMS(){
  String inStr1="";
  while (Serial.available()>0){
    char inChar1=Serial.read();
    inStr1 += (char)inChar1;
    delay(2);
  }// while(
  if(inStr1.indexOf("+CMTI")!=-1){
    haveSMS = true;  // 表示有短信
  }// if(
} // checkSMS(

void Read_Message(){
  Serial.print("AT+CMGR=1\r\n");
  int i = 0;
  for( ; i < 100; ++i) {
     delay(38);
     if(Serial.available( ) ) break;
  }// for(
  if( ! Serial.available( ) ) {
    Serial.println("Time out  when try A_T_+_C_M_G_R=1");
  }// if(
  String inString="";
  while (Serial.available()>0){
    char inChar=Serial.read();
    inString += (char)inChar;
    delay(2);
  }//while(
  if (inString!="")
  {
    Serial.println(inString);
  } // if(
} //Read_Message(
void Set_Message(){
  Serial.print("AT+CMGF=1\r\n");
  Serial.print("AT+CNMI=2,1\r\n");
}[/mw_shl_code]
发表于 2015-4-26 17:57 | 显示全部楼层
Jeffrey18 发表于 2015-4-26 13:42
我试着重新写了一下,但是输出了AT+CMGR=1后就读不出短信了。
我是初学者,可能会犯很初级的错误,谢谢你 ...

忽然想到
你用 HardSerial 連接 Sim900
然後也用串口監視器查看
這樣你送到串口監視器的字符串也會同時送去 Sim900 喔 !
當然,
通常大部分字符串會被  Sim900 忽略掉丟棄
但是也很可能有些字符串會對 Sim900 產生影響喔 !!
 楼主| 发表于 2015-4-26 18:42 | 显示全部楼层
tsaiwn 发表于 2015-4-26 17:49
有可能是 SIM900 還沒回應,
然後繞回  void loop( )  之後被你的  GetSMS( ) 讀去檢查 +CMTI 了
以下改為 ...

是的,每次都是读#1短信,我程序还没有写完,没添加删除模块。写完之后是收到短信后提取其中指令然后操作,最后删除,也就是短信控制啦!
我在检测到短信之后添加了delay(4000),然后再发送读短信指令,这样就可以读出来了。可能是缓冲区里面依然有(+CMTI)。
thank you!
发表于 2015-4-26 19:24 | 显示全部楼层
Jeffrey18 发表于 2015-4-26 18:42
是的,每次都是读#1短信,我程序还没有写完,没添加删除模块。写完之后是收到短信后提取其中指令然后操作 ...

應該不必 delay 那麼久
建議換成我剛剛給的那樣會比較好
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 00:01 , Processed in 0.246608 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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