Как защитить буфер Serial1 от переполнения?

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

То ли я по-прежнему не догоняю, то ли что, но перед каждой операцией приёма данных приходится читать Serial. Иначе новые данные в него не пишутся и вообще происходит какая-то хрень. Помогите решить проблему.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я вчера машину заводил, так был какой-то странный звук. Толком не понял, то ли из машины, то ли у соседа свинья хрюкнула, но звук странный. Не подскажешь чего в машине посмотреть?

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

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

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Адово плюсую, товарищи! 

Я уже замучился с Serial, поэтому прошу простить.

Попытаюсь ещё раз.

Задача: Получать данные через GPRS-модуль.

Проблема, как я её понимаю: модем отвечает на любые команды и в конце концов эти команды, как я понимаю, забивают буфер Serial.

Происходит это оттого, что Arduino их не читает, ибо мне, вроде как, эти данные ни к чему. 

Итог: Буфер забит, новые сообщения Serial не принимает. Нигде не нашёл иформации на этот счёт. Хелп! 

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016
Вот такая фигня, товарищи! Компилятор ругается на void setup, что за наваждение?
 
exit status 1
a function-definition is not allowed here before '{' token
 
#define gsm Serial1
#include <DmxSimple.h>
int channel;
int value;
String atcusd = "at+cusd=1,\"*99#\",15";

void modemread() {
  do
  {
    delay(100);
  } while (gsm.find("OK") == false);
}
void gprsconnect() {

  gsm.println("ATE0");
  modemread();
  gsm.println("AT&D2");
  modemread();
  gsm.println("AT+CGDCONT=1,\"IP\",\"internet.tele2.ru\"");
  modemread();
  gsm.println("AT+CLIP=1");
  modemread();
  gsm.println(atcusd);
  modemread();
  gsm.println("at+xisp=0");
  modemread();
  gsm.println("at+xiic=1");
  modemread();
  do
  {
    gsm.println("at+xiic?");
    delay(100);
  } while (gsm.find("0.0.0.0") == true);
  gsm.println("at+xiic?");
  delay(100);
  Serial.println(gsm.readString());
}
void gprsget() {
  gsm.println("at+xiic?");
  delay(100);
  
  while(gsm.find("0.0.0.0")) {
    gprsconnect();
  }
  gsm.println("AT+FTPLOGOUT");
  modemread();
  gsm.println("AT+FTPLOGIN=Логин");
  do
  {
    delay(500);
  } while (gsm.find("User logged in.") == false);
  gsm.println("AT+FTPGET=test.txt,1,1");
  do {

  } while (gsm.find("+FTPGET:7"));

  while (gsm.available() > 0);
  {
    channel = gsm.parseInt();
    value = gsm.parseInt();
    DmxSimple.write(channel, value);
    Serial.write('\n\n');
    Serial.println("DMX:" + String(channel) + "," + String(value));
  }
  
  void setup() {
    delay(1000);
    Serial.begin(9600);
    gsm.begin(9600);
    do {            // проверяем готовность модема
      gsm.println("AT+CPAS");
      Serial.print(".");
      delay(100);
    } while (!gsm.find("0"));

    do {
      gsm.println("AT+CREG?");
      Serial.print(":");
      delay(100);
    } while (!gsm.find("+CREG: 0,1"));
    gprsconnect();
  }


  void loop() {
    // put your main code here, to run repeatedly:

  }

 

 

strarbit
Offline
Зарегистрирован: 12.06.2016

А поставьте } в строке 65

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

strarbit пишет:

А поставьте } в строке 65

Да Вы просто кудесник! Только что ставил - не помогало. А сейчас помогло!

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

С фигурными скобками разберитесь.

А с сериалом - ну и что, что Вам данные не нужны - вычитывать их всё равно надо. Вычитывайте.

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Ну вот уже вычитываю и даже приладил это к делу, но почему-то теперь программа не возвращает мне в serial строку, которую я читаю из FTP

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если не ошибаюсь команда flush периодически нужна. проверяем если ли данные, если да очищаем

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

jeka_tm пишет:

