[ bigguy @ 03.12.2009. 21:44 ] @
Da li bi mi neko mogao objasniti i pokazati na konkretnom primeru kako to niti funkcionisu?

Naime, trenutno bih hteo da napravim neku vrstu provere konekcije izmedju dve aplikacije koje su povezane preko COM portova. Druga aplikacija ima samo Form2 i u okviru nje samo event za DataReceived() odakle ka prvoj aplikaciji, ukoliko odgovarajuci signal stigne do nje, vraca ACK signal.

Prva aplikacija sadrzi Form1 i u okviru nje imam label1 i button1. Tekst label1 je na startu aplikacije label1.text = "". Klikom na button1 aplikacija salje signal EOT ka drugoj aplikaciji preko Serial porta. U slucaju da je druga aplikacija pokrenuta i da je konekcija ispravna ona na Serial port prve aplikacije salje signal ACK. Kada prva aplikacija primi ovaj signal tekst label1 treba da bude automatski promenjen u "Konekcija je uspesno obavljena!". U slucaju da konekcija nije ispravna ili aplikacija dva nije pokrenuta, to jest, ako na prijemu Serial porta prve aplikacije ne stigne signal ACK u vremenskom periodu od 30s onda je neophodno da se pojavi MessageBox sa porukom "Konekcija nije ostvarena!".

Ovo sam pokusao da ostvarim ukljucenjem Timer-a ali mi se javlja problem jer za interval timer-a kasni i ispisivanje label1. Predpostavljam otprilike sta mi je potrebno ali ne znam kako to da i iskodiram. Predpostavljam da se ovo realizuje tako da jedna nit bude ustvari event DataReceived(), a druga da bude ustvari timer, ali mi treba neko strucno misljenje i savet kako to da uraditi.
[ Igor Gajic @ 07.12.2009. 18:17 ] @
Posto koristis Windows forme, najlakse ce ti biti da koristis Background worker komponentu.

Imas dobro odradjen tutorial na:

http://www.albahari.com/threading/part3.aspx


Drugi pristup ti je da koristis Thread objekat i da rucno kreiras nit, ali to za sobom povlaci gomilu drugih problema jer ce ti se UI izvrsavati na jednoj niti a ovo ce biti druga nit pa se javlja niz problema vezan za komunikaciju izmedju te 2 niti...
[ bigguy @ 08.12.2009. 18:23 ] @
Igore hvala na odgovoru. Mozesli mi samo jos dati dva odgovora:
1. da li da kao Backgroundworker postavim samo slanje podataka ili da pak napravim dva Backgroundworker-a, jedan za slanje podataka, a drugi za prijem podataka?
2. da li u okviru Backgroundworkera mogu da regulisem onaj deo koji se odnosi na vreme za koje se ocekuje odgovor, nakon cijeg isteka dolazi odgovarajuci dogadjaj(slanje nekog podatka ili prijava greske)?

Hvala puno jos jednom
[ Igor Gajic @ 08.12.2009. 19:36 ] @
Napravio sam mali test programcic kako mozes da implementiras timer koji prekida cekanje na neki dogadaj kada istekne 5s, uz pomoc background worker klase.
Mozes u metodi DoWork da implementiras i logiku koja ce da prima-salje podatke sa COM porta i onda updateujes formu preko metode ReportProgress.
Metoda ReportProgress uzima 2 parametra, int percentProgress i object userState. Preko ovog 2 parametra mozes formi da posaljes sve relevantne podatke koji su
ti potrebni da prikazes na formi(box-unbox).
[ bigguy @ 09.12.2009. 14:05 ] @
Hvala na predhodnom odgovoru svakako ce mi biti od velike koristi, ali bicu toliko bezobrazan da postavim jos jedno pitanje. Molim te, ne uzmi to za zlo.
Naime za uspostavljanje veze koristim signale kao sto su EOT, ENQ, NAK,.... ovi signali su u heksadecimalnom obliku tipa 04, 05, 06,... na osnovu ove tabele null. Ove signale sam na sledeci nacin poslao od COM porta sender aplikacije ka COM portu receiver aplikacije:
Code:

