Witam wszystkich po dosc dlugiej przerwie. Jak niektorzy sprawnie zauwazyli ... zajmowalem sie prawie fabrycznym wytwarzaniem plytek PCB. Kurcze bo jak sie zacznie to pozniej smigaja jedna za druga.
No ale zeby to wszystko ze soba gadalo - trzeba miec dwukierunkowa komunikacje. I dzisiaj wlasnie taka zrobimy
Jako , ze dzisiaj humor dopisuje .... zaczynamy
Wymagania
Jako , ze jest to 3'cia czesc poradnika nie bede poruszac juz kwestii ktore omowilem we wczesniejszych poradnikach. Wiec jesli ktos chcialbys naprawde zrozumiec calosc prosze Cie o przeczytanie poprzednich czesci.
Wiec tak jak wspominalem wczesniej skoro poznalismy wysylanie to poznamy teraz odbieranie.
A poniewaz chcialbym , zebyscie wszyscy mogli poznac plusy i minusy kilku podejsc , ktore tu poznamy bedziemy omawiac je uzywajac kilka programistycznych sposobow. Jednakze , ze nie jest to lekcja dla developerow po dokladnie techniczne informacje odyslam Was do wujka "google"
Przygotowanie aplikacji
W tym wypadku zmodyfikowalem troszeczke aplikacje , ktorej uzywamy. Pozmienialem polozenie naszych guzikow , dodalem sobie kilka komponentow jak obrazki.
Ale ten najwazniejszy to dodanie kontrolki typu TextBox o nazwe tb_odebrane. Bedzie ona nam sluzyla jako okno do danych ktore sobie odbieramy
Odbieranie - proba pierwsza
Zaczniemy od zdefiniowania w kodzie - potrzebnych nam danych. Dane beda nastepujacego typu
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Pytanie .... gdzie umiescic te zmienne ? Wiec zaczniemy od umieszczenia ich w metodzie , ktora jest wywolywana po nacisnieciu guzika Konfiguruj
ale... jesl zwrocisz uwage ... chyba beda potrzebne nam nowe kontrolki. Musimy sobie byc w stanie zdefiniowac na jakim porcie bedziemy nasluchiwac komunikacji ktora chcemy odebra.
Wiec najpierw dodamy nowa kontrolke typu TextBox o nazwe tb_PORT_Odbieranie a posluzy ona nam do podania numeru portu , ktory wykorzystamy do odbierania danych.
Wiec nasza AD HOC zmodyfikowana aplikacja wyglada nastepujaco :
Czyli posiada teraz kontrolke ktora umozliwi nam dalsza prace z odbieraniem.
Wiec teraz mozemy wrocic juz do wlasciwego kodu ktory umozliwi nam odbieranie. Klikamy dwa razy na nasz guzik odpowiedzialny za konfiguracje i przenosimy sie dzieki tem automatycznie do metody ktora jest odpowiedzialna za obsluge tego zdarzenia.
Dodamy na samym koncu istniejeacego juz kodu nastepujace dwie linie
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Teraz kod wygladac powinenen cos w tym stylu :
Podjerzewam , ze powyzsza czesc kodu jest juz Ci znajoma prawda ? Wiec jest ona odpowiedzialna za utworzenie klienta UDP. Zostanie on tym razem utworzony na naszym porcie przeznaczonym do nasluchiwania oraz na IP naszego komputera.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Kod wyglada teraz tak
Wiec odpalamy nasz program i obserwujemy co sie dzieje!
Wnioski - proba pierwsza Wiec okazuje sie ,ze jak tylko odpalilismy program przestal dzialac ? Dlaczego tak sie stalo ? No wiec patrzymy na dokumentacje (przelaczylem ja specjalnie na jezyk PL ale to chyba nie byl dobry pomysl )
Wiec oczywiste staje sie ,ze mamy tzw watek blokujacy No i teraz co z tym babolem !? hehehhe wiec sprobujmy troszeczke innego podejscia.
Odbieranie - proba druga
Wiec dobrze- poznalismy jak przygotowac odbieranie teraz zrobmy zeby dzialalo. Pierwsze co zrobimy to usuniemy wczesniej dodana czesc kodu z metody konfiguracji guzika zostawiajac go tak jak bylo wczesniej. Powod ? Musimy zrobic tak aby nasze zmienne byly dostepne nie tylko w tamtej metodzie
Zaczynamy od poprawnego skonfigurowania zmiennych. Zaznaczylem w kodzie gdzie powinny byc.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Teraz w metodzie konfiguracyjnej (czyli tej ktora osbluguje guzik do Konfiguracji) - tak jak z pozostalymi elementami dodamy konfiguracje naszego odbierania
Zwroc prosze uwage ,ze kod ktory pewnie masz w tej metodzie zaznaczylem "zielona" strzalka i "zwinalem" dla wiekszej czytelnosci. Kod ktory dodalismy znajduje sie zaznaczony czerwona strzalka.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To co dzieje sie w tej metodzie jest juz Ci znane wiec nie bedziemy niepotrzebnie walkowac tego samego.
Wiec gdzie umiescimy nasze odbieranie ? No proste ... tuz po wyslaniu chcemy odebrac. Wiec klikamy dwa razy na guzik odpowiedzialny za wysylanie , ktor automatycznie wysyla nas do metody wywolywanej w odpowiedzi na to zdarzenie.
Dodajemy linie kodu i nasza metoda wyglada nastepujaco :
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jestesmy juz na etapie , ze zanim odpalimy program chcielibysmy juz widziec , ze cos odebralismy. Wiec musimy jakos nasze dane wyswietlic na specjalnie dodanej do tego kontrolce (tej ktora dodalismy wczesniej (u mnie nazywa sie tb_odebrane)
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wiec omowmy dokladnie co tutaj sie dzieje (dla latwosci uzylem kolorowych strzalek )
Zielona strzalka - wskazuje na to ze chcemy wpisac we wlasciwosc Text naszej kontrolki. Robilismy to juz wczesniej wiec to tylko takie male przypomnienie
Niebieska strzala - wykorzystuje domyslna metode zajmujaca sie ASCII aby z byte[] wyswietlic string. Uzywamy metody GetString
Czerwona strzala - tutaj podajemy nasza zmienna i od razu uruchamiamy metoda odbierajaca dane.
Hmmm no i co teraz ? Odpalamy Potrzebne nam tylko urzadzenie , ktore wysle nam pakiet na port RX (ten na ktorym nasluchujemy ) Dla celow pokazowych uzyje skryptu , ktory wysle mi okreslony ciag znakow zeby pokazac Wam , ze to dziala jak nalezy
Na drugim obrazku wyraznie widac , ze aplikacja odebrala to co wyslal moj skrypt ( zamiast skryptu proponuje uzyc ATB - ja uzywam skryptu bo jest mi szybciej napisac poradnik )
Wnioski - proba druga Wiec juz jest troszeczke lepiej bo mozemy ladnie sobie skonfigurowac aplikacje , ale co sie dzieje kiedy wysylasz pakiet ? No niestety - dopoki nie odbierzesz pakietu cala aplikacja wisi i nic sie nie da zrobic :O A co gorsza .... co sie stanie jak nie otrzymamy pakietu ?
Na powyzsze mozesz odpowiedziec pewnie sobie sam
Odbieranie poprawnie - podejscie 3 i pol
Wiec abysmy mogli poprawnie odbierac dane nie zaklocajac pracy naszego programu musimy podejsc do problemu technologicznie wrzucimy go sobie tak , aby wykonywal sie "niewidocznie" dla nas lub wykonywal sie tylko kiedy nadleca dane ktore trzeba odebrac.
Podzielimy ten poradnik na 2 : dla tych ktorzy korzystaja z .Net 4.5(1) oraz dla pozostalych
.Net 4.5.1 Jesli zagladasz tu to droga do sukcesu jest naprawde krotka. Tworzymy nowa metode ktora bedzie caly czas w tle sprawdzac czy nadlecialy nowe dane i jesli tak to uaktualni nasze pole tekstowe.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
A teraz szybkie objasnienie (jako , ze wiekszosc ma komentarz ) to ciekawa jest ostatnia linia. Jest to sposob aby uaktualnic kontrolke kiedy jestesmy w innym watku niz glowny watek aplikacji. Gdybysmy tego nie mieli napisanego w ten sposob aplikacja bylaby niestabilna/wysypala by sie / lub nie pokazywalby nadchodzacych wiadomosci.
A teraz tylko dodajemy wywolanie naszej metody w konfiguracji i po wszystkim
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W zasadzie mozna powiedziec , ze mowimy cos w rodzaju ... "zacznij sluchac korzystajac ze zmiennej sluchacz i skocz do metody OdbierajDane jak tylko pojawia sie nowe dane"
Oczywiscie , jest to bardzo skrocona definicja ale powinna dac Ci jakies lepsze wyobrazenia dlaczego robimy to w ten sposob.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No i to wszystko!
Podziekowania / Wnioski / Zaluzje Obie wyzej wymienione metody dzialaja wysmienice Gdyby ktos zlapal jakies babole zapraszam do komentowania.
Dla potwierdzenia video obslugujace Callbacki i Async
W tym miejscu chcialem Wam podziekowac za uwage i mam nadzieje , ze sie Wam przyda w/w kod. Jednosczesnie sorry za totalny chaos w poradniku. Mam nadzieje, ze wylapiecie to co Wam potrzebne.
Dołączył(a): 17 sie 2013 Posty: 3797 Lokalizacja: Grudziądz
Pomógł: 143
Ha ha po takim czasie pierwszy ... dzięki za 3 poradniczki. Przerabialiśmy to wcześniej w moim programie. Nie mniej dzięki tym poradnikom wszystko jest dla mnie jaśniejsze. Jak już zrobię płytkę i dojdą klamoty to pozmieniam sobie pare rzeczy w programie dzięki tobie.
Przydatny zastrzyk atnelański w 3 poradnikach. Może by z tego zrobić jeden poradnik wideo ?
Witam kolegów mam takie pytanie. Chciałbym odebrac ramke z uc która wygląda powiedzmy "1 ^ 45 " teraz by trzeba ten łańcuch podzielic i zapisać wartość 45 do odpowiedniej zmiennej którą wyznaczy znacznik 1. I za nic nie mogę z tym sobie poradzic dopiero raczkuję w c#. Udaję mi się tylko dobierać ramkę i wyświetlić w textboxie tak jak to było tu w wątki przedstawione. Z góry dzięki za pomoc! Pozdrawiam Bartek.
Witam dopiero zaczynam jaką kolwiek zabwe z c#. Program wysyła i odbiera dane z procka mam tylko problem z tym podziałem tzn jezeli zdefiniuje sobie jakis łańcuch znaków w programie to nie ma problemu ładnie dzieli. Problem natomiast sie zaczyna gdy podstawiam zmienna "wiadomosc" program sie wykrzacza... poniżej ta część kodu. Pozdrawiam.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
"arg" to zmienna z wartoscią temperatury zadanej która zmnienam za pomocą programu w C#. Steruje 3 takie temperatury samo sterowanie działa poprawnie natomiast to nieszczesne odbieranie nie chce ze mna wspópracowac tzn. odbieram paczke i wyświatlam textboxie "Temp_1 ^ 23" itd. zależnie od wartosci temperatury. Tak jak pisałem we wczesniejszym poście próba podziału konczy sie krzakiem. Dzięki za zainteresowanie sie problemem.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
"arg" to zmienna z wartoscią temperatury zadanej która zmnienam za pomocą programu w C#. Steruje 3 takie temperatury samo sterowanie działa poprawnie natomiast to nieszczesne odbieranie nie chce ze mna wspópracowac tzn. odbieram paczke i wyświatlam textboxie "Temp_1 ^ 23" itd. zależnie od wartosci temperatury. Tak jak pisałem we wczesniejszym poście próba podziału konczy sie krzakiem. Dzięki za zainteresowanie sie problemem.
Prosze Cie bardzo - troche przekombinnowales bo zrobiles sobie tablice stringow i to w tym miejscu nie wyjdzie
Koledzy bardzo proszę poratujcie, trzeci dzień już siedzę i krew mnie już zalewa. Napisałem sobie programik według poradnika kolegi 'RafPe' i ogólnie wszystko jest OK, ale... , mam problem z odebraniem danych wysyłanych z uC.
Na początku jak to wszystko jest połączone: ENC28J60 podłączony bezpośrednio do karty sieciowej komputera - uC odbiera i reaguje na komendy wysyłane z PC, program na PC nie reaguje na dane wysyłane z PC. To wersja która nie do końca działa.
Jak skonfiguruję program podając IP karty WiFi i wysyłam dane z terminala UDP na telefonie to wszystko działa zgodnie z oczekiwaniami.
Sprawdzam sobie na bieżąco jak wygląda ruch na karcie sieciowej i dane z uC przychodzą do komputera w oczekiwanej postaci.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a tak wygląda
Program na uC to niezmieniony kod z Bluebooka 21_ETH_komunikacja_UDP, jako ciekawostkę powiem że z TesteremUDP od Mirka komunikacja z uC działa bez problemu w obie strony więc wykluczam błędy w programie na uC.
Troche tak czytam Twojego posta i czuje sie zakrecony. Moglbys jasniej opisac Gdybys prosze mogl wkleic dane jak sprawdzasz ruch na karcie siecowej to wtedy moglbym dokladnie widziec o co Ci chodzi i byc bardziej w stanie Ci pomoc.
Niski pokłon dla kolegi @RafPe za wsparcie i motywację. Ponieważ niespecjalnie jeszcze ogarniam komunikację UDP to strzelę co było przyczyną tego że moja aplikacja na PC nie odbierała danych z AVR-ka (w razie czego proszę o sprostowanie). Jak się okazało pakiet wysyłany z AVR-a (świeżutki i pachniutki) nie będący odpowiedzią na zapytanie z PC-a nie miał adresu MAC odbiorcy, wystarczyło ręcznie wklepać adres MAC na jaki mają być kierowane pakiety i ładnie zaczęło działać.
Gdyby komuś... kiedyś.. przydarzył się podobny problem to w kodzie z Bluebook-a w pliku ip_arp_udp_tcp.c zmieniłem w funkcji send_udp_prepare:
Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości
Nie możesz rozpoczynać nowych wątków Nie możesz odpowiadać w wątkach Nie możesz edytować swoich postów Nie możesz usuwać swoich postów Nie możesz dodawać załączników