Arduino中的串行溢出
使用Arduino程序读取SMS时,串行监视器仅显示发送者(无日期或时间)并截断消息。这可能是由于串行溢出,这是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); }
#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)读取短信