Отправка с ESP8266 на ПК
- Войдите на сайт для отправки комментариев
Добрый день!
Имеется вот такой код:
#include <ESP8266WiFi.h> #include <WiFiUDP.h> #include <stdio.h> WiFiUDP UDP; const char* ssid = "DESKTOP-P0OPNR2 4337"; const char* password = "12345678"; boolean wifiConnected = false; unsigned int localPort = 8888; boolean udpConnected = false; char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; const int BufSize = 128; String inputSTM_UART; char BufFromSTM[BufSize]; char BufFromPC[BufSize]; void setup() { Serial.begin(9600); Serial1.begin(9600); pinMode(D0, OUTPUT); wifiConnected = connectWifi(); if (wifiConnected) { udpConnected = connectUDP(); } } void loop() { if (wifiConnected) { if (udpConnected) { int packetSize = UDP.parsePacket(); if (packetSize) { GetFromPcSendToStm(); } GetFromStmSendToPc(); delay(20); } } } void GetFromPcSendToStm() { UDP.read(BufFromPC, UDP_TX_PACKET_MAX_SIZE); Serial.println(BufFromPC); delay(20); } void GetFromStmSendToPc() { digitalWrite(D0, HIGH); while (Serial.available()) { //Serial.readString().toCharArray(BufFromSTM, BufSize); //Serial.readBytes(BufFromSTM, BufSize); Serial.readBytesUntil('\n', BufFromSTM, BufSize); //Serial1.println(BufFromSTM); UDP.beginPacket(UDP.remoteIP(), UDP.remotePort()); UDP.write(BufFromSTM); UDP.endPacket(); delay(20); } digitalWrite(D0, LOW); } boolean connectUDP() { boolean state = false; if (UDP.begin(localPort) == 1) { state = true; } return state; } boolean connectWifi() { boolean state = true; int i = 0; WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); if (i > 10) { state = false; break; } i++; } return state; }
Принцип такой: с ПК я отправляю на ESP команды движения (см. функцию GetFromPcSendToStm) и переотправляю их на STM32 - эта часть работает безупречно. Затем, STM32 катит, опрашивает датчики и отправляет данные на ESP (см. функцию GetFromStmSendToPc), а та должна переслать данные на ПК.
И вот тут начинается беда: по WiFi ПК не получает вообще ничего!
Я начал грешить на отсылку STMкой или на прием ESPшкой. Как известно, у ESP есть еще один UART, который не умеет принимать, но умеет передавать. Я задействовал его и слал по нему те же данные, что и по WiFi - все приходило, жалоб нет. Т.е. косяк именно в передаче ESPшкой по WiFi.
Попробовал переписать одну из функций, переставив одну строку:
void loop() { if (wifiConnected) { if (udpConnected) { int packetSize = UDP.parsePacket(); if (packetSize) { GetFromPcSendToStm(); GetFromStmSendToPc(); } delay(20); } } }
Теперь ПК принимает данные от ESP, но только 1 штуку на каждую отправленную ПК команду.
Т.е. если я с ПК отправлю 3 раза команду ехать вперед, то получу 3 строки с данными датчиков!
Но, по моему плану (см. функцию GetFromStmSendToPc()), ESP должна слать строки до тех пор, пока ее буфер не опустошится.
Пожалуйста, подскажите, что я делаю не так?
Нужна глобальная переменная: IPAddress pcIP;
При приеме первого пакета в ней сохраните UDP.remoteIP().
pcIP = UDP.remoteIP();
строку 77 переписать:
UDP.beginPacket(pcIP, localPort);
Должно работать, пробуйте.
Ну и еще коечто изменить.
size_t s = Serial.readBytesUntil('\n', BufFromSTM, BufSize);
UDP.write(BufFromSTM, s);