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 6 kwi 2025, o 22:49


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 15 maja 2015, o 12:38 
    Offline
    Nowy

    Dołączył(a): 18 kwi 2013
    Posty: 3
    Pomógł: 0

    Witam, w ramach pracy inz. muszę napisać aplikację która będzie komunikować się z moim urządzeniem. Nigdy prędzej nie programowałem w języku C#, ale korzystając m.in. z informacji na forum udało mi się nawiązać prostą komunikację która na razie pozwala odczytać odebrane dane. Mój problem polega na tym, że wywołując metodę Close() w trakcie odbierania danych program się zawiesza. Gdy wcisnę button odpowiedzialny za zamknięcie portu w przedziale czasu gdy procesor nie wysyła żadnych danych to bez problemu port się zamyka.
    Za odbiór danych odpowiada zdarzenie:
    Kod:
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                flaga_odbioru = 1;
                SerialPort sp = (SerialPort)sender;
                InputData = sp.ReadExisting()
                this.Invoke(new EventHandler(DisplayText)); // wyswietla odebrany tekst
                flaga_odbioru = 0;
            }

    Jak widać powyżej próbuję rozwiązać ten problem stosując flagę odbioru którą wykorzystuję w funkcji obsługi zdarzenia wciśniecia buttona odpowiedzialnego za zamknięcie portu:
    Kod:
     private void button2_Click(object sender, EventArgs e)
            {
                while (flaga_odbioru != 0) ;
               if (serialPort1.IsOpen == true) serialPort1.Close();
            }


    Macie może jakieś pomysły jak sobie z tym poradzić, gdzie tkwi problem ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 maja 2015, o 15:37 
    Offline
    Użytkownik

    Dołączył(a): 15 lut 2012
    Posty: 344
    Lokalizacja: Bydgoszcz
    Pomógł: 11

    Cześć!

    Ja na twoim miejscu zrobiłbym zamykanie portu w bloku try catch tak jak w poniższym przykładzie:

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


    Ja mam tak to zrealizowane(oczywiście dla przykładu nieco odchudziłem obsługę tej metody jedynie do zamknięcia portu) w jednym z moich programów i działa bez większych problemów.



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

    Dołączył(a): 25 maja 2012
    Posty: 296
    Lokalizacja: Chebzie Dolne
    Zbananowany użytkownik

    Pomógł: 6

    Podczas zamykania należy wywołać metodę Dispose(), a wcześniej można najpierw odpiąć zdarzenie DataReceive().
    Program się zawiesza dlatego że GarbageCollector nie zwolnił zasobów, a dlatego że zdarzenie nie zostało odpięte.

    _________________
    Inspekcja TV kanalizacji
    Programowanie



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 maja 2015, o 19:51 
    Offline
    Nowy

    Dołączył(a): 18 kwi 2013
    Posty: 3
    Pomógł: 0

    Niestety blok try catch nie pomógł - program nadal się zawiesza. W tej chwili próbuję zamknąć port w następujący sposób:
    Kod:
    private void button2_Click(object sender, EventArgs e)
            {
                serialPort1.DataReceived -= serialPort1_DataReceived; // odpinam zdarzenie odbioru danych
               // while (flaga_odbioru != 0) ;
               // Thread.Sleep(1000);
                serialPort1.Dispose();
                serialPort1.Close();
                btn_polacz.Enabled = true;
                btn_rozlacz.Enabled = false;
                label_status.Text = "Rozłączony";
                label_status.ForeColor = Color.Red;
            }

    Niestety, program nadal się zawiesza. Zauważyłem jednak, że stosując dodatkowy button którym najpierw odepnę zdarzenie to wyżej pokazany kod zamyka port zgodnie z oczekiwaniami. W związku z tym myślałem, że niepoprawna praca programu wynika z jakichś opóźnień stąd te zakomentowane while (flaga_odbioru != 0) czy Thread.Sleep(1000) lecz to nie to :/



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 maja 2015, o 21:03 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 25 maja 2012
    Posty: 296
    Lokalizacja: Chebzie Dolne
    Zbananowany użytkownik

    Pomógł: 6

    Pokaż kod gdzie tworzysz obiekt klasy SerialPort.

    _________________
    Inspekcja TV kanalizacji
    Programowanie



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 maja 2015, o 21:11 
    Offline
    Nowy

    Dołączył(a): 18 kwi 2013
    Posty: 3
    Pomógł: 0

    Całość wygląda na razie tak:

    Źle umieszczony listing - Różowo-zielony J.



    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: 6 ] 

    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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO