#1 Re: Програмування Arduino » Функция чтения из буфера серийного порта » 2016-01-20 22:29:38

Изменил - стало хуже. Теперь такое чувство вроде буфер накапливает символы, а потом их с задержкой в пару секунд выводит.

#2 Програмування Arduino » Функция чтения из буфера серийного порта » 2016-01-20 17:44:33

adima
відповідей: 4

Скетч не мой. Я новичек arduino, но есть желание разобраться. Неправильно отрабатывает "Функция чтения из буфера серийного порта gsm модема одной строки", а может быть и "Функция чтения всего буфера с серийного порта gsm модема" . При получении команды от модема gsmSerial определение "+CMT" происходит не каждый раз. Проверял в proteus и через монитор порта arduino на живом железе. Пробовал для теста менять "+СMT" на "1" опредение "1" тоже происходит не каждый раз.


#include <SoftwareSerial.h>

// переменные
SoftwareSerial gsmSerial(9, 11); // RX, TX
String currentStr = "";

/*
 * Функция чтения всего буфера с серийного порта gsm модема
 */
String readSerial() {
  String inData = "";
  if (gsmSerial.available() > 0) {
    int h = gsmSerial.available();
    for (int i = 0; i < h; i++) {
      inData += (char)gsmSerial.read();
    }
    return inData;
  }
  else {
    return "No connection";
  }
}

/*
 * Функция чтения из буфера серийного порта gsm модема одной строки
 */
String readSerialStr() {
  String content = "";
  boolean retStr=false;
  char currentChar;
  delay(100);
  while(gsmSerial.available() && retStr==false) {
    currentChar = gsmSerial.read();  
    //if (currentChar=='\n' || currentChar=='\r') {
    if (currentChar=='\n') {
      retStr=true;
    } 
    else {
      content.concat(currentChar);
    }
  }
  return content;
}


void setup(){
  // Начинаем последовательный обмен данными и ждем открытие порта
  Serial.begin(9600);
  Serial.flush();
  gsmSerial.begin(9600);
  gsmSerial.flush();
  // опрашиваем gsm-модем
  delay(500);
  gsmSerial.println("AT+CMGF=1"); // выставляем текстовым режим сообщений
  delay(500);
  gsmSerial.println("AT+IFC=1,1");  // Set Local Data Flow Control
  delay(500);
  gsmSerial.println("AT+CPBS=\"SM\""); // SIM Phonebook Memory Storage
  delay(500);
  gsmSerial.println("AT+CNMI=1,2,2,1,1"); // Включаю перехват SMS
  delay(500);

  Serial.println("System Ready ...");  // Инициализация после Сброса
}


void loop(){
     
    //if (gsmSerial.available()){  // если в буфере серийного порта есть данные (для теста)
    // Serial.print((char)gsmSerial.read());  // отправить на модем (для теста)
    //}
    
    
    //if (Serial.available()){  // если в буфере серийного порта есть данные (для теста)
    // gsmSerial.print((char)Serial.read());  // отправить на модем (для теста)
    //}


    if (gsmSerial.available()){  // если в буфере серийного порта есть данные
      currentStr=readSerialStr(); // считываем одну строку из буфера серийного порта посимвольно
      currentStr.trim();
      //Serial.print(currentStr);
      if (currentStr.startsWith("+CMT")) { // и если текущая строка начинается с "+CMT", то следующая строка является сообщением
        currentStr=readSerialStr(); // считываем еще одну строку из буфера серийного порта посимвольно
        currentStr.trim();
        Serial.println("currentStr");
        if (currentStr.compareTo("STATUS")==0) { // если sms сообщене это "STATUS"
          Serial.println("Command received. Execute 'STATUS'");
         }
      }
   }
} 

Підвал форуму