Arduino中的串行溢出

Arduino中的串行溢出,arduino,Arduino,使用Arduino程序读取SMS时,串行监视器仅显示发送者(无日期或时间)并截断消息。这可能是由于串行溢出,这是Arduino中的一个常见问题 代码: #include <SoftwareSerial.h> #include <String.h> SoftwareSerial mySerial(7, 8); void setup() { mySerial.begin(9600); Serial.begin(9600); }

使用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);
}
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);
}

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

这不是波特率,因为字符串清晰易读,因此所有位都位于正确位置,但字符串被截断

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

中放置一个带有特定时间的
延迟()
,而

#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);
}
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);
}
无符号长初始时间,超时=500//选择正确的超时值
void循环()
{
mySerial.print(“AT+CMGR=1\r”);
//延迟(100);//此延迟可以忽略
初始时间=毫秒();
做{
while(mySerial.available()){
Serial.write(mySerial.read());
初始时间=毫秒();
}  
}while(millis()-init_time
millis()-init_time
给出自上次
mySerial.available()
返回true或在检查之前经过的时间(如果从不可用)在达到超时限制之前,代码仍将检查可用性。


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

你在读什么短信?你的while()循环中的loop()函数缺少花括号;您应该使用这些来确保延迟(1000)呼叫包含在该环路中。先生,我正在从GSM手机(SIM 900)读取短信