Подтверждение приёма пакета

Тема в разделе "Arduino & Shields", создана пользователем Anton.M, 24 мар 2016.

  1. Anton.M

    Anton.M Нуб

    Всем Привет!
    В настоящее время имеется связка Uno+ESP, по которой в компьютер по TCP или UDP передается посылка типа "L#106$0A53F02", где L# - событие, 106$ - идентификатор посылки, 0A53F02 - значение. Так как меж компьютером и модулем довольно большое расстояние, необходимо сделать подтверждение посылки. Если честно, не представляю как это сделать. Есть ли у кого примеры? Или существуют ли готовые решения?
    Заранее спасибо!
     
  2. Onkel

    Onkel Гуру

    я бы ввел еще контрольную сумму <CS>, а отвечал бы подтверждением с добавленным или измененным байтом, например на "L#106$0A53F02"&<CS> ответ 'L+0x80'&"#106$0A53F02"&<CS> в этом примере вместо 'L' (0x4C) в подтверждении 0xCC
     
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    Протокол TCP гарантирует доставку и шлет контрольную сумму, зачем еще какие-то подтверждения?
     
  4. Onkel

    Onkel Гуру

    но не гарантирует, что по радиоканалу добьет
     
  5. zealot01

    zealot01 Нерд

    Зависит от реализации. Но для AT команд модуль не возвращает подтверждения до тех пор пока отправка данных по TCP будет успешна или не успешна, по крайней мере в справке по командам так http://esp8266.ru/esp8266-at-commands-v022/ AT+CIPSEND. Так что подтверждение не нужно.
    При чём тут передающая среда?
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Протокол TCP гарантирует, что либо данные будут доставлены, либо передающая сторона узнает о том, что данные не были доставлены. И это не зависит от физического уровня, хоть голубиной почтой можно пакеты слать.
     
  7. Anton.M

    Anton.M Нуб

    Дело всё в чем.
    Сейчас идет передача по AT-команде с использованием режима "unvarnished transmission mode", т.е. не задается длина строки, и не возвращается ОК.
    Код (C++):
    <...>
    Serial.println("AT+CIPMUX=0"); // установка в режим одиночного соединения
    delay(500);
    Serial.println("AT+CIPSTART=\"UDP\",\"192.168.1.33\",10000,10010,0"); //открываем UDP-соединение
    delay(500);
    Serial.println("AT+CIPSEND"); // начинаем приём-передачу
    delay(500);
    Serial.println("Wi-Fi connected, UDP is opened.");
    Serial.flush();
    <...>
    Serial.println("L#"+str);
    От компьютера идут управляющие команды, в виде start, syncro, reset и т.п. вида:

    Код (C++):

    void loop() {
    serialEvent();
    }

    void serialEvent() {
       if (Serial.available()) {         //если есть принятый символ,
        receive = Serial.read();            //  то читаем его и сохраняем в val
        if (receive == 'R') {               //  если принят симовол 'H',...
           time0=0;
           time1=0;
        }
        if (receive == 'S') {               //  если принят симовол 'L',
           Serial.println(time0,HEX);
        }
      }
    }
    Хотелось бы, чтоб если у нас нет подтверждения в течении секунды например посылка повторялась вновь. Вот и интересуюсь о наличии/отсутствии готовых решений....