#1 2016-01-20 17:44:33

adima
Учасник
Зареєстрований: 2016-01-18
Повідомлень: 2

Функция чтения из буфера серийного порта

Скетч не мой. Я новичек 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'");
         }
      }
   }
} 

Неактивний

#2 2016-01-20 19:15:02

Йожэг
Учасник
Зареєстрований: 2015-12-30
Повідомлень: 97

Re: Функция чтения из буфера серийного порта

    if (Serial.available() > 0) {
        String str = Serial.readStringUntil('\n');
        if (str.startsWith("+CMT")) ...

А если как-то так вычитывать? Да и не помешало бы всё вычитанное отправлять в Serial Monitor для отладки. Бывает логика подсказывает одно, а глазами увидишь - и всё становится ясно.

____________________________
"серийный порт" - для маньяков

Неактивний

#3 2016-01-20 22:29:38

adima
Учасник
Зареєстрований: 2016-01-18
Повідомлень: 2

Re: Функция чтения из буфера серийного порта

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

Неактивний

#4 2016-01-21 17:14:42

Йожэг
Учасник
Зареєстрований: 2015-12-30
Повідомлень: 97

Re: Функция чтения из буфера серийного порта

Да, метод Serial.readStringUntil('\n') читает полностью строку до служебного символа новой строки, а только потом её отдаёт. Зато потеряться ничего не должно.

Неактивний

#5 2016-05-27 21:40:52

anatoliy
Гість

Re: Функция чтения из буфера серийного порта

Может просто данные не все успевают прейти по UART скорость то не большая, а ты уже пытаешься прочитать из буфера весь пакет. После каждой первичной проверки наличия в порту данных, поставь задержку, в зависимости от скорости порта и длины всего пакета.

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

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