[ jmix23 @ 01.02.2011. 08:43 ] @
Pozdrav narode,

treba mi malo pomoc. Naime, napravio sam neku aplikaciju koja cita bar kod i belezi u bazu. Medjutim, kada zavrsi prvo ucitavanje ne mogu opet da nastavim sa ucitavanjem bar koda. Ono sto me zanima, kako da uradim restart aplikacije ili ponovno loadiranje ? Pokusao sam da zatvorim aplikaciju pa da je opet otvorim automatski ali mi nije uspelo? Kako da uradim reopen ili reload forme ?

A da, zaboravih da napomenem da se podaci sa bar kod skenera citaju sa com porta

Hvala unapred !
[ dejanet @ 01.02.2011. 09:10 ] @
Mislim da ti nije najbolji nacin...

Probaj da handlujes na Form event : keypress

private void tvojForm_KeyPress(object sender, KeyPressEventArgs e)
{
//... tvoj kod.....
}

Mislim da se barcode sekvenca zavrsava sa chr(13), tako znas da je zavrsio sa skeniranjem.. onda resetujes npr.varijablu i spremis se za sledece skeniranje, a ne resetom celog forma ili aplikacije..
[ jmix23 @ 01.02.2011. 09:43 ] @
Problem je sto se pre smestanja u bazu vrsi skeniranje dva razlicita bar koda, a kako podatak prvog skeniranja dodelim jednoj variable (variable1), posle toga moram da zatvorim taj port (port1 )pa da otvorim novi (port2, a fizicki se radi o istom portu) koji ce sledece skeniranje da dodeli drugoj variable (variable2). tom prilikom se vrse neke provere skeniranih podataka i salje u bazu. U tom trenutku imam otvoren com port2 koji smesta podatak u variable2, a meni bi opet trebalo da se otvori port1 kako bih mogao da krenem skeniranje iz pocetka. Pokusao sam da resetujem variable1 i omogucim upis sa skenera u istu, ali kako mi je ostao otvoren port2, to mi se prilikom skeniranja podatak smesta u variable2. to bi znacilo da treba da zatvorim port2 i opet otvorim port1 ali mi tada javlja neku ne bas definisanun gresku : "Exception has been thrown by the target of an invocation." jer krene sa loadiranjem iste forme.

[ dejanet @ 01.02.2011. 09:48 ] @
Zar se barcode citaci ne ponasaju kao tastatura (uz neki driver eventualno)..
[ jmix23 @ 01.02.2011. 10:00 ] @
Pa kada sam pravio aplikaciju za skener koji je povezan preko usb-a nisam imao problema, jer se skenirani podatak moze ocitati i u nekom Word fajlu (Notepad, Excel...bilo sta), ali sa com port-om (RS 232) nije takva situcaija. Kod com port-a moras da definises port, da ga otvoris pa tek tada mogu da se citaju podaci. Zbog toga moram da zatvaram i otvaram port, jer se podaci smestaju razlicitim promenljivima.
[ Dusan Kondic @ 01.02.2011. 10:43 ] @
Mislim da ne moraš da deklarišeš dva porta. Čak ne moraš ni da zatvaraš port.
To je skupa operacija, i ja to nikad ne radim.
Objasni malo detaljnije kako se fizički odvija iščitavanje;
npr. jednim istim bar-kod skenerom iščitavaš jedan bar-kod, pa zatim drugi bar-kod.
Zatim se te dve vrednosti upišu u bazu, a aplikacija vraća podrazumevane vrednosti.
Zanima me po čemu se razlikuju ta dva očitavanja.
Od toga zavisi kako da nađemo najbolje rešenje.
[ jmix23 @ 01.02.2011. 12:34 ] @
Evo koda gde deklarisem port:

Code (csharp):

private void OpenCommPort_Load(object sender, EventArgs e)
        {
            port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
            port.Handshake = Handshake.None;
            port.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
            //port.WriteTimeout = 500;
            //port.ReadTimeout = 500;
            //txtPort.Text = "Otvoren";
            port.Open();
            if (port.IsOpen)
            {
                txtPort.Text = "Otvoren";
                DateTime current = DateTime.Now;
                testToday.Text = Convert.ToString(current);
            }
            else
                txtPort.Text = "Zatvoren";
            txtCode.Focus();

        }
 


gde je :

Code (csharp):

  private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(500);

            string data = port.ReadExisting();
            this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });
        }
 


a odavde se poziva :
Code (csharp):

private void si_DataReceived(string data)
        {
            txtCode.Text = data.Trim();
           
        }
 


Tek u ovoj zadnjoj funkciji smesta podatak na textbox. Zbog toga moram da zatvorim ovaj port, jer ukoliko ostane otvoren opet ce skenirani podatak smestiti u ovaj textbox. I onda deklarisem novi port, koji se smestati podatak u drugi textbox. Mozda postoji bolji nacin, ali ja nisam uspeo da ga pronadjem.






[Ovu poruku je menjao Shadowed dana 01.02.2011. u 14:06 GMT+1]

[Ovu poruku je menjao Shadowed dana 01.02.2011. u 14:15 GMT+1]
[ Dusan Kondic @ 01.02.2011. 13:36 ] @
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.
[ jmix23 @ 01.02.2011. 15:01 ] @
Resio sam. Dusan mi je dao jednu ideju koja je uspela. nije ovde bilo potrebno da cita paket po paket tako da sam resio bez tajmera. Samo je prilikom smestanja podatka uz jednu IF petlju trebalo da napravim kombinacije ove dve promenljive i uz odredjene uslove da popuni prvi textbox, dok u suprotnom popunjava drugi textbox.
To bi izgledalo ovako:
CODE:
private void si_DataReceived(string data)
{
if ((txtBarKod.Text == "" && txtPakerica.Text == "") || (txtBarKod.Text != "" && txtPakerica.Text != "")) //** kombinacije dva textboxa
{
txtBarKod.Text = data.Trim();
txtBarKod.Enabled = false;
txtPakerica.Enabled = true;

txtPakerica.Focus();
}
else
{
txtPakerica.Text = data.Trim();
btnUcitaj.Enabled = true;
btnUcitaj.PerformClick();
txtPakerica.Enabled = false;
}

Hvala vam mnogo na pomoci.
Pozdrav !!!
[ dusans @ 01.02.2011. 15:52 ] @
Mislim da neće da ti radi 4-to očitavanje.