Arduino中的串行溢出

时间:2013-02-07 15:28:18

标签: arduino

使用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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

这是因为mySerial中的输出缓冲区需要更多时间来填充GSM屏蔽,而不是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或检查之前已经过去的时间(如果从未可用)。 在达到超时限制之前,代码仍会检查可用性。

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