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.