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



Teraz jest 4 gru 2024, o 17:06


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 ]
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 ]
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 ]
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
Avatar użytkownika

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

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 1 gość


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