Master - slave komunikace – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Master - slave komunikace – .NET – Fórum – Programujte.comMaster - slave komunikace – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Lou
~ Anonymní uživatel
4 příspěvky
2. 12. 2012   #1
-
0
-

Mám zařízení, kde po RS485 komunikuje několik 8bit MCU (atmel AVR) jeden z nich je master, ale občas potřebuju připojit jako slave aplikaci v PC napsanou ve VS C#.

To mám ošetřené tím, že master občas vyšle na linku dotaz na přítomnost tohoto slave - printf("data\r");

nedaří se mi ale zachytit v PC ten řetězec "data", abych mohl poslat odpověď do masteru.

jeden z neúspěšných pokusů:

serial = new SerialPort();
            // 8N1
            serial.DtrEnable = true;
            serial.BaudRate = 19200;
            serial.Parity = Parity.None;
            serial.StopBits = StopBits.One;
            serial.DataBits = 8;
            serial.Handshake = Handshake.None;
            serial.ReadTimeout = 1000;
            serial.WriteTimeout = 1000;

private void nacti_data_Click(object sender, EventArgs e)
        {

            bool ok;
           
           byte[] tmp = new byte[this.serial.BytesToRead];
       

          ok = false;

     
          while (ok!=true)
          {         
              serial.Read(tmp, 0, serial.BytesToRead);
              if (String.Equals(tmp, "data")) ok = true;
          }


         
           serial.RtsEnable = true;
           Thread.Sleep(10);

           serial.Write("send\r");
           Thread.Sleep(50);
          
            serial.RtsEnable = false;

}

Nahlásit jako SPAM
IP: 80.239.243.–
Reklama
Reklama
zlz
~ Anonymní uživatel
634 příspěvků
2. 12. 2012   #2
-
0
-

Když čteš, tak víš, že tam ten string už je, je kompletní a jen jednou? To "\r" v něm nebude?

Nahlásit jako SPAM
IP: 80.188.216.–
Lou
~ Anonymní uživatel
4 příspěvky
2. 12. 2012   #3
-
0
-

#2 zlz
To právě nevím, a nevím jak to zařídit - jak sesynchronizovat  ten master a slave. Když se připojím z PC tak v bufferu je vlastně všechno z linky - a já nevím jak si z toho vybrat jen ten konkrétní řetězec, případně znak - třeba to \r .

Existuje nějaká metoda, která by detekovala na portu přítomnost nějakého konkrétního znaku? Bez použití Serial.Port.Read(); do nějakého bufferu a detekce v něm? To evidentně nefunguje.

Nahlásit jako SPAM
IP: 80.239.243.–
zlz
~ Anonymní uživatel
634 příspěvků
2. 12. 2012   #4
-
0
-

Tohle nefunguje, protože to máš špatně.

Ten buffer vytvoříš pro nějakou velikost, která za chvíli může být neplatná. A čteš pořád na začátek toho bufferu, takže můžeš přepisovat část toho, co už v něm máš a ve zbytku ti zůstávájí předchozí data.

Chtělo by to ta data postupně přičítat na konec, dokud nenačteš všechno, co už přišlo a co případně ještě má přijít. Asi něco jako (BytesToRead == 0 && EndsWith("\r"))

Ale pořád tam může být problém s tou synchronizací. Spíš bych to otočil - slave ať se hlásí masteru a jen jedním bytem.

Write(SYN);
reply = Read();
if (timeout || reply != ACK) Error();
...
Nahlásit jako SPAM
IP: 80.188.216.–
Lou
~ Anonymní uživatel
4 příspěvky
3. 12. 2012   #5
-
0
-

#4 zlz
no já jsem vycházel z toho, že tu věc mám odskoušenou s programem Dockligt - ve kterém můžeš zadat sekvenci, nebo více sekvencí, na které potom odpoví - zase zadanou sekvencí.  Takže to nějak jít musí.

navíc nevím, co by udělalo neřízené vysílání slave v momentě, kdy by třeba vysílal master, nebo odpovídal jiný slave - možná nic, možná paseku :)

ale nápad s hóóódně velkým bufferem není zas tak marný-  mezi dotazy "data\r" po lince může proběhnout nějakých 500 byte, takže při velikosti bufferu nějakých 600byte by tam tenřetězec mohl být i dvakrát

Nahlásit jako SPAM
IP: 88.101.146.–
Lou
~ Anonymní uživatel
4 příspěvky
3. 12. 2012   #6
-
0
-

#5 Lou
Tak řetězec bych v bufferu měl, ale nedokážu ho najít.

metoda String.Equals porovnává celý obsah  - daný řetězec umí najít IndexOf(); ale to bych pole muse deklarovat jako "string" -  do stringu ale zas nechce zapisovat metoda Read();

Já už fakt nevím.

Nahlásit jako SPAM
IP: 88.101.146.–
Vaizo0
Stálý člen
3. 12. 2012   #7
-
0
-

#6 Lou
Zkus použít statickou třídu BitConverter buďto na převod stringu na byte[] nebo naopak  

Nahlásit jako SPAM
IP: 94.113.35.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 60 hostů

Podobná vlákna

Avr jako i2c slave — založil David Skalka

Master Page - pomoc — založil Dave-CZ

Master page - ASP.net — založil XP

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý