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

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

короче я уже з########я танцевать с бубном вокруг библиотеки "EthernetUdp.h" а именно с функцией Udp.write() она отправляет 1 байт, я в неё запихиваю 1 байт на выходе получаю ничего, если сделать так Udp.write("text"); то всё нормально работает! короч вот код из  Ethernet шилд 

#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);
/////////////////////////////////////////////////////////////////////////////////////////////////////   



delay(1000);


}
  
void loop() {
  

int output = analogRead(potz);
Serial.print("///");
Serial.print(output);
Serial.println("///");
/////////////////////////////////////////////////
byte znah[4]= {0,0,0,0};
 if(output < 10){
   znah[0] = output;
   znah[1] = 255;
   znah[2] = 255;
   znah[3] = 255;
  }else if(output >= 10 && output <100){
    
    
   znah[0] = output / 10;
   znah[1] = output % 10;
   znah[2] = 255;
   znah[3] = 255;
      
    }else if(output >= 100 && output <1000){
   znah[0] = output / 100;
   znah[1] = output % 100 / 10;
   znah[2] = output % 10;
   znah[3] = 255;
      }else if(output >= 1000 && output <10000){
   znah[0] = output / 1000;
   znah[1] = output % 1000 / 100;
   znah[2] = output % 1000 / 10 % 10;
   znah[3] = output % 1000 % 10;
      }
//////////////////////////////////////////////////
Udp.beginPacket(ip,8888);
Udp.write(znah[0]);
Serial.println(znah[0]);
Udp.endPacket();
delay(10);
Udp.beginPacket(ip,8888);
Serial.println(znah[1]);
Udp.write(znah[1]);
Udp.endPacket();
delay(10);
Udp.beginPacket(ip,8888);
Serial.println(znah[2]);
Udp.write(znah[2]);
Udp.endPacket();
delay(10);
Udp.beginPacket(ip,8888);
Serial.println(znah[3]);
char* myStr1;
byte x = 21;
itoa(x, myStr1, 10); 
Udp.write(myStr1);
Udp.endPacket();

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

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

    }
  */


delay(1000);

}

а вот от приёмника (esp8266)

#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);  //очищаем буфер для приема следующей команды
}
}

 

как-то так 

а и вот с консоли текст

Configuring access point...mihail
..
WiFi connected
IP address: 
192.168.15.100
Local port: 8888






сори пригорело чуть прост сижу над этим уже 14-18 часов подряд не отрывая задницы от стула.

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Mikhail_Drive пишет:

короче я уже з########я 

Чего Вы там уже??? В общем, так, короче у Вас или длинее я не знаю, но в Вашем нежном возрасте, не стоит так выражаться в присутствии взрослых. Вы меня здоров разочаровали, даже кода Ваш смотреть не стал.

Mikhail_Drive пишет:

сори пригорело чуть прост сижу над этим уже 14-18 часов подряд не отрывая задницы от стула.

Оторвите, отдохните, а потом вернётесь - пользы большебудет.

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

извеняюсь за это просто очень сильно бомбануло, я посапал стало лучше, и да мне только 14. помогите мне пожалуйста у меня через неделю соревноания а я с библиотекой мучаюсь, просто весь интернет прошерстил в поисках ответов но не нашёл, ещё раз извеняюсь

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

да и мне кажется что отправка всётаки идёт правильно, но приём идёт через ASCII и при приёме он их конвертирует в символы 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Mikhail_Drive,
У вас пример отправки идёт из поставки библиотеки получения времени с ntp сервера, там отправляется пакет 48 байт, а вы отправляете, если я правильно понял только 4. Естественно они никогда и не отправятся. Аналогично с приёмом, размер ntp packet size в вашем случае должен быть 4.
Еще почитайте про строки char, если уж так хочется потом присваивать req строку - потрудитесь в конце буфера присвоить ноль.
Update: да даже и не 4 у вас символов в отправке.... Больше, но нет фиксированного размера, а для корректной отправки его нужно знать.

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

в данный момент я отправляю фиксированно 4 байта но дело в том что я не знаю как сделать так чтобы приём пакетов осуществлялся с тегом : от кого, и что он отправил а проблему описанную выше я уже разобрал сам

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

В данный момент вы отправляете 4 пакета по байту, а не один пакет в 4 байта. Принимать же пытаетесь один на 48байт. Понятное дело, что в лучшем случае вы увидите в терминале IDE 1 байт данных и 47 байт произвольного мусора.

Так же, обратите внимание на то, что отправляете вы число (например - 5), а, приняв, - считаете, что это символ. Посмотрите в таблице ASCII как выглядит символ с порядковым номером 5. Думаю, что не так, как ожидали.

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

я исправил код на этот и получпю точное значение потенйиометра с другой ардуино но как мне сделать так чтобы приём пакетов осуществлялся с тегом от кого, и что он отправил

#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 = 4; // Размер буфера для принимаемого 
byte znah[ 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(znah, NTP_PACKET_SIZE);
   

    int input ;
          if(znah[1]==255){
    input = znah[0];
    }else if(znah[2]==255){
    input = znah[0]*10 + znah[1];
    }else if(znah[3]==255){
    input = znah[0]*100 + znah[1]*10 + znah[2];
    }else                 {
    input = znah[0]*1000 + znah[1]*100 + znah[2]*10 + znah[3];  
    }    
 Serial.println(input);



    
 //   String  req=(packetBuffer);
//-------------------------------------------------------------------------------------------//
//                                                                                           //
//                   Это основной цикл нашей программы!!!                                    //
//                                                                                           //
//-------------------------------------------------------------------------------------------//    

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



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

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Разработать самому структуру пакета, в котором например первые 8 байт это тэг отправителя, а потом 4 информация, всегда отправлять пакет данного конкретного размера, ну и естественно принимать всегда такой же, а потом уже парсить строку.

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

Введите еще пару байт в свой массив. Байт "ID отправителя" (если ip-адрес не подходит для идентификации) и "тип данных". Отправитель заполняет эти байты, получатель - анализирует их.