если не ошибаюсь команда flush периодически нужна. проверяем если ли данные, если да очищаем

Программа у Вас секретная, кроме Вас её никто в нормальном, компилируемом виде не видел, так что разбирайтесь сами. (кстати, мой первый пост Вы должны были понять именно так - ниформации нкикакой и что мы можем сказать?, но Вы не поняли)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ЕвгенийП ты меня с ТС не путай)))

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

jeka_tm пишет:

если не ошибаюсь команда flush периодически нужна. проверяем если ли данные, если да очищаем

Думаю, ошибаетесь. У Serial нет команды очистки буфера, к сожалению. flush раньше очищал, но потом решили, что это баг и теперь он так не делает.

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

ЕвгенийП пишет:

 у Вас секретная, кроме Вас её никто в нормальном, компилируемом виде не видел

Не понял. Как это не видел? Вот я сейчас добавил эту скобку и скетч трудится, ардуино в порт ответы шлёт. Только вот к FTP подключаться, кажется, расхотел.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Откуда мне знать куда Вы её добавили?

Нормально компилируемую программу никто, кроме Вас не видел.

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

ЕвгенийП пишет:

Откуда мне знать куда Вы её добавили?

Нормально компилируемую программу никто, кроме Вас не видел.

Пожалуйста! Вот компилируемый код. Теперь вопрос: почему у меня не получается достать нужные числа из строки?

#define gsm Serial1
#include <DmxSimple.h>
int channel;
int value;
String atcusd = "at+cusd=1,\"*99#\",15";

void modemread() {
  do
  {
    delay(100);
  } while (gsm.find("OK") == false);
}
void gprsconnect() {

  gsm.println("ATE0");
  modemread();
  gsm.println("AT&D2");
  modemread();
  gsm.println("AT+CGDCONT=1,\"IP\",\"internet.tele2.ru\"");
  modemread();
  gsm.println("AT+CLIP=1");
  modemread();
  gsm.println(atcusd);
  modemread();
  gsm.println("at+xisp=0");
  modemread();
  gsm.println("at+xiic=1");
  modemread();
  do
  {
    gsm.println("at+xiic?");
    delay(100);
  } while (gsm.find("0.0.0.0") == true);
  gsm.println("at+xiic?");
  delay(100);
  Serial.println(gsm.readString());
}
void gprsget() {

  gsm.println("at+xiic?");
  delay(100);
  while (gsm.find("0.0.0.0")) {
    gprsconnect();
  }
  gsm.println("AT+FTPLOGOUT");
  modemread();
  delay(100);
  gsm.println("AT+FTPLOGIN=ЛогинППФ");
  do
  {
    delay(100);
  } while (gsm.find("+FTPLOGIN:User logged in") == false);
  gsm.println("AT+FTPGET=test.txt,1,1");
  do {
    delay(10);
  } while (gsm.find("+FTPGET:7,"));
    while (gsm.available() > 0);
  {
    channel = gsm.parseInt();
    value = gsm.parseInt();
    DmxSimple.write(channel, value);
    Serial.write('\n\n');
    Serial.println("DMX:" + String(channel) + "," + String(value));
  }
}
void setup() {
  delay(1000);
  Serial.begin(9600);
  gsm.begin(9600);
  do {            // проверяем готовность модема
    gsm.println("AT+CPAS");
    Serial.print(".");
    delay(100);
  } while (!gsm.find("0"));

  do {
    gsm.println("AT+CREG?");
    Serial.print(":");
    delay(100);
  } while (!gsm.find("+CREG: 0,1"));
  gprsconnect();
  gprsget();
}


void loop() {
  gprsget();

}

Код должен возвращать два числа из файла на FTP, а возвращает число 7(размер файла) и первое число из файла.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Куда возвращать? Обратно на FTP?

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

ЕвгенийП пишет:

Куда возвращать? Обратно на FTP?

В переменные channel и value соответственно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Никогда не работайте вслепую. Ваши переменные долждны быть выведены в Serial для контроля СРАЗУ после строк 59-60 безо всякого DMX - сразу.

2. А что у Вас рельно приходит по FTP? Это файл? Посмотритеь на него можно?