我正在使用 Arduino+Siemens TC35 GSM 模块进行一些实验,我希望能够读取发送到此设备的短信。
我或多或少地按照这个方案组装了我的设备:
不同之处在于我不使用蜂鸣器或继电器,只使用液晶显示器。您可以在此处查看完整图片:
该方案应该可行,因为例如我已经能够从 Arduino 向我的手机发送短信,但在解析发送到 Arduino 的短信时遇到一些问题。
(注意:我将隐藏我的号码,用***替换一些号码)
我像这样初始化 GSM 模块:
mySerial.print("AT+CMGF=1\r\n");
我尝试像这样阅读我的短信:
void readSMS()
{
mySerial.print("AT+CMGR=6\r\n");
delay(1000);
char c;
while (mySerial.available()>0){
c = (char)mySerial.read();
Serial.print(c);
}
}
但我总是收到一条被截断的短信。这是我在串行监视器中看到的内容:
AT+CMGF=1
OK
AT+CMGR=6
+CMGR: "REC READ","AT+CMGR=6
+CMGR: "REC READ","+4475********",,"14/04/25,21:08:AT+CMGR=6
+CMGR: "REC READ","+4475********",,"14/04/25,21:08:AT+CMGR=6
+CMGR: "REC READ","+4475********",,"14/04/25,21:08:AT+CMGR=6
+CMGR: "REC READ","+4475********",,"14/04/25,21:08:AT+CMGR=6
我的代码有什么问题吗?
非常感谢您的帮助。
p.s:其他应该有效的命令(例如删除所有短信的命令:AT+CMGD=1,4)根本不起作用,给我错误。
p.p.s:我希望我可以使用可用于 Arduino 的 GSM.h 库,但我猜它只与原始的 Arduino GSM Shield 兼容。
最佳答案
我在任何方面都不是 Arduino 专家,因此在 API 中可能有更好的方法来做到这一点,但我会尝试这样的方法(延迟可能会降低)
void readSMS()
{
mySerial.print("AT+CMGR=6\r\n"); // Send request
int count = 5; // Number of 100ms intervals before
// assuming there is no more data
while(count-- != 0) { // Loop until count = 0
delay(100); // Delay 100ms
while (mySerial.available() > 0){ // If there is data, read it and reset
c = (char)mySerial.read(); // the counter, otherwise go try again
Serial.print(c);
count = 5;
}
}
}
另一个 - 可能更好 - 的选择是不延迟地循环,直到得到完整的答案。当然,假设您知道要寻找什么(<cr><lf>OK<cr><lf>
似乎就是这种情况,但我对 Hayes 规范太弱,无法确定)
关于serial-port - 当我从西门子 TC35 GSM 模块和 Arduino 读取短信时,短信被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23310121/