Всем Привет! В настоящее время имеется связка Uno+ESP, по которой в компьютер по TCP или UDP передается посылка типа "L#106$0A53F02", где L# - событие, 106$ - идентификатор посылки, 0A53F02 - значение. Так как меж компьютером и модулем довольно большое расстояние, необходимо сделать подтверждение посылки. Если честно, не представляю как это сделать. Есть ли у кого примеры? Или существуют ли готовые решения? Заранее спасибо!
я бы ввел еще контрольную сумму <CS>, а отвечал бы подтверждением с добавленным или измененным байтом, например на "L#106$0A53F02"&<CS> ответ 'L+0x80'&"#106$0A53F02"&<CS> в этом примере вместо 'L' (0x4C) в подтверждении 0xCC
Зависит от реализации. Но для AT команд модуль не возвращает подтверждения до тех пор пока отправка данных по TCP будет успешна или не успешна, по крайней мере в справке по командам так http://esp8266.ru/esp8266-at-commands-v022/ AT+CIPSEND. Так что подтверждение не нужно. При чём тут передающая среда?
Протокол TCP гарантирует, что либо данные будут доставлены, либо передающая сторона узнает о том, что данные не были доставлены. И это не зависит от физического уровня, хоть голубиной почтой можно пакеты слать.
Дело всё в чем. Сейчас идет передача по 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); } } } Хотелось бы, чтоб если у нас нет подтверждения в течении секунды например посылка повторялась вновь. Вот и интересуюсь о наличии/отсутствии готовых решений....