使用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
答案 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或检查之前已经过去的时间(如果从未可用)。 在达到超时限制之前,代码仍会检查可用性。
我建议最后一种方法。快乐的编码!