Witam
Piszę program który ma komunikować się z terminalem wagowym za pomocą klienta TCP. Już kilka "częściowych" postów z nim związanych pojawiło się na forum i uzyskałem Waszą pomoc - teraz trochę bardziej "globalnie" o programie i problemie.
Wysyłam komunikaty (np sprawdzające status) i na podstawie odpowiedzi wykonuję odpowiednie czynności.
Na początek trochę kodu.
Połączenie z wagą:
public static void PolaczZWaga(string IP, int port)
{
IP = IP.Replace(" ", "");
KlientTCP = new TcpClient();
KlientTCP.Connect(IPAddress.Parse(IP), port);
}
Wysłanie zapytania (np o status wagi):
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;
}
Po otwarciu Form1 mamy nawiązanie połączenia i sprawdzenie statusu:
string odp = KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_RejestrStatusu);
char status = odp[0];
switch(status)
{
case 'B':
KomunikacjaSieciowa.WysylkaDoWyswietlaczaWagi_4linie(WysylkaDoWyswietlacza_Komunikaty.LogWitaj, WysylkaDoWyswietlacza_Komunikaty.LogZaloguj, WysylkaDoWyswietlacza_Komunikaty.PustaLinia, WysylkaDoWyswietlacza_Komunikaty.LogNrOperatora);
string NrOperatora = KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_ZatwierdzoneF1);
//int NrOperatora_int = Convert.ToInt32(NrOperatora);
break;
// tutaj dalsza część przypadków
Tutaj pojawia się mój problem - komunikacja z wagą odbywa się tylko raz a operacja wymaga wprowadzenia danych na terminalu. Zanim operator wprowadzi dane to program kończy już swoje działanie.
Jak zmienić kod/zapętlić/dodać timer żeby komunikacja powtarzała się do osiągnięcia pewnego statusu?
Dokładniej jak w tym fragmencie:
case 'B':
KomunikacjaSieciowa.WysylkaDoWyswietlaczaWagi_4linie(WysylkaDoWyswietlacza_Komunikaty.LogWitaj, WysylkaDoWyswietlacza_Komunikaty.LogZaloguj, WysylkaDoWyswietlacza_Komunikaty.PustaLinia, WysylkaDoWyswietlacza_Komunikaty.LogNrOperatora);
string NrOperatora = KomunikacjaSieciowa.OdczytDanychZWagi(OdczytZWagi.Kom_ZatwierdzoneF1);
powtarzać "string NrOperatora" w zależności od zwracanych danych??
Czy wykorzystać wątek?? W którym momencie najlepiej "zapętlić"??