我是 Arduino 和 GSM Shield 的新手。我一直在使用短信,但从调制解调器读取短信的文本内容时遇到问题。
这是 Arduino 和 GSM 的设置。
#include <SoftwareSerial.h>
SoftwareSerial sim900(7, 8);
#define BUFF_SIZE 400
char buffer[BUFF_SIZE];
bool GSMconnected = false;
//functions
bool copyResponse(int* size);
void printBuff(int size);
bool readlnbuffer(int* start, int* nextline, int* size);
bool isResponseOK(int start, int endofline);
bool checkConnection();
bool checkMessage(int index);
bool checkString(int start, int end, String command);
bool checkSMS(int start, int nextline);
bool newMessage();
void setup() {
sim900.begin(9600);
Serial.begin(9600);
delay(100);
pinMode(relayIN, OUTPUT);
delay(100);
while (!GSMconnected) {
checkConnection();
delay(10000);
}
int rsize;
//text mode
sim900.print("AT+CMGF=1\r");
delay(1000);
//store message in SIM card
sim900.print("AT+CPMS=\"SM\"\r");
delay(1000);
sim900.print("AT+CMGD=0,4\r\n");
delay(1000);
copyResponse(&rsize);
printBuff(rsize);
/*
0: do not show header values
1: show the values in result codes
*/
sim900.print("AT+CSDH=1\r");
delay(1000);
//receive mode +CMTI:"SM", 1
sim900.print("AT+CNMI=2,2,0,0,0 \r");
delay(1000);
copyResponse(&rsize);
printBuff(rsize);
sim900.print("AT+CSMP=17,167,0,0\r\n");
delay(10000);
copyResponse(&rsize);
printBuff(rsize);
Serial.println("GSM is ready");
我想在有新短信时查看短信。所以我只是在 GSM 可用时调用该函数。
void loop() {
if(sim900.available()) {
newMessage();
}
}
newMessage()
检查 SIM 卡中存储的新短信的索引。
bool newMessage() {
int responseSize;
if (!copyResponse(&responseSize)) {
return false;
}
//+CMTI: “SM”,1
//read a line and check if there is a SMS
int start = 0;
int nextline = 0;
int index;
while (readlnbuffer(&start, &nextline, &responseSize)) {
String command = "+CMTI: \"SM\",";
if (checkString(start, start + 12, command)) {
Serial.println("SMS found");
index = int(buffer[start + 12]);
break;
}
start = nextline;
}
//debug
printBuff(responseSize);
delay(10000);
if (checkMessage(index)) {
//delete message
sim900.print("AT+CMGD=");
sim900.print(char(index));
sim900.println("\r");
delay(100);
return true;
} else {
return false;
}
checkMessage()
读取短信并应打印短信文本数据。
bool checkMessage(int index) {
//listing
//sim900.print("AT+CMGL=\"REC UNREAD\"\r\n");
//reading
sim900.print("AT+CMGR=");
sim900.print(char(index));
sim900.print("\r\n");
delay(5000);
int responseSize;
if (!copyResponse(&responseSize)) {
return false;
}
delay(100);
//debug, to check what is in the buffer
printBuff(responseSize);
//read a line and check if there is a SMS
int start = 0;
int nextline = 0;
bool isSMS = false;
while (!isSMS) {
start = nextline;
if (!readlnbuffer(&start, &nextline, &responseSize)) {
Serial.println("no SMS found");
return false;
}
String command = "+CMGR:";
if (checkString(nextline, nextline + 6, command)) {
Serial.println("SMS checking");
isSMS = true;
}
}
//debug
if (!readlnbuffer(&start, &nextline, &responseSize)) {
Serial.println("cannot read the sms info");
return false;
}
Serial.println("SMS message: ");
for (int i = start; i < nextline; i++) {
//debug
Serial.print(buffer[i]);
}
Serial.println("");
}
当我运行代码时,似乎无法完全复制 AT+CMGR 的响应。这是串行监视器显示的内容。
检查网络
AT+CREG?
+CREG:0,1
好的
AT+CMGF=1
好的
AT+CPMS=“SM”
+CPMS:1,30,1,30,1,30
好的
AT+
AT+CSDH=1
好的
AT+CNMI=2,1,0,0,0
好的
AT+CSMP=17,167,0,0
好的
GSM 已准备就绪
发现短信
+CMTI:“SM”,1
AT+CMGR=1
> +CMGR:“记录未读”,“+123456789”,“”,“17/11/26,11
短信查询
短信:
AT+CMGD=1
好的
我认为我在缓冲区中复制响应时出错了。我也是编写代码的初学者,我需要一些帮助。谁能告诉我为什么我会遇到这个问题?
谢谢!
我认为问题是你正在使用
delay
来中止命令,你应该永远,永远,永远不要这样做作为阅读和解析来自mopdem的响应。
有关删除延迟使用的提示,请参阅链接的答案(有关中止命令的详细信息,您可以参阅 V.250)。
我也遇到过同样的情况。 为了修复它。将 SoftwareSerial.cpp 中的 Rx 缓冲区大小从 64(默认)更改为 128。 我尝试了256,但没有成功。所以我就定了128。