4

使用 Arduino 程序读取 SMS 时,串行监视器仅显示发件人(无日期或时间)并截断消息。这可能是由于串行溢出,这是 Arduino 中的一个常见问题。

代码:

#include <SoftwareSerial.h>
#include <String.h>

SoftwareSerial mySerial(7, 8);
void setup()
{
  mySerial.begin(9600);               
  Serial.begin(9600);    

}


void loop()
{
 mySerial.print("AT+CMGR=1\r");
 delay(100);
 while(mySerial.available())
   Serial.write(mySerial.read());
   delay(1000);
}

输出

AT+CMGR=1

+CMGR: "REC READ","+XXXXX","A Silky Soni","1AT+CMGR=1

+CMGR: "REC READ","+XXXXX","A Silky Soni","1AT+CMGR=1

+CMGR: "REC READ","+XXXXX","A Silky Soni","1AT+CMGR=1
4

2 回答 2

1

您可能需要调整代码中的波特率以匹配 GSM 屏蔽。

于 2013-03-19T17:53:38.277 回答
0

这不是波特率,因为字符串是清晰的,所以所有位都在正确的位置,但是字符串被截断。

发生这种情况是因为 GSM 屏蔽填充输出缓冲区所需的时间比指令mySerial耗尽的时间要长。mySerial.read()就是这样:当mySerial.available()被检查并且GSM屏蔽没有时间将任何东西放入输出缓冲区中时,结果是while循环失败。有一些方法可以解决这个问题:

delay()特定时间放入while

void loop()
{
         mySerial.print("AT+CMGR=1\r");
         delay(100);
         while(mySerial.available()){
           Serial.write(mySerial.read());
           delay(100);  //fix the time according to how fast the GSM shield
                        //wrote the data in the serial port. 
         }
         delay(1000);
}

或使用超时:

unsigned long init_time, timeout=500;//choose the correct timeout value  
void loop()
{
 mySerial.print("AT+CMGR=1\r");
 //delay(100); //this delay can be omitted
 init_time=millis();
 do{
   while(mySerial.available()){
     Serial.write(mySerial.read());
     init_time=millis();
   }  
 }while(millis()-init_time < timeout);
 delay(1000);
}

millis()-init_time给出自上次mySerial.available()返回 true 或检查是否不可用之前经过的时间。在达到超时限制之前,代码仍将检查可用性。

我建议最后一种方法。快乐编码!

于 2016-04-15T20:08:39.933 回答