• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

помогите удалить "эхо" из буфера Serial.read

Diablosss

New member
C++:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <SoftwareSerial.h>

// WiFi parameters
const char* WIFI_SSID = "ssid";
const char* WIFI_PASSWORD = "pass";

// UDP parameters
const char* UDP_TARGET_IP = "192.168.137.127"; // IP of second ESP8266

// UART parameters
SoftwareSerial mySerial(D4, D3); // RX, TX

WiFiUDP udp;
unsigned long prevTimedelay = 0;
int Delay = 0;

const unsigned long BYTE_DELAY = 2; // delay betwen send bytes to mySerial

void setup() {
  Serial.begin(115200);
  mySerial.begin(10400);

  // Connect to WiFi
  Serial.print("Connecting to ");
  Serial.println(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // Start UDP
  udp.begin(4210); // udp and port
}

void loop() {
  if (mySerial.available() > 0) {
    unsigned long curTimedelay = millis();
    Delay = curTimedelay - prevTimedelay;
    Serial.println("");
    Serial.print(Delay);
    Serial.println("ms");
    prevTimedelay = millis();

    // Send serial data over UDP
    char buffer[256]; // buffer size. change if needed
    memset(buffer, 0, sizeof(buffer));
    mySerial.setTimeout(51); // read duration
    int bytesRead = mySerial.readBytes(buffer, sizeof(buffer));
    Serial.println("K-Line read OK ");
    Serial.print("Data: ");
    for (int i = 0; i < bytesRead; i++) {
      Serial.print(" ");
      Serial.print(buffer[i], HEX);
      Serial.print(' ');
    }
    Serial.println();

    udp.beginPacket(UDP_TARGET_IP, 4210);
    udp.write(buffer, bytesRead);
    udp.endPacket();
    Serial.print("Sent to WIFI: ");
    Serial.println(bytesRead);
    Serial.println();
  }

  int packetSize = udp.parsePacket();
  if (packetSize) {
    IPAddress remoteIP = udp.remoteIP();
    //if (remoteIP != WiFi.localIP()) {
      Serial.print("from WIFI Received: ");
      Serial.println(packetSize);
      char receivedBuffer[256]; // buffer . Adjust the size based on your requirements
      memset(receivedBuffer, 0, sizeof(receivedBuffer));
      udp.read(receivedBuffer, sizeof(receivedBuffer));

      Serial.print("writing to mySerail: ");
      digitalWrite(D3, LOW);
      delay(25);
      digitalWrite(D3, HIGH);
      delay(25);
      for (int i = 0; i < packetSize; i++) {
        mySerial.write(receivedBuffer[i]); // write to  mySerial
        Serial.print(" ");
        Serial.print(receivedBuffer[i], HEX);
        Serial.print(' ');
        delay(BYTE_DELAY); // delay between bytes
      }
      Serial.println();
  }
}
помогите исправить новичку код .Когда он работает вот такой лог :
Connecting to home
...........
WiFi connected
IP address: 192.168.137.127
from WIFI Received: 5
writing to mySerial: 81 29 F1 81 1C .

И когда читает мусериал получает в ответе помимо данных также эхо содержашее предыдуший запрос from WIFI Received: 5
writing to mySerial: 81 29 F1 81 1C:
K-Line read OK
Data: 81 29 F1 81 1C 83 F1 29 C1 EF 8F DC
Sent to WIFI: 12
Так вот надо сделать так чтобы после myserial.read и до отправки udp.write удалить из считанного фрейма то что было в udp.read(receivedBuffer, sizeof(receivedBuffer));.
Например :
WIFI Received: 5
writing to mySerial: 81 29 F1 81 1C
Запомнили
Потом K-Line read OK получаем
Data: 81 29 F1 81 1C 83 F1 29 C1 EF 8F DC и перед отправкой проверяем есть ли запомненное 81 29 F1 81 1C в этом фрейме, и ечли он есть удалем его перед о правкой и отправляемое получается уже
K-Line read OK
Data: 81 29 F1 81 1C 83 F1 29 C1 EF 8F DC
Size : 12
Modified data sent to Wofi : 83 F1 29 C1 EF 8F DC
Modified size sent to Wifi : 7.

Второй пример :
WIFI Received: 6
writing to mySerial: 82 22 F2 82 12 22
Запомнили
Потом K-Line read OK получаем
Data: 82 22 F2 82 12 22 84 F1 29 C1 EF 8F DC DD и перед отправкой проверяем есть ли запомненное 82 22 F2 82 12 22 в этом фрейме, и ечли он есть удалем его перед о правкой и отправляемое получается уже
K-Line read OK
Data: 82 22 F2 82 12 22 84 F1 29 C1 EF 8F DC DD
Size : 14
Modified data sent to Wofi : 84 F1 29 C1 EF 8F DC DD
Modified size sent to Wifi : 8.
 
Сверху Снизу