Не получается вывести в порт Serial после появления символа ">" (приглашения ввода)

danil_0
Offline
Зарегистрирован: 22.08.2020

Здравствуйте,

Пытаюсь организовать передачу данных по GPRS, данные вывожу в Serial (терминал ардуино) для отладки, а так же в SoftwareSerial (gsm-модуль)

SoftwareSerial SIM800(8, 9); 

После отправки команды AT+CIPSEND=length на gsm-модуль она должна ответить символом ">" и она отвечает судя по отладочным сообщениям.

Затем я должен передать байты в количестве length штук. Но перепробовал команды:

SIM800.write(i);
SIM800.print((char)i);
//Попытка послать управляющий символ Ctrl+Z
SIM800.write(26);

Естественно передача байтов ведется в цикле в количестве length раз и с задержкой delay.

Но ничего не помогает. Хотя если просто ввести сообщение в строке терминала и отправить. То она отправляется

Как в таком случае правильно передать программно байты в Serial? 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
danil_0
Offline
Зарегистрирован: 22.08.2020

Отбой. Моя вина. Оказывается, что после команды AT+CIPSEND=length приходит символ приглашения ввода ">" а затем нужно просто передать length байт и завершающий символ не требуется. Какой-то невнимательный человек поставил в условие отрицание (инверсию) "!" и в упор замечал =D

Но вот, что выяснил: оказывается Serial.readString() работает ну оочень медленно, на столько медленно, что я вижу эту задержку невооруженным взглядом. При работе с gsm-модемом советуют использовать конструкцию вида:

if (SIM800.available()) {                     // Если есть, что считывать...
    _resp = SIM800.readString();                // ... считываем и запоминаем
  }

Мне удобнее считывать по байтам поэтому заменил в коде if на while и readString() на read() (пример кода ниже)

И тогда посыпались ошибки, избавляться от которых пришлось выставлением собственных задержек =(

Чтобы не плодить темы, спрошу тут же. В коде ниже очень мало строк. Serial.println() используется для вывода отладочных сообщений. Есть глобальная строковая переменная _responseDec, которая заполняется внутри функции, а конструкция Serial.println("Read Done on response"); должна сигнализировать об окончании заполнения строки

String waitResponse() { 
  String _resp = "";
  _responseDec = "";

  int i = 0;
  while (SIM800.available()) {
    if (i >0)
      Serial.println("WE'R_LOSING_DATA____WE'R_LOSING_DATA____WE'R_LOSING_DATA");
    while (SIM800.available()) {
      byte c = SIM800.read();
      _responseDec = _responseDec + (int)c + " ";
      Serial.println("WTF _respDec=" + _responseDec);
      _resp = _resp + (char)c;
    }
    delay(500); i++;
  }
  Serial.println("Read Done on response");

  return _resp; 
}

И вот часть вывода в консоль:

12:51:27.594 -> WTF _respDec=65 84 43 68 68 69 84 61 49 44 48 44 48 13 13 10 69 82 82 79 
12:51:27.688 -> WTF _respDec=65 84 43 68 68 69 84 61 49 44 48 44 48 13 13 10 69 82 82 79 82 
12:51:27.781 -> WTF _respDec=65 84 43 68 68 69 84 61 49 44 48 44 48 13 13 10 69 82 82 79 82 13 
12:51:27.828 -> WTF _respDec= 
12:51:27.875 -> WTF _respDec= 13 
12:51:27.922 -> WTF _respDec= 13 10 
12:51:27.922 -> WTF _respDec= 13 10 43 
12:51:27.922 -> WTF _respDec= 13 10 43 67 

Т.е. переменная _respDec иногда "обнуляется" не доходя до Serial.println("Read Done on response"); 

Как такое может быть? Прерываний в коде не использую.

Бегло, выборочно читал (может я и ошибся форумом). Но вопрос не в этом. Я постоянно натыкаюсь на ваши сообщения, в которых, к сожалению, я для себя не нахожу ничего полезного. 

Но вы же видно опытный старожил форума? Вы же с легкостью можете ответить на мой последний вопрос. Ответе, помогите пожалуйста. Сможете?

 

 

rkit
Онлайн
Зарегистрирован: 23.11.2016

У тебя какой-то фарш вместо кода. Тебе учиться еще пару лет, прежде чем лезть в такие вещи.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Научится, особенно когда от модема фарш пойдет в виде левых звонков, длинных рекламных смс и прочего, и все это одновременно.