Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 11 kwi 2025, o 16:55


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
    Autor Wiadomość
     Tytuł: Terminal w C#
    PostNapisane: 1 maja 2016, o 16:58 
    Offline
    Użytkownik

    Dołączył(a): 08 lut 2015
    Posty: 132
    Pomógł: 4

    Witam.
    Tworzę pierwszy program w C#, który ma za zadanie odbierać dane pochodzące z RS232 z AVR i wyświetlać je w labelu. Port wybierany jest przez comboxa i przycisk, który służy do otwierania portu, a gdy jest otwarty to ponowne jego kliknięcie powinno go zamknąć. Jednak po otworzeniu odbierane dane pojawiają się w labelu, ale przy próbie zamknięcia portu, czyli ponownego kliknięcia przycisku program zawiesza się. Nie pojawia się żaden komunikat błędu, po prostu "zamarza". Wrzucam tutaj prosty kod. Czy któś mógłby mi pomóc gdzie robię błąd w tym programie ? Używam Visual Studio 2015 i .NET 4.5.2.
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Pozdrawiam,
    drewpol



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 17:43 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Zamykanie i otwieranie portu daj do formuły
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Umożliwi to ewentualne przechwycenie błędu.

    A daj w komentarz zmiany tekstu które są wykonywane przy zamykaniu. Sprawdź czy w tedy działa.
    Bo możliwe że metoda empty dla string powoduje te zawieszanie.

    Próbowałeś z daniem breakpointa w momencie gdy port ma zostać zamknięty? Jak nie to daj tam punkt przerwania, puść program i krokowo sprawdź w którym momencie się program zawiesza.

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 17:53 
    Offline
    Użytkownik

    Dołączył(a): 08 lut 2015
    Posty: 132
    Pomógł: 4

    Zawiesza się w momencie zamykania portu:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    ale dlaczego to nie mam zielonego pojęcia ;(

    ------------------------ [ Dodano po: 4 minutach ]

    Jeżeli zmniejszę częstotliwość wysyłanych danych z AVR np co 1s to dziala bez problemu, ale kiedy zwiększam na np co 0,2s to zawiesza się. Być może jest jakieś polecenie, które zamyka port dopiero po odebraniu całej ramki danych ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 18:25 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Spróbuj użyć metodę DiscardInBuffer().

    Nigdy jej nie używałem, ale wg msdn usuwa ona dane z bufora odbioru.

    A dałeś ten fragment kody do try catch. Czasami wystarczy użyć przechwycenia błędu i problem znika.

    A zawieszać się może, dlatego że obsługiwany jest inny wątek - w tym przypadku odbioru danych.

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 18:38 
    Offline
    Użytkownik

    Dołączył(a): 08 lut 2015
    Posty: 132
    Pomógł: 4

    Użyłem tej metody, ale nic nie pomogło. Tak samo z przechwytywaniem błędu. W jaki sposób mogę zamknąć port tylko w momencie kiedy zdarzenie odbioru nie będzie obsługiwane ?

    ------------------------ [ Dodano po: 4 minutach ]

    Jeszcze mam w sumie pytanie. Odbieram dane przez rs232, powiedzmy jakąś liczbę np 1122. Teraz pojawia się problem, ponieważ w miejscu labela raz wyświetla poprawną liczbę np 1122, a czasem np 22, albo samą 1. I tak na zmianę:poprawna wartość potem niekompletna. Co może być przyczyną takiego zachowania? Używam ATmega32 z taktowaniem 16MHz i bibliotekę UART Mirka. W terminalu Putty wartość wyświetlana jest poprawnie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 18:48 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Zmień
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    na:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Albo w odbiorze danych spróbuj ten kod:

    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Tamten kod co masz mi się troszeczkę nie podoba bo stosuje on rekurencję i może się trochę zapętlić. Jednak jeżeli chcesz to stosować to nie zmuszam - prawo wyboru.


    Autor postu otrzymał pochwałę

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 19:17 
    Offline
    Użytkownik

    Dołączył(a): 08 lut 2015
    Posty: 132
    Pomógł: 4

    Tak jak mówię, pierwszy raz próbuję coś stworzyć w C#. Dziękuję bardzo za pomoc. Co do zamykania portu podczas trwania zdarzenia znalazłem taki kod. Trzeba wywołać zdarzenia zamykania w osobnym wątku. Sprawdza się to doskonale podczas zamykania krzyżykiem programu, ale jak przerobić to na zamykanie też przyciskiem button? Wstawiam tutaj kod:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    A co do sposobu z dodawaniem bufora to nie mogę go zastosować ponieważ dane wyświetlane w labelu pojawiają się tak jakby "w jednym ciągu" i wychodzą poza obszar Formy.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 19:43 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Ja też jestem początkującym, ale najwięcej człowiek uczy się pomagając innym.

    Spróbuj do przycisku dać ten fragment kodu:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Następnie dodaj tą metodę za przyciskiem:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Po wykonaniu metody CloseSerialOnExit wątek powinien zakończyć swój żywot.

    Pamiętaj o dodaniu odpowiedniej przestrzeni nazw.

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 19:54 
    Offline
    Użytkownik

    Dołączył(a): 08 lut 2015
    Posty: 132
    Pomógł: 4

    Zrobiłem tak jak mówisz, ale po kliknięciu przycisku wygląda na to, że nie obsługuje mi tego zdarzenia, ponieważ napis zmienia się na "rozłączono", a odbiór danych nadal następuje.
    W jaki sposób mogę wyświetlać odebraną informację ciągle w jednym miejscu na labelu, tak aby stara się kasowała i była ona nadpisywana nową ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 19:58 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Pokaż jak formatka wygląda, wklej jeszcze raz kod programu, bo może zostało coś z poprzednich prób i to powoduje złe działanie.
    Pokaż zrzut programu jak jest połączenie i zrzut po naciśnięciu przycisku zamknij port.

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 20:16 
    Offline
    Użytkownik

    Dołączył(a): 08 lut 2015
    Posty: 132
    Pomógł: 4

    Tu jest program:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Tu przed naciśnięciem przycisku:
    Obrazek

    Tak po naciśnięciu: chcę aby ta liczba wyswietlała się w miejscu napisu "label"
    Obrazek

    A tak po kolejnym nacisnięciu przycisku. Zmienia się stan na połącz, ale program dalej odbiera dane i wpisuje je po kolei tak jak widać:
    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 20:33 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Więc tak:
    widzę że zastosowałeś ten mój kod do odbioru danych. Aby zastosować wyczyszczenie wartości poprzez empty musisz dwa razy wywołać delegata. Zrób tak:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Jeżeli natomiast wysyłasz dane z AVR gdzie na końcu jest znak nowej linii możesz zastosować ReadLine, czyli taki kod:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Kod ten powinien za każdym razem na nowo uzupełniać dane w labelu.

    A co do rozłączania, spróbuj zrobić drugi przycisk który będzie służył do zamykania programu i umieść w nim kod:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Jeżeli ten program zadziała będziemy zmierzać w stronę dobra;)
    Najpierw mały krokami robić program, a potem będziemy zajmować się jego optymalizacją;)


    Autor postu otrzymał pochwałę

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 20:49 
    Offline
    Użytkownik

    Dołączył(a): 08 lut 2015
    Posty: 132
    Pomógł: 4

    Wykorzystałem Twój sposób na odczyt do końca linii :
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Równie dobrze działa to samo w ten sposób:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Co do przycisku dodałem drugi i przypisałem mu takie zdarzenie jak proponowałeś, ale nadal to samo. Raz uda mi się rozłączyć port, a raz program się zawiesza. Ten sposób z jego zamykaniem przy wyłączaniu aplikacji krzyżykiem jest dobry, bo nigdy mi jej nie zawiesił, ale nie wiem jak ją przenieść na przycisk.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 21:17 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    To teraz spróbujemy przed wyłączeniem portu usunąć metodę ze zdarzenia:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Po odłączeniu metoda jest znowu jest przypisywana do zdarzenia.

    A jaki masz ustawiony bufor ilości odebranych danych dla portu szeregowego?

    ---------------
    Spróbujemy jeszcze inaczej
    Tutaj masz mój terminal i sprawdź czy na nim wszystko działa:
    Załącznik:
    Cs_01_Terminal.zip


    Autor postu otrzymał pochwałę

    Załączniki:

    Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 21:33 
    Offline
    Użytkownik

    Dołączył(a): 08 lut 2015
    Posty: 132
    Pomógł: 4

    Teraz jest w porządku. Po kliknięciu w przycisk wszystko działa tak jak należy, port rozłącza się normalnie.
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    W jaki sposób mogę wywoływać poszczególną metodę w zależności od rodzaju odebranych danych z rs ? Przykładowo odbieram stringa "1=1122\n" i potem kolejny np "2=123\n" i w zależności od tego wywołać odpowiednią metodę, w której dokonuję obliczeń na tej liczbie i wyświetlam ją w wybranych labelach ?

    Kolego "danielos", zasłużyłeś tutaj na wodospad pochwał :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2016, o 21:45 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Ciesze się, że mogłem pomóc. Pewnie można byłoby ten problem inaczej rozwiązać, ale nic innego mi nie przychodzi do głowy. Spróbuj zmniejszyć bądź zwiększyć rozmiar bufora i sprawdzić jak się program zachowa (oczywiście wcześniej zakomentować usuwanie i dodawanie metody w zdarzeniu)

    A co do kolejnego pytania to ja bym zrobił to w ten sposób, że w warunku if sprawdzałbym te dane i później wywoływał odpowiednią metodę, np:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Albo zastosował do porównania gotowe metody które dostarcza klasa string. W zależności co byłoby lepsze i lepiej działało.
    Te sprawdzanie tego warunku wykonywałbym najlepiej w osobnym wątku co jakiś czas, tak aby nie zakłócić działania reszty programu. Ale na początek lepiej jednak zacząć od wykonywania czynności po naciśnięciu w przycisk, bądź od razu po odebraniu danych, niż zagłębiać się w wątki. Do wątków zawsze można później przejść;)

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 maja 2016, o 11:59 
    Offline
    Użytkownik

    Dołączył(a): 08 lut 2015
    Posty: 132
    Pomógł: 4

    Jeszcze raz dzięki za pomoc. Terminal już działa w porządku, odbiera dane, otwiera się i zamyka tak jak chce. Dodatkowo stworzyłem sobie wyskakujące okienko do inicjalizacji parametrów portu szeregowego. Teraz mam kolejne pytania. Czy jest możliwość w jakiś sposób zrobić takiej "animacji" w programie. Tzn odbieram dane z uart np 3000. W programie chciałbym mieć wykres kołowy, którego wskazówka odchyla się w zależności od wartości odebranej z uart? Wpadłem na pomysł, żeby wykorzystać obiekt picturebox i w zależności od wartości ładować do niego grafikę, ale jeżeli mam rozdzielczość 12bitową to nie widzi mi się tworzyć 4096 grafik...
    Mam nadzieję, że wyraziłem się jasno o co mi chodzi. Jest na to jakiś prostszy sposób ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 maja 2016, o 15:32 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 sty 2013
    Posty: 169
    Lokalizacja: Silesia - P-ce
    Pomógł: 10

    Możesz do tego wykorzystać komponent progress bar, ale jak chcesz mieć wykres kołowy, to pewnie są jakieś dodatkowe biblioteki czy coś podobnego, bo jak sam piszesz, tworzyć tyle osobnych grafik mija się z celem.

    Polecam utworzyć nowy wątek w tej sprawie, pewnie znajdzie się ktoś kto będzie potrafił odpowiedzieć na to pytanie, też jestem ciekaw rozwiązania tego zagadnienia;)

    _________________
    Niewiele trzeba by być szczęślwym.Wystarczy chcieć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 maja 2016, o 19:13 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    oczywiście że mozna i jest na to kilkka sposobów , można najprościej użyć progressbar'a , ale może być to dowolna animacja nawet podstawiona
    z pliku animowanego jak GIF czy krótki AVI , mozna też stworzyć własną kontrolkę , nie mniej przy tak małych ilościach danych jakie będziesz przesyłał
    niema to chyba sensu większego :)

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    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

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO