Arduino и SIM900 постоянно недоступны.

У меня проблема с моей Arduino MEGA 2560 и модулем SIM900. Я хочу сохранить выходные данные AT-команд, но у меня нет такой возможности. Если я напечатаю mySerial.available(), я получу только 0. С другой стороны, отправка SMS работает нормально.

Initializing...
AT+CMGF=1
AT+CNMI=2,2,0,0,0

OK
Done
AT+CMGL="REC UNREAD"

OK
0
0
0
0
0
0
0
0
0
0
0

Это скетч, который я использую:

#include <SoftwareSerial.h>

//Создаем последовательный объект программного обеспечения для связи с SIM900
SoftwareSerial mySerial(11, 10); //SIM900 Tx & Rx подключен к Arduino №7 и усилителю; #8
String incoming="";
String incoming2="";
String messages="Test";
String auth_num="+49xxxxxxxxx";
char incoming_char=0;

String response = "";

const byte numChars = 32;
char receivedChars[numChars];
boolean newData = false;

int period = 6000;
unsigned long time_now = 0;


void setup()
{
  //Начинаем последовательную связь с Arduino и Arduino IDE (Serial Monitor)
  Serial.begin(9600);

  //Начинаем последовательную связь с Arduino и SIM900
  mySerial.begin(9600);

  Serial.println("Initializing..."); 
  delay(1000);

  mySerial.println("AT+CMGF=1");
  mySerial.println("AT+CNMI=2,2,0,0,0"); // Решает, как следует обрабатывать вновь пришедшие SMS-сообщения
  //mySerial.println("ATE0");
  updateSerial();
  Serial.println("Done");

  //sms_versenden("xxxxxxxx", "текст");
}

void loop()
{
  updateSerial();
  Serial.println(mySerial.available());
  if(millis() - time_now > period){
    time_now = millis();
    if(sms_erhalten()){
      sms_autorisiert();  
    }
  }
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Пересылаем полученный последовательный порт в последовательный порт программного обеспечения
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());//Пересылаем полученное программное обеспечение Serial в последовательный порт
  }
}

void sms_versenden(String rufnummer,String text)
{
  mySerial.println("AT"); //Квитирование связи с SIM900
  updateSerial();

  mySerial.println("AT+CMGF=1"); // Настройка режима ТЕКСТ
  updateSerial();
  if(rufnummer.startsWith("0")){
    rufnummer.remove(0,1);
    mySerial.print("AT+CMGS=\"+49");
    mySerial.print(rufnummer);
    mySerial.println("\"");
  }else if(rufnummer.startsWith("+49")){
    mySerial.print("AT+CMGS=\"");
    mySerial.print(rufnummer);
    mySerial.println("\"");
  }else{
    return;
  }
  updateSerial();
  mySerial.print(text); //текстовое содержимое
  updateSerial();
  mySerial.write(26);
}

boolean sms_erhalten()
{
  mySerial.print("AT+CMGL=\"REC UNREAD\"\r");
  //recvWithEndMarker();
  Serial.println(mySerial.available());
  delay(30);
  while (mySerial.available()){
    String inData = mySerial.readStringUntil('\n');
    Serial.println("Got reponse from SIM900: " + inData);
  }
  /*if(mySerial.available()>0){

    incoming = mySerial.readString();
    Serial.print(incoming);    
    delay(10);
  }*/ 
  updateSerial();
  if(incoming.startsWith("+CMGL:"))
  {
    return true;  
  }
  else{
    return false;
  }
}


void recvWithEndMarker() {
    static byte ndx = 0;
    char endMarker = '\n';
    char rc;

    while (mySerial.available() != 0 && newData == false) {
        rc = mySerial.read();
        updateSerial();
        if (rc != endMarker) {
            receivedChars[ndx] = rc;
            ndx++;
            if (ndx >= numChars) {
                ndx = numChars - 1;
            }
        }
        else {
            receivedChars[ndx] = '\0'; // завершаем строку
            ndx = 0;
            newData = true;
        }
    }
}

void showNewData() {
    if (newData == true) {
        Serial.print("This just in ... ");
        Serial.println(receivedChars);
        newData = false;
    }
}
String getResponse() {
    while(mySerial.available()>0){
        response += mySerial.read();
    }
    return response;
}

Заранее спасибо за каждую идею. Браводельта

, 👍0

Обсуждение

если вы включите эхо, оно не выведет команды обратно? проверь проводку, @Juraj

@Juraj Эхо включено, и, как вы можете видеть в первом блоке кода, я получаю ответ, но не могу сохранить его в строке., @Bravodelta

попробуйте mySerial.println("AT+CMGL=\"REC UNREAD\"");, @Juraj

@Юрай К сожалению, это тоже не работает, @Bravodelta


1 ответ


-2

Вместо создания собственной функции используется функция SerialEvent в arduino. В Arduino он действует как последовательное прерывание. Например:

String inputString;
void serialEvent() {
      while (Serial.available()) {
        // получаем новый байт:
        char inChar = (char)Serial.read();
        // добавляем его во входную строку:
        inputString += inChar;
        // если входящий символ является новой строкой, установите флаг, чтобы основной цикл мог
        // делаем что-нибудь с этим:
        if (inChar == '\n') {
          Serial.Println(inputString);
        }
      }
    }
,

не используйте серийное событие. у него нет преимущества. это то же самое, что проверка Serial.available() в цикле, @Juraj

Система последовательных событий не действует как прерывание. Это ничем не отличается от добавления if (Serial.available())... в вашу функцию loop(). Мне бы хотелось, чтобы Arduino никогда не реализовывал это — это глупая идея., @Majenko

@Юрай, почему бы и нет использовать функцию серийного события? Какой вред это причиняет?, @Vaibhav

@Маженко, ты пробовал функцию серийного события?, @Vaibhav

@Vaibhav Хуже того - мне пришлось реализовать это на совместимой платформе, а потом пришлось принять душ с гидроксидом натрия, чтобы смыть с кожи пятна..., @Majenko

это дает ложное ожидание, что оно будет выполнено независимо от того, что вы делаете в цикле(): задержки, бесконечные циклы, @Juraj