Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# klasa SerialPort, port.close() obcina dane

adam220 20 Kwi 2017 14:26 693 6
  • #1 20 Kwi 2017 14:26
    adam220
    Poziom 14  

    Witam,
    zacząłem używać klasy SerialPort i mam kłopot w takim programie

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Do drukarki dolatują obcięte dane, brakuje kilka końcowych znaków.
    Jeśli wykomentuję zamykanie portu
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    to działa dobrze. Ale to obejście jest nie do przyjęcia.

    Chyba coś nie tak z opróznianiem bufora.

    Co zrobić żeby dane nie były obcinanane?

    0 6
  • #2 20 Kwi 2017 17:40
    Radzio M.
    Poziom 32  

    Sprawdzić czy bufor jest pusty i dopiero zamknąć, lub otrzymać feedback, że dane odebrane.

    0
  • #3 21 Kwi 2017 13:42
    adam220
    Poziom 14  

    Witam,
    dane odbiera drukarka ZEBRA (język ZPL).
    Gdy wykomentuję port.close wszystko działa dobrze, wysłanie danych zapala na ułamek sekundy diodę DATA i następuje wydruk.
    Jeśli port.close jest w kodzie, dioda zapala się na stałe i wydruku nie ma, gdyż nie nadeszły znaki polecenia wydruku, które sa na samym końcu (^Z).
    Dukarka nie daje feedbacku. Więc pozostaje opróżnić bufor.
    Ale jak?

    Dodano po 3 [godziny] 57 [minuty]:

    Jest rozwiązanie:

    przed port.close() dałem 100ms zwłoki "czynnej", takiej z Application.DoEvents() i działa.
    Wygląda na to że system operacyjny zamykał port zanim dane opuściły bufor.
    Czas 20ms to za mało, 50ms wystarcza, dałem 100ms.
    Może to zresztą zależeć od wielkości bufora i ilości danych.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #4 26 Kwi 2017 09:29
    adam220
    Poziom 14  

    @LED5W, temat odblokowany, zapraszam do komentowania.

    0
  • #5 26 Kwi 2017 22:27
    LED5W
    Poziom 32  

    Próbowałeś sprawdzać, czy port.BytesToWrite > 0?
    Używając Application.DoEvents trzeba uważać na ponowne wywołanie tej i innych metod obsługujących zdarzenia. Warto też zwrócić uwagę, że pętla, którą zastosowałeś zużywa całą moc procesora.

    0
  • #6 27 Kwi 2017 15:35
    adam220
    Poziom 14  

    Odczyt port.BytesToWrite > 0 to jest dla mnie nowość, chętnie sprawdzę i napiszę co tam znalazłem.

    Co do Application.DoEvents to myślałem że właśnie - w odróżnieniu od pętli "nicnierobiącej" czyli bez Application.DoEvents nie zużywam mocy, a obsługuję zdarzenia mojej aplikacji...

    0
  • #7 28 Kwi 2017 03:08
    LED5W
    Poziom 32  

    adam220 napisał:
    Co do Application.DoEvents to myślałem że właśnie - w odróżnieniu od pętli "nicnierobiącej" czyli bez Application.DoEvents nie zużywam mocy, a obsługuję zdarzenia mojej aplikacji...
    To jest logicznie niemożliwe. ;) Taka pętla przez większość czasu szybko się kręci sprawdzając, czy są jakieś wiadomości do obsłużenia. Można dodać System.Threading.Thread.Sleep, wtedy czas spania jest długi w stosunku do czasu sprawdzania i użycie procesora jest niskie. Generalnie lepiej nie robić rzeczy, na które trzeba czekać w wątku głównym.

    0