Kod je u redu, osim što ne znam zbog čega čekaš 500mS prilikom prijema paketa.
Da li bar-kod čitač u kompletnom paketu šalje "zadnji bajt" (npr. (char)13 što reče dejanet)?
Moj princip je da u jedan string pakujem dolazeće pakete sve dok ne naiđem na "zadnji bajt".
Kada ga nađem, napakovani string šaljem gde treba i dodeljujem mu ponovo vrednost "".
Dakle, svaki paket koji stigne u sp_DataReceived provučeš kroz "for" petlju tražeći
npr. "(char)13" (ako je to "zadnji bajt"). Ako ne postoji, u string "data", koji mora biti deklarisan u vrhu
klase da bi postojao prilikom dolaska novog paketa, dodaješ (data += port.ReadExisting();) pristigle podatke i
izlaziš iz metode.
Ako nađeš "zadnji bajt", takođe dodaješ pristigle podatke u "data", i izvršavaš
Code:
this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data, SadaPunim });
data = "";
if(SadaPunim == "string1")
{
SadaPunim = "string2";
}
else
{
SadaPunim = "string1";
}
Gde je "SadaPunim" string deklarisan u vrhu klase.
Tada si spreman za prijem drugog stringa.
Code:
private void si_DataReceived(string data, string StaPunim)
{
if(StaPunim == "string 1")
{
txtCode1.Text = data.Trim();
}
else
{
txtCode2.Text = data.Trim();
}
}
Ako ne postoji "zadnji bajt", onda moraš da meriš i nađeš najduže vreme koje protekne
između prijema paketa jednog istog očitavanja. Deklariši private System.Timers.Timer tajmer
čiji će interval biti nešto duži od najdužeg izmerenog vremena (možda i dvostruko, to je stvar prakse).
Tajmer startuješ i prilikom prijema prvog paketa, i resetuješ prilikom prijema svakog narednog.
Ako vreme tajmera istekne, znači da si primio kompletan bar-kod i izvršavaš
Code:
this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data, SadaPunim });
data = "";
if(SadaPunim == "string1")
{
SadaPunim = "string2";
}
else
{
SadaPunim = "string1";
}
Izvinjavam se ako sam u kodu nešto zabrljao jer isti nije iskopiran iz VS, već sam ga ovde i kucao.