Изучаю работу EthernetUDP на ардуино: проблема с принятием сообщений. Помогите

Mikhail_Drive
Offline
Зарегистрирован: 25.07.2018

Привет, нужна помощь: я работаю с Ethernet Shield и с NodeMcu V1.0 (ESP8266) и пытаюсь связать их через интернет, протокол UDP при приёме данных на NodeMcu выдаёт белиберду :

⸮XcD⸮a⸮⸮t⸮⸮D⸮j⸮⸮⸮⸮⸮⸮b<5⸮!⸮1
GCe\⸮
.K⸮V⸮= @
⸮M⸮⸮⸮⸮{g⸮⸮q⸮+⸮⸮⸮&V⸮⸮⸮'⸮⸮j-⸮"lw⸮⸮⸮⸮⸮⸮@p|⸮n⸮= @
`⸮*.⸮⸮@⸮F⸮2⸮⸮⸮d⸮⸮⸮⸮8⸮⸮⸮dA⸮<g⸮⸮⸮/@⸮⸮⸮^⸮⸮⸮{,+⸮= @
⸮ԙ8⸮a⸮@
sadman41
Offline
Зарегистрирован: 19.10.2016

Почему же сразу белиберду... на мой взгляд - красивая клинопись.

Mikhail_Drive
Offline
Зарегистрирован: 25.07.2018

sadman41 пишет:

Почему же сразу белиберду... на мой взгляд - красивая клинопись.

Согласен, но к сожалению мне древний китайский не нужен :-)

Mikhail_Drive
Offline
Зарегистрирован: 25.07.2018

блинб почему не всё отправилось я там ещё кучу текста писал :(

вобщем принимая udp с телефона всё работает стабильно и без ошибок

вот код с NodeMcu


#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
int potz = A0;
byte ip[] = { 192,168,15,100 };
/////////////////////////////////////////////////////////////////////////////////////////////////////
    byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
    unsigned int localPort = 8888;       // local port to listen for UDP packets
    const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
    byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
    
    EthernetUDP Udp;
/////////////////////////////////////////////////////////////////////////////////////////////////////


void setup() {
  
///////////////////////////////////////////////////////////////////////////////////////////////////// 
   Serial.begin(9600);
   if (Ethernet.begin(mac) == 0) {Serial.println("Failed to configure Ethernet using DHCP");}
   Udp.begin(localPort);
/////////////////////////////////////////////////////////////////////////////////////////////////////   

Udp.beginPacket(ip,8888);

delay(1000);


}
  
void loop() {
int res_potz = analogRead(potz);
Serial.println(res_potz);
 Udp.write(res_potz);

/*if(res_potz >= 500){
  Udp.write("On");

    
  }else{
  Udp.write("Off");  

    }
    */
Udp.endPacket();

delay(1000);

}


вот с Ethernet Shield

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>
#include <WiFiUdp.h>


#define STASSID "mihail"
#define STAPSK  "12345678"

WiFiUDP udp;
const char* ssid     = STASSID;
const char* password = STAPSK;
unsigned int localPort = 8888;  
const int NTP_PACKET_SIZE = 48; // Размер буфера для принимаемого пакетов
char packetBuffer[ NTP_PACKET_SIZE]; //Буфер хранения пакетов


int LED = 5;
void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  Serial.print("Configuring access point...");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  IPAddress myIP = WiFi.softAPIP();
   Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
   udp.begin(localPort); // инициализируем UDP
  Serial.print("Local port: ");
  Serial.println(udp.localPort());
pinMode(LED,OUTPUT);
}

void loop()
{
    int cb = udp.parsePacket(); 
  if (!cb) {}
  else {
    udp.read(packetBuffer, NTP_PACKET_SIZE);
    Serial.println(packetBuffer);
    String  req=(packetBuffer);

if (req.indexOf("On") != -1){digitalWrite(LED,1);}
if (req.indexOf("Off") != -1){digitalWrite(LED,0);}



memset(packetBuffer, 0, NTP_PACKET_SIZE);  //очищаем буфер для приема следующей команды
}
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Начнем с https://www.arduino.cc/en/Reference/EthernetUDPBeginPacket - сравните со своим лупом. Метод write() сует в пакет только один байт, а из analogRead их вылезает два.

Далее... Я не сильный специалист в ESP, но синтаксис WiFiUDP схож с EthernetUDP. Посему возьмем https://www.arduino.cc/en/Reference/EthernetUDPRead  и обратим внимание на то, как вычисляется и применяется packetSize. Как мне кажется - это более разумный способ , нежели чтение 48 байт при двух отосланных с другого конца.

Mikhail_Drive
Offline
Зарегистрирован: 25.07.2018

 

sadman41 пишет:

Начнем с https://www.arduino.cc/en/Reference/EthernetUDPBeginPacket - сравните со своим лупом. Метод write() сует в пакет только один байт, а из analogRead их вылезает два.

Далее... Я не сильный специалист в ESP, но синтаксис WiFiUDP схож с EthernetUDP. Посему возьмем https://www.arduino.cc/en/Reference/EthernetUDPRead  и обратим внимание на то, как вычисляется и применяется packetSize. Как мне кажется - это более разумный способ , нежели чтение 48 байт при двух отосланных с другого конца.

извиняюсь я не могу зайти  на сайт arduino.cc из за провайдера, можете скинуть содержимое сайтов

 

sadman41
Offline
Зарегистрирован: 19.10.2016

С мобильного устройства это затруднительно. Вставьте ссылки в гуглотранслятор - это помогает обойти тупые запреты.

Mikhail_Drive
Offline
Зарегистрирован: 25.07.2018

я решил проблему с заходом на сайт при помощи 3 минут унижений провайдера по телефону, но дело не в том что я не могу принять данные я не могу их отправить, если глянуть 1 ссылку то можно заметить что в коде (моём ) есть такая же сторка но проблем от неё столькоже как и от работающей, ну а с чтением всего буфера спасибо но это лишь тестовая модель, и в будующем я не знаю кол-во байтов которое я буду отправлять/принимать.

sadman41
Offline
Зарегистрирован: 19.10.2016

Строка есть, да не там, где надо - в setup() вместо loop()

Mikhail_Drive
Offline
Зарегистрирован: 25.07.2018

извеняюсь вы про какой скеч, можете показать какая строчка

сори я не понял сразу г

Mikhail_Drive
Offline
Зарегистрирован: 25.07.2018

чел спасибо огромное выручил очень сильно 

Mikhail_Drive
Offline
Зарегистрирован: 25.07.2018

не подскажешь как можно отправлять данные больше байта?