Изучаю работу EthernetUDP на ардуино: проблема с отправкой сообщений. Помогите
- Войдите на сайт для отправки комментариев
Вс, 06/01/2019 - 21:53
короче я уже з########я танцевать с бубном вокруг библиотеки "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 часов подряд не отрывая задницы от стула.
короче я уже з########я
Чего Вы там уже??? В общем, так, короче у Вас или длинее я не знаю, но в Вашем нежном возрасте, не стоит так выражаться в присутствии взрослых. Вы меня здоров разочаровали, даже кода Ваш смотреть не стал.
сори пригорело чуть прост сижу над этим уже 14-18 часов подряд не отрывая задницы от стула.
Оторвите, отдохните, а потом вернётесь - пользы большебудет.
извеняюсь за это просто очень сильно бомбануло, я посапал стало лучше, и да мне только 14. помогите мне пожалуйста у меня через неделю соревноания а я с библиотекой мучаюсь, просто весь интернет прошерстил в поисках ответов но не нашёл, ещё раз извеняюсь
да и мне кажется что отправка всётаки идёт правильно, но приём идёт через ASCII и при приёме он их конвертирует в символы
Mikhail_Drive,
У вас пример отправки идёт из поставки библиотеки получения времени с ntp сервера, там отправляется пакет 48 байт, а вы отправляете, если я правильно понял только 4. Естественно они никогда и не отправятся. Аналогично с приёмом, размер ntp packet size в вашем случае должен быть 4.
Еще почитайте про строки char, если уж так хочется потом присваивать req строку - потрудитесь в конце буфера присвоить ноль.
Update: да даже и не 4 у вас символов в отправке.... Больше, но нет фиксированного размера, а для корректной отправки его нужно знать.
в данный момент я отправляю фиксированно 4 байта но дело в том что я не знаю как сделать так чтобы приём пакетов осуществлялся с тегом : от кого, и что он отправил а проблему описанную выше я уже разобрал сам
В данный момент вы отправляете 4 пакета по байту, а не один пакет в 4 байта. Принимать же пытаетесь один на 48байт. Понятное дело, что в лучшем случае вы увидите в терминале IDE 1 байт данных и 47 байт произвольного мусора.
Так же, обратите внимание на то, что отправляете вы число (например - 5), а, приняв, - считаете, что это символ. Посмотрите в таблице ASCII как выглядит символ с порядковым номером 5. Думаю, что не так, как ожидали.
я исправил код на этот и получпю точное значение потенйиометра с другой ардуино но как мне сделать так чтобы приём пакетов осуществлялся с тегом от кого, и что он отправил
#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); //очищаем буфер для приема следующей команды } }Разработать самому структуру пакета, в котором например первые 8 байт это тэг отправителя, а потом 4 информация, всегда отправлять пакет данного конкретного размера, ну и естественно принимать всегда такой же, а потом уже парсить строку.
Введите еще пару байт в свой массив. Байт "ID отправителя" (если ip-адрес не подходит для идентификации) и "тип данных". Отправитель заполняет эти байты, получатель - анализирует их.