Изучаю работу 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. Думаю, что не так, как ожидали.
я исправил код на этот и получпю точное значение потенйиометра с другой ардуино но как мне сделать так чтобы приём пакетов осуществлялся с тегом от кого, и что он отправил
Разработать самому структуру пакета, в котором например первые 8 байт это тэг отправителя, а потом 4 информация, всегда отправлять пакет данного конкретного размера, ну и естественно принимать всегда такой же, а потом уже парсить строку.
Введите еще пару байт в свой массив. Байт "ID отправителя" (если ip-адрес не подходит для идентификации) и "тип данных". Отправитель заполняет эти байты, получатель - анализирует их.