Timer w kliencie TCP

0

Witam

Piszę program który ma komunikować się z terminalem wagowym i nim sterować. Komunikacja odbywa się przy użyciu TCP - użyłem do komunikacji klienta TCP. Cała komunikacja działa, odczytuję komunikaty, mogę wysyłać swoje do terminala. Teraz jestem na etapie układania zadań na zasadzie "jeśli status w a to zrób b" itd.
Mam taki fragment kodu odpowiedzialny za logowanie po uruchomieniu programu:

string odp = KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_RejestrStatusu);
                tb_komunikaty.Text = odp;
                if (odp[0] == 'B') // F - neutralny, B - pierwsze logowanie wagi od włączenia
                {
                    KomunikacjaSieciowa.WysylkaDoWyswietlaczaWagi_3linie(WysylkaDoWyswietlacza_Komunikaty.LogWitaj,WysylkaDoWyswietlacza_Komunikaty.LogZaloguj,WysylkaDoWyswietlacza_Komunikaty.LogNrOperatora,WysylkaDoWyswietlacza_KtoreLinie.Kom_Wyswietlacz_3linie_L1_L2_L4);
                    string odpF1 = KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_ZatwierdzoneF1);
                    while (odpF1 != "")
                    {
                        tb_komunikaty.Text = Environment.NewLine + odpF1;
                        int odpF1_int = Convert.ToInt32(odpF1);
                        //tutaj będzie dalszy ciąg 
                    }
 

Jak mogę "zapętlić" sprawdzanie odpF1 żeby faktycznie w momencie jak pojawi się jakiś string w odpowiedzi system przeszedł do dalszej części (while)? W tej chwili system wykonuje

 
string odpF1 = KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_ZatwierdzoneF1);

i przechodzi dalej. Jak ponownie sprawdzić czy jest odpowiedź?
Myślałem nad wykorzystanie timerów do ciągłego sprawdzania odpowiedzi z wagi ale czy to jest prawidłowe?
Jak w tym przypadku miałaby wyglądać jego implementacja?

0

masz na myśli takie coś?

while (String.Empty != (odp = KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_ZatwierdzoneF1)))
{
    // ...
}
0
 
string odpF1;// = KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_ZatwierdzoneF1);
                    while (String.Empty != (odpF1 = KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_ZatwierdzoneF1))) ;
                    {
                        tb_komunikaty.Text = Environment.NewLine + odpF1;
                        int odpF1_int = Convert.ToInt32(odpF1);
                        //tutaj będzie dalszy ciąg 
                    }

W ten sposób ??
Jeśli tak to niestety nie działa, nie pojawia się odpowiedź po wprowadzaniu w wadze.

0

bo widzisz, ja nie wiem co kryje się za KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_ZatwierdzoneF1)
Dla mnie, jeśli odbierasz odpowiedź od serwera/klienta, to czekasz na nią (NetworkStream.Read(...) czy cóś).
Zgaduję, że poprzez OdczytZWagi.Kom_ZatwierdzoneF1 sprawdzasz, czy jest to wiadomość, na którą oczekujesz.

Może źle cię zrozumiałem i chcesz odczytywać KomunikacjaSieciowa.OdczytDanychZWagi podając kolejne wartości z enum OdczytZWagi.
Dodatkową niewiadomą dla mnie jest, jak właściwie odbywa się komunikacja między twoim klientem a serwerem.

Na moje to w pętli while powinieneś nasłuchiwać odpowiedzi od serwera i jeśli nie chcesz jako użytkownik przerwać działania programu,
to mielisz odpowiedź w jakimś switchu. W pętli możesz dać coś w stylu while (wiadomość_kończąca != (wiadomość_odczytana = ...)),
a możesz też wiadomość_kończącą umieścić później w switchu. Możesz alternatywnie w pętli dać zmienną typu bool do sprawdzania
czy jej działanie ma być zaniechane, czy nie. W konkretnym case wykonujesz odpowiednie operacje względem wiadomości odczytanej
i wysyłasz kolejne zapytanie lub odpowiedź do serwera. Z racji tego, że switch jest w pętli, to nie martwisz się ile razy otrzymasz daną
odpowiedź.

Wszystko zależy od tego jak przebiega komunikacja między twoim klientem, a serwerem.

0
lowLevel napisał(a):

bo widzisz, ja nie wiem co kryje się za KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_ZatwierdzoneF1)
Dla mnie, jeśli odbierasz odpowiedź od serwera/klienta, to czekasz na nią (NetworkStream.Read(...) czy cóś).
Zgaduję, że poprzez OdczytZWagi.Kom_ZatwierdzoneF1 sprawdzasz, czy jest to wiadomość, na którą oczekujesz.

Mój błąd. Już podaję trochę więcej "danych"

 
public static string OdczytDanychZWagi(byte[] WysylaneZapytanie)
        {
            // Wysyłka komunikatu do podłączonego serwera TCP
            byte[] GotoweZapytanie = KomunikatyWspolne.PoczatekKomunikacji.Concat(WysylaneZapytanie).Concat(KomunikatyWspolne.KoniecKumunikacji).ToArray();
            NetworkStream stream = KlientTCP.GetStream();
            stream.Write(GotoweZapytanie, 0, GotoweZapytanie.Length);

            // Otrzymanie odpowiedzi

            // Buffor na odpowiedz
            byte[] odpowiedz = new Byte[256];

            // String do przechowywania odpowiedzi w ASCII
            String responseData = String.Empty;

            // Odczyt danych z serwera
            Int32 bytes = stream.Read(odpowiedz, 0, odpowiedz.Length);
            responseData = System.Text.Encoding.ASCII.GetString(odpowiedz, 0, bytes);
            return responseData;
        }

Na moje to w pętli while powinieneś nasłuchiwać odpowiedzi od serwera i jeśli nie chcesz jako użytkownik przerwać działania programu,
to mielisz odpowiedź w jakimś switchu.

Programik ma być "bezobsługowy" i dokładnie ma "mielić" w pętlach odpowiedzi serwera (w tym przypadku terminal wagowy) i w zależności od odpowiedzi (np user wybrał F1 na terminalu to przejdź do następnego menu itp) mają być wykonywane czynności. Z tym też mam drobny problem z doborem odpowiedniej pętli. Generalnie to jestem początkującym "programistą" :)

0

Jest jeden problem z którym nie bardzo umiem sobie poradzić.
Komunikacja z terminalem jest wykonywana raz - jak zrobić żeby i zwraca odpowiedź - jak zrobić żeby w momencie jak odpowiedź jest "niezadowalająca" wrócić do początku??
Próbowałem ze switchem powiązanym z goto - problem bo jeśli odpowiedź nie jest taka jak powinna to program się nie uruchamia - kompiluje się ale nie pojawia się moje Form1 czyli przypuszczam że program zapętla się "w tle".
Z może modyfikacja samej metody odpytującej o odpowiedź z terminala?
Będę wdzięczny za wszelkie sugestie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1