Arduino принимает только альтернативные символы

Я пишу код Arduino для получения SMS от модуля SIM800, а затем отправляю это же сообщение обратно отправителю. Мой код выглядит следующим образом:

#include<SoftwareSerial.h>

SoftwareSerial mySerial(9, 10);//подключиться к контактам 9 и 10 на модуле GSM


const byte numChars = 128; // размер символа
char receivedChars[numChars]; // Сохраняем данные, считанные из SMS
boolean newData = false; //флаг для проверки поступления новых данных

void setup() {
 Serial.begin(9600);
 mySerial.begin(9600);
 Serial.println("<Arduino is ready>");
 mySerial.println("AT");
 mySerial.println("AT+CMGF=1"); //текстовый режим
 mySerial.println("AT+CNMI=1,2,0,0,0");
 mySerial.println("AT+CSQ"); //Проверяем силу сигнала
   while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Пересылаем полученный Serial на программный последовательный порт
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());//Пересылаем то, что software serial получил в последовательный порт
  }
}

void loop() {
  //код для проверки смс
  scanSMS();
  //Печать, если пришли новые данные
  showNewData();
  delay(25000);
}

void scanSMS() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '#'; //Маркеры начала и конца. Например. Текст SMS будет отправлен как #status#
    char endMarker = '#';
    char rc;
    while (Serial.available()) 
    {
      mySerial.write(Serial.read());//Пересылаем полученный Serial на программный последовательный порт
    }

    while (mySerial.available() > 0 && newData == false) {
      Serial.write(mySerial.read());//Пересылаем то, что software serial получил в последовательный порт

      rc = mySerial.read();

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

/*PRINT IF THERE IS A NEW DATA*/
void showNewData() {
 if (newData == true) {
   SendMessage(receivedChars);
 newData = false;
 }
}

/*SEND BACK WHATEVER SMS IS RECEIVED*/
void SendMessage(String receivedChars)
{
  Serial.print("here");
  mySerial.println("AT+CMGS=\"+xxxxxxxxxx\"\r"); // Заменить x на номер мобильного телефона
  mySerial.println("Humidity Alert!");// Текст SMS, который вы хотите отправить
  mySerial.print(receivedChars);
   mySerial.println((char)26);// ASCII-код CTRL+Z
}

Проблема в том, что модуль получает только альтернативные символы, а не все сообщение. Например, если я отправлю текст #program#, Arduino напечатает только porm или rga. Я что-то упустил здесь? Любая помощь приветствуется.

, 👍1


1 ответ


2

Вы писали:

Serial.write(mySerial.read());
rc = mySerial.read();

Здесь вы дважды вызываете mySerial.read() и таким образом читаете два символов из входного буфера порта. Затем вы пересылаете первый через Serial и обработайте второй. Обратите внимание, что вы обычно не должен читать два символа, если вы не проверили это mySerial.available() >= 2.

Возможно, вы захотите пересылать и обрабатывать по одному символу за раз, поэтому вызовите mySerial.read() только один раз в этом цикле:

rc = mySerial.read();  // чтение из mySerial
Serial.write(rc);      // вперед через Serial
// теперь обрабатываем rc
,