SMS-уведомление не работает с Arduino Nano с модулем GSM - PullRequest
0 голосов
/ 23 марта 2020

Я хочу использовать Arduino Nano для мониторинга SMS-трафика c модуля GSM. Я могу читать и отправлять SMS, но система уведомлений не работает: когда я отправляю SMS (на SIM-карту, которая находится в модуле GSM), новые данные не становятся доступными через последовательный порт. Любая идея, почему или как я могу отладить, чтобы найти проблему?

Связь осуществляется через контакты 9 и 10 Arduino и RX и TX для модуля GSM, который является Quectel EC25. Код, который я использую:

#include <SoftwareSerial.h>

#define DEBUG Serial
SoftwareSerial EC25(10,9); // RX, TX - 9600 baud rate
// pin 8 of raspi -> pin 9 of arduino nano 
// pin 10 of raspi -> pin 10 of arduino nano

#define AT_RESPONSE_LEN 100
#define TIMEOUT 1000

void setup() {
  // put your setup code here, to run once:
  EC25.begin(9600);
  DEBUG.begin(9600);

  // some AT commands just to see if the coms are ok
  sendATComm("AT","OK\r\n");
  sendATComm("AT+IPR?","OK\r\n");
  sendATComm("AT+CGSN","OK\r\n");

  sendATComm("AT+CNMI=2,1,0,0,0","OK\r\n");

  DEBUG.println("listennig");
}

void loop() {
  // put your main code here, to run repeatedly:

  if (EC25.available()){
    DEBUG.println("Notification received!");
  }

}



// function for sending at command.
const char* sendATComm(const char *command, const char *desired_reponse)
{
  uint32_t timer;
  char response[AT_RESPONSE_LEN]; // module response for AT commands.

  memset(response, 0 , AT_RESPONSE_LEN);
  EC25.flush();

  sendATCommOnce(command);

  timer = millis();
   while(true){
    if(millis()-timer > TIMEOUT){
      sendATCommOnce(command);
      timer = millis();
    }
    char c;
    int i = 0;

    while(EC25.available()){
      c = EC25.read();
      DEBUG.write(c);
      response[i++]=c;
      delay(2);
      }
      if(strstr(response, desired_reponse)){
        return response;
        memset(response, 0 , strlen(response));
        break;
      }
  }
}

// send at comamand to module
void sendATCommOnce(const char *comm)
{
  EC25.print(comm);
  EC25.print("\r");
  delay(100);
}

1 Ответ

1 голос
/ 24 марта 2020

Итак, получается, что мне пришлось определить выходной порт UR C, чтобы использовать связь UART (не используя его по умолчанию).

Конфигурация по умолчанию была установлена ​​на usbat или usbmodem, что означает, что информация уведомления, которую я ждал, отправлялась на один из этих последовательных портов. Но я слушал UART (через пинты RX и TX) и поэтому не получал никаких уведомлений.

AT-команда QURCCFG может использоваться для установки того, на какой порт должны передаваться сигналы UR C. В этом случае я хочу, чтобы они были отправлены в UART:

AT+QURCCFG="urcport","uart1"
...