Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Zawieszanie się Arduino Ethernet Shield

strikexp 27 Feb 2016 21:29 1725 18
Telkom Telmor
  • #1
    strikexp
    Level 27  
    Mam taki przypadek w Arduino z Ethernet Shield i standardowej bibliotece do jego obsługi:

    1. Obiekt EthernetServer nasłuchuje na wybranym porcie czy z komputera nie nadchodzą jakieś zapytania HTTP. Gdy nadejdą to na kilka sekund zajmuje się jedynie sterowaniem portami.
    2. W międzyczasie oczekiwania serwera jest tworzony obiekt EthernetClient który wysyła na ten sam adres IP komputera dane.

    I niby wszystko dobrze działa ale do czasu... Gdy wyślę kilka razy zapytanie HTTP do Arduino to przestaje mi działać komunikacja Ethernet. Z tego co zauważyłem to Arduino nadal działa poprawnie i np odczytuje czujniki.
    Czyli wychodziłoby na to że problem jest w EthernetShield. Pewnie zapchany bufor lub coś w tym rodzaju.
    Czy ktoś zna sposób jak to można naprawić?
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • Telkom Telmor
  • #3
    strikexp
    Level 27  
    Program to właściwie typowy przykładowy serwer. Wzbogacony masą innych programów i klientem.
    Ustaliłem że to układ W5100 się zawiesza. I potrzebuję jedynie podpowiedzi jak przeczyścić w nim bufor lb cos w tym stylu.
    Dzisiaj nie miałem czasu ale jutro pewnie spróbuję po swojemu odebrać wszystko z bufora. Jednak kiepsko widzę tą czynność za pomocą domyślnej biblioteki.
  • Telkom Telmor
  • #5
    strikexp
    Level 27  
    Ramki malutkie po kilkadziesiąt bajtów. Możliwe że powodem zawieszania jest właśnie nawiązanie drugiego połączenia w tym samym czasie.

    To że zawiesza sie jedynie układ W5100 wywnioskowałem z tego, że Arduino działą nadal ale przestaje komunikować się z siecią.
  • #6
    strikexp
    Level 27  
    Panowie, aktualizacja problemu.
    Ustaliłem że Ethernet shield blokuje się nie ze względu na clienta i serwer. One działają bez zarzutu.
    Jednak jednocześnie korzystam z pakietu WoL poprzez bibliotekę UDP. Gdy próbuję nadać go kilkukrotnie to Ethernet Shield wariuje i komunikacja się urywa.


    Edit:
    Po kilku godzinach spędzonych na szukaniu przyczyny. Znalazłem niezamknięte połączenie UDP. Ciekawa sprawa, ponieważ znalazłem taki przykładowy kod gdzieś w internecie. Widocznie autor nie sprawdził że po kilku wywołaniach takiej funkcji zawiesza się układ W5100.
    Zostawiam tą informację pozostałym, aby nie zmarnowali na szukanie przyczyny tyle czasu co ja.
  • #8
    stomat
    Level 36  
    Dopnę się do tego tematu bo problem jest podobny. Mam Arduino z ethernetem na płytce. Próbuję standardowy przykład pobierania czasu z serwera NTP. Kod jest z "odgórnego" przykładu:

    Code: c
    Log in, to see the code


    Efekt jest taki że to działa przez około 46 odczytów a potem się wiesza. Nie pomaga restart przyciskiem, pomaga tylko odłączenie zasilania, po czym sytuacja się powtarza. Za każdym razem tak samo, jakby zapełniał się jakiś bufor. Nie sądzę żebym tylko ja miał taki problem. Może ktoś już się z tym spotkał?
    Code: c
    Log in, to see the code
  • #9
    User removed account
    User removed account  
  • #10
    stomat
    Level 36  
    A co to jest AS7 ? I co może pomóc debuger jak program zacina się po 46 pętlach wykonanych poprawnie?
  • #11
    User removed account
    User removed account  
  • #12
    stomat
    Level 36  
    Wisi bo nie wysyła albo nie odbiera pakietów UDP z serwera czasu. Kolega do którego wątku się podpiąłem miał podobny problem, pisze że go rozwiązał, niestety nie napisał jak, bo co to znaczy "niezamknięte połączenie UDP"? Protokół UDP nie używa "połączeń".
  • #14
    stomat
    Level 36  
    Code:
    0227062360000000049784952 ps= 48Seconds since Jan 1 1900 = 3728033827
    
    Unix time = 1519045027
    The UTC time is 12:57:07
    0227062360000000049784952 ps= 48Seconds since Jan 1 1900 = 3728033889
    Unix time = 1519045089
    The UTC time is 12:58:09
    0227062360000000049784952 ps= 48Seconds since Jan 1 1900 = 3726723201
    Unix time = 1517734401
    The UTC time is 8:53:21
    0

    Zero jest efektem działania "Serial.print(Ethernet.maintain())" potem jest pakiet wysyłany ode mnie do serwera, ps=48 to długość pakietu odebranego. Widać że przed zawieszeniem odbiera coś dziwnego. 12:57 i 12:58 to poprawna godzina, a zaraz potem jest niepoprawna 8:53 ??
    Używam takiej płytki :Link Też powinienem wyłączać kartę SD?
  • #15
    User removed account
    User removed account  
  • #16
    uzi18
    Level 23  
    Code: c
    Log in, to see the code


    brak poprawnej inicjalizacji - to nie Twoj problem ale tak powinno byc poprawnie
    brak kontroli czy pakiet przyszedl poprawnej dlugosci
    brak zamkniecia polaczenia

    Powyzszy kod powinien poprawnie dzialac i sie nie zawieszac.
    Przy okazji troszke czytelniejszy jest po poprawieniu wciec itp.
    Poza tym nie rozumiem po co Ci pobieranie czasu co 1s. :)

    Dodano po 1 [minuty]:

    AnicoZ wrote:
    stomat wrote:
    Też powinienem wyłączać kartę SD?

    Jeśli nie używasz SD to co ty wyłączać? Ponadto kata SD i ETH mają osobne stroby. W jaki niby sposób miałby kolidować między sobą? Chyba, ze ETH używasz w programie głównym a SD w przerwaniach lub na odwrót.


    Po to ze sa na tej samej magistrali SPI i musi byc pewnosc ze nie ma kolizji.
  • #17
    stomat
    Level 36  
    Po nic. To tylko drobna wprawka. A tu, między plusikami bajty niosące czas otrzymane z sieci:
    Code:
    0227062360000000049784952 + 222 +  + 53 +  + 82 +  + 235 + Seconds since Jan 1 1900 = 3728036587
    
    Unix time = 1519047787
    The UTC time is 13:43:07
    0227062360000000049784952 + 222 +  + 53 +  + 83 +  + 41 + Seconds since Jan 1 1900 = 3728036649
    Unix time = 1519047849
    The UTC time is 13:44:09
    0227062360000000049784952 + 222 +  + 33 +  + 83 +  + 97 + Seconds since Jan 1 1900 = 3726725985
    Unix time = 1517737185
    The UTC time is 9:39:45
    0

    Widać że dostaje jakiś błędny pakiet. I to jest chyba ten problem.
  • #19
    User removed account
    User removed account