namespace COMtoCOM
{
    class ConnectionData
    {
        public const byte EOT = 0x04;
        public const byte ENQ = 0x05;
        public const byte ACK = 0x06;
        public static byte[] EOT_BUFF = { EOT };
        public static byte[] ENQ_BUFF = { ENQ };
        public static byte[] ACK_BUFF = { ACK };
    }
}

A zatim evo skracenog izdanja:
Code:

namespace COMtoCOM
{
    public partial class Sender : Form
    {
        public Sender()
        {
            InitializeComponent();
        }

        private void Sender_Load(object sender, EventArgs e)
        {
            SP.Open();
        }

        private void Sender_FormClosed(object sender, FormClosedEventArgs e)
        {
            SP.Close();
        }

        private void send_Click(object sender, EventArgs e)
        {
            Send(T.ENQ_BUFF, 0, T.ENQ_BUFF.Length);
        }
    }
}

Medjutim, prilikom slanja istih na prijemu signal je oblika (byte) 5, umesto da bude (byte) 0x05.
Moje je pitanje da li ce uredjaj prihvatiti ovo kao ENQ signal, jer u njegovoj specifikaciji stoji da prihvata signale ASCII code u obliku 0x-pa heksadecimalan broj? Ovo je citat iz specifikacije: "The ASCII character set defines characters in the range 0x00 – 0x7F (where 0x is notation for a hexadecimal number)."
Ako mislis da nece, da li bi mozda mogao da mi pojasnis kako da posaljem podatak npr. ENQ|AbC|EOT , u vidu (byte[]) 0x05|416243|0x04, a da u tom formatu to sve i stigne do receiver aplikacije tako da se nakon konverzije dobije opet podatak ENQ|AbC|EOT? Napomenucu da mi konverzija AbC ne predstavlja problem nego karakteri ASCII code ENQ, EOT,....

Hvala jos jednom
[ Igor Gajic @ 09.12.2009. 21:12 ] @
Citat:

Medjutim, prilikom slanja istih na prijemu signal je oblika (byte) 5, umesto da bude (byte) 0x05.


Ovo je identicno samo je jedan zapis u decimalnom obliku a drugi je hexadecimalni zapis broja 5. Tako da bi uredjaj trebao normalno da prihvati signal.

Btw.
Npr.
(byte) 95 je isto sto i (byte) 0x5F

U watch prozoru videces 95, a ti ces mozda slati preko serijskog porta (byte)0x5F. Apsolutno isti broj, samo drugi zapis.

Pitanje2:


ENQ|AbC|EOT => new byte[] {0x05, 0x41, 0x62, 0x43, 0x04} - dakle niz byteova duzine text.Length + 2, pocetak ENQ, kraj EOT... Mislim da je prilicno lako da se uzme podniz bajtova koji ti trebaju.

Ceo programcic oko konverzije u odredjeni format i citanje iz tog formata
Code:

namespace TestBytes
{
    class Program
    {
        public const byte EOT = 0x04;
        public const byte ENQ = 0x05;
        static void Main()
        {
            string message = "AbC";


            byte[] encodedMessage = Encoding.ASCII.GetBytes(message);

            byte[] senderMessage = new byte[encodedMessage.Length + 2];

            senderMessage[0] = ENQ;
            senderMessage[encodedMessage.Length + 1] = EOT;

            for (int i = 1; i < encodedMessage.Length + 1; i++) senderMessage[i] = encodedMessage[i-1];

            // Send message

            byte[] receivedMessage = senderMessage;

            string receivedString = Encoding.ASCII.GetString(receivedMessage, 1, receivedMessage.Length - 2);

            Console.WriteLine(receivedString);

            Console.ReadKey();
        }
    }
}


[Ovu poruku je menjao Igor Gajic dana 09.12.2009. u 23:02 GMT+1]
[ bigguy @ 11.12.2009. 08:25 ] @
Hvala