Przeszukaj forum
Pokazywanie wyników dla tagów 'udp'.
Znaleziono 3 wyniki
-
Cześć, Mam dziwny problem którego nie mogę rozwiązać od dłuższego czasu. Potrzebuje wysłać cyklicznie do raspberry PI 4 pakiet UDP z stm32(mam nucle f207zg oraz f767zi, na obu jest to samo). Używam lwip 2.x. Moja funkcja została przerobiona z przykładu UDPechoserver i jest wywoływana w cyklicznym przerwaniu wygląda tak: void UDPSendString(void) { struct udp_pcb *upcb; struct pbuf *p; upcb=udp_new(); /*assign destination IP address */ ip_addr_t ipDest; IP4_ADDR(&ipDest, 192, 168, 0, 4); char buf[bufSize]; int size; err_t err; if (upcb) { /* Bind the upcb to the UDP_PORT port */ /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */ err = udp_bind(upcb, IP_ADDR_ANY, 0); if(err == ERR_OK) { size = snprintf(buf, bufSize, "B value=500\r\n"); p=pbuf_alloc(PBUF_TRANSPORT,size, PBUF_RAM); pbuf_take(p, buf, size); /* Connect to the remote client */ udp_connect(upcb, &ipDest, 8089); /* Tell the client that we have accepted it */ udp_send(upcb, p); /* free the UDP connection, so we can accept new clients */ udp_disconnect(upcb); } } // /* Free the p buffer */ pbuf_free(p); udp_remove(upcb); } Dziwne jest to, że jeżeli w adresie ip podam adres mojego PC na windows to w wiresharku widzę, że wszystko jest ok i pakiety są cyklicznie wysyłane. Natomiast gdy zmienię adres na raspberry to jakby nic nie było wysyłane. Idąc dalej... Za pomocą konsoli w raspberry jestem w stanie wysłać pakiet do pc a do stm już nie. Dziwne jest to, że wireshark nie widzi żadnych pakietów pomiędzy stm a raspberry. Nawet ping który jest wysyłany z raspberry do stm jest niewidoczny pomimo tego, że stm odpowiada. Dodam, że wszystkie urządzenia są podłączone do jednego switcha. Gdzie mogę szukać problemu? Będę wdzięczny za wszystkie sugestie.
-
Witam serdecznie wczoraj pol dnia glowilem sie nad pewnym tematem i nic nie wymyslilem, robie zdalny system pomiarowy w ktorym kilka modulów WiFi (jeden glowny ESP32 jest serverem, pozostale 8266 to klienci) beda zbierac dane z czujnikow, wysylac po UDP (moze w przyszlosci TCP) do serwera a stamtad powedruja na jakas strone/apke. Mam zrobiona na esp komunikacje UDP zarowno po stronie accespointa jak i klienta, natomiast przesylana ramka danych jest w formacie ASCII, problem (moze trywialny) to wyslanie i odebranie danych w formacie int/float (bo tego typu dane beda pochodzily z czujnikow). Probowalem roznych funkcji jak i sposobow rzutowania, zawsze arduino ide (bo w tym programuje ESP) zwraca mi bledy o niedozwolonej konwersji itp... Wrzuce kod na ktorym poprawnie sa wysylane dane jednak tak jak pisalem jako tekst w ASCII: Strona klienta: #include <ESP8266WiFi.h> #include <WiFiUdp.h> WiFiUDP Udp; unsigned int localUdpPort = 4210; // local port to listen on IPAddress ip(192, 168, 4, 1); void setup() { Serial.begin(115200); Serial.println(); WiFi.begin("ESP32", "123456789"); Serial.print("Connecting"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.print("Connected, IP address: "); Serial.println(WiFi.localIP()); } void loop() { while (WiFi.status() != WL_CONNECTED) { WiFi.reconnect(); delay(10000); Serial.print(".Reconnected"); Serial.println(WiFi.localIP()); } Udp.beginPacket(ip, localUdpPort); Udp.write("45"); // wysyłamy jeden bajt Udp.endPacket(); Serial.print("Wyslalem cos\n"); delay(5000); } Jak widac wyslanie tekstu nie jest problemem ale nie umiem wyslac danych np z typu int, gdyz wysyla sie calkmien zmieniona wartosc Na stronie serwera wyglada to tak: #include <WiFi.h> #include <WiFiClient.h> #include <WiFiAP.h> #include <WiFiUdp.h> #include <stdlib.h> WiFiUDP Udp; unsigned int localUdpPort = 4210; // local port to listen on char incomingPacket[255]; // buffer for incoming packets void setup() { Serial.begin(115200); Serial.println(); Serial.print("Setting soft-AP ... "); Serial.println(WiFi.softAP("ESP32", "123456789") ? "Ready" : "Failed!"); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); Udp.begin(localUdpPort); Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort); } void loop() { int packetSize = Udp.parsePacket(); if (packetSize) { // receive incoming UDP packets Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); int len = Udp.read(incomingPacket, 255); if (len > 0) { incomingPacket[len] = 0; } Serial.printf("UDP packet contents: %s\n", incomingPacket); } } Czy ktos moglby powiedziec albo moze wskazac przyklad jak poprzez UDP przeslac np float? Bede wdzieczny za rady
-
Witam serdecznie. Prosze wybaczyc, ze bez pisze bez polskich znakow, ale teraz do rzeczy. Chce nawiazac komunikacje pc - mcu przez Ethernet. Pracuje na Nucleo F746ZG. Stworzylem projekt z pomoca CubeMX (v4.27.0) w ktorym uruchomilem lwIP i podstawowe protokoly (w tym UDP), jako IDE uzywam Eclipse OpenSTM32. Ustalenie IP mikrokontrolera wykonywane jest przez DHCP. Ping oraz echo UDP dziala bez problemu (wyslanie pakietu UDP z dowolnego pc w sieci skutkuje odeslaniem wiadomosci na ten sam adres ip oraz port). Moj problem zaczyna sie wowczas, gdy zmodyfikowalem funkcje udpecho_raw_recv() i chce umiescic inne dane w odsylanym pakiecie. udp_sendto(pcb, p, addr, port); /* dziala jak echo */ udp_sendto(pcb, ethTxBuffer_p_x, addr, port); /* wysyla dane z bufora */ Po przeslaniu zwykle okolo 10 pakietow z pc i uzyskaniu odpowiedzi od mcu z pakietem o innej tresci nagle mikrokontroler przestaje odpowiadac (obrazek screenshot_udp.jpg). Wyglada mi to na problem z buforem pbuf w funkcji udpecho_raw_recv(), lecz nie wiem jak sie za to zabrac. Czy ktos z Was ma moze doswiadczenie z lwIP i moglby mi podpowiedziec co z tym zrobic? Przegladalem wiele stron z podobnymi problemami, ale jednak opisane tam rozwiazania lub rady mi nie pomogly. Z gory dziekuje! Kod wyglada nastepujaco: Zmienne globalne: /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ extern struct netif gnetif; static struct udp_pcb *udpPcb1_p; ip_addr_t ipaddress; static const char clientPacket_c[] = { 0x49, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x63, 0x61, 0x74, 0x73, 0x2e }; static const char reply[] = { 0x67, 0x6f, 0x74, 0x20, 0x69, 0x74, 0x20, 0x62, 0x72, 0x6f }; /* USER CODE END PV */ Funkcje: static void udpecho_raw_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port) { static struct pbuf *ethTxBuffer_p_x; ethTxBuffer_p_x = pbuf_alloc(PBUF_TRANSPORT, sizeof(reply), PBUF_RAM); memcpy(ethTxBuffer_p_x->payload, reply, sizeof(reply)); udp_sendto(pcb, ethTxBuffer_p_x, addr, port); pbuf_free(ethTxBuffer_p_x); } /*-----------------------------------------------------------------------------------*/ void udpecho_raw_server_init(u16_t port) { struct udp_pcb *pcb; printf("%s() ..........\n", __func__); pcb = udp_new(); udp_bind(pcb, gnetif.ip_addr.addr, port); /* no need to loop forever */ udp_recv(pcb , udpecho_raw_recv, pcb); } W main() z rzeczy dodanych przeze mnie jest tylko: udpecho_raw_server_init(20); while(1) { MX_LWIP_Process(); }