Arduino、GSM 扩展板、AT+CMGR 和 +CMGL 不响应 SMS 文本数据

问题描述 投票:0回答:2

我是 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

好的

我认为我在缓冲区中复制响应时出错了。我也是编写代码的初学者,我需要一些帮助。谁能告诉我为什么我会遇到这个问题?

谢谢!

arduino sms gsm at-command sim900
2个回答
0
投票

我认为问题是你正在使用

delay
来中止命令,你应该永远,永远,永远不要这样做作为阅读解析来自mopdem的响应。

有关删除延迟使用的提示,请参阅链接的答案(有关中止命令的详细信息,您可以参阅 V.250)。


0
投票

我也遇到过同样的情况。 为了修复它。将 SoftwareSerial.cpp 中的 Rx 缓冲区大小从 64(默认)更改为 128。 我尝试了256,但没有成功。所以我就定了128。

© www.soinside.com 2019 - 2024. All rights reserved.