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



Teraz jest 25 lis 2024, o 00:19


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 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