• Система автоматизации с открытым исходным кодом на базе 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.
 
Сверху Снизу