Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'LWIP'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Znaleziono 2 wyniki

  1. Cześć, na początek chciałbym się przywitać. Nie pamiętam czy pisałem coś na forum, a jeżeli tak to musiało być bardzo dawno. Zaprojektowałem urządzenie serwera HTTP na bazie stm32f207 i DP83848 (PHY). Oprogramowanie wygenerowałem z użyciem najnowszego CubeMX oraz wersji biblioteki dla procesora stm32f207 v1.9. Wykorzystałem LWIP jako stos TCP/IP oraz FreeRtos-a jako system, komunikacja TCP za pomocą netconn. Wygenerowany szablon zmodyfikowałem na wzór dostarczonego przez ST. Utworzyłem wątek http_server_netconn_thread(), w którym oczekuję na informacje ze strony. Nic odkrywczego. Pierwsza linia to utworzenie nowego wątku a poniżej jest sam wątek. httpTaskHandle = sys_thread_new("HTTP", http_server_netconn_thread, NULL, 4095, osPriorityHigh); void http_server_netconn_thread(void *arg) { static struct netconn *TCPListener, *newconn; static err_t err, conn_check, deleteErr; TCPListener = netconn_new(NETCONN_TCP); if (TCPListener != NULL) { err = netconn_bind(TCPListener, IP_ADDR_ANY, PORT_60662); if (err == ERR_OK) { netconn_listen(TCPListener); while(1) { netconn_set_recvtimeout(TCPListener, TIME_DELAY_500_MS); conn_check = netconn_accept(TCPListener, &newconn); if(osOK == osTimerStart (timeOutHttpServerHandle, TIME_DELAY_60_SECONDS)) { timerHttpStatus = TIMER_RUN; } if(ERR_OK == conn_check) { http_server_serve(newconn); netconn_close(newconn); netconn_delete(newconn); } osTimerStop(timeOutHttpServerHandle); } } else { netconn_close(newconn); netconn_delete(newconn); } } } Funkcja http_server_serve(newconn)() sprawdza czy przyszło zapytanie http i na nie reaguje. Również nic odkrywczego. void http_server_serve(struct netconn *conn) { connCheck = netconn_recv(conn, &inbuf); if(connCheck == ERR_OK) { if (netconn_err(conn) == ERR_OK) { // pobranie danych do bufora netbuf_data(inbuf, (void**)&buf, &buflen); analiza_metody_GET(buf); analiza_metody_POST(buf); } } netconn_close(conn); netbuf_delete(inbuf); } Jeżeli przyszło zapytanie ze strony, program wysyła odpowiedź na to zapytanie. I mógłbym powiedzieć, że wszystko działa. Program działa dobrze do czasu gdy pracuje w sieci lokalnej. Problemy zaczęły się gdy udostępniłem stronę poza sieć lokalną. Szczególnie zauważalne to jest gdy chcę wyświetlić stronę na smartfonie poprzez sieć komórkową. Dane do przeglądarki przesyłam za pomocą funkcji netconn_write_partly(). netconnResult = netconn_write_partly(conn, buffer_send, len, NETCONN_NOCOPY, &written); Niestety po pewnym czasie program blokuje się na tej funkcji i pozostaje już tylko reset. Sytuacje taką zauważyłem przy przesyłaniu do przeglądarki pakietów danych o objętości 6,5 kB. Przy przesyłaniu pakietów o objętości poniżej 1kB takich problemów nie zauważyłem. Przeglądając internet znalazłem parę wątków o problemach z oprogramowaniem od ST. Niestety nie pomogły mi rozwiązać mojego problemu. Pytanie do osób przerabiających temat serwera www na stm32 czy przerabiały podobny problem lub czy istnieje możliwość włączenia dla tej funkcji timeout-u umożliwiającego jej opuszczenie i dalsze działanie urządzenia?
  2. 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(); }
×
×
  • Utwórz nowe...