Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 30. 03. 2013 15:37

jointer
Zelenáč
Příspěvky: 1
Škola: FEI UPCE
Pozice: student
Reputace:   
 

C# serial port RT

Zdravim!
potreboval bych trochu postrcit. Resim problem, kdy mam na serial portu u winForms v C# nejaka data, ktera tam proudi s periodou zhruba 20ms, a potrebuju je nacitat do promennych a zobrazovat na formulari. Dokud jsem nepotreboval snizit periodu(puvodne byla nastavena na pul sekundy) fungovalo vse paradne. Ovsem jakmile jsem periodu 10x az 20x snizil, zaclo se to kousat, nebo to nenacitalo vubec. Puvodne jsem si reseni predstavoval tak, ze vezmu timer a pomoci InvokeMethod pokazde nactu data z COMu a zobrazim. Bohuzel zacinam si myslet ze je tam moc velka rezie a nestiha to (perioda 20ms)...
je nejaka jina moznost jak v pravidelnych kratkych casovych intervalech nacitat hodnoty, aniz by mi to zaseklo celou aplikaci? dekuji za odpoved
podotykam ze nejsem primarne programator takze se moc neorientuju v multivlaknovym programovani(tam nekde nejspis lezi muj problem, i kdyz timer je taky sam o sobe vlakno ne?)

Offline

 

#2 01. 04. 2013 14:00 — Editoval RePRO (01. 04. 2013 14:29)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: C# serial port RT

Zdravím,
no jo, samotná aplikace a vlákna jsou dost důležitý pojem. Všude vlákna jsou a je potřeba s nimi dobře manipulovat. Jedna možnost je použít takové zvláštní řešení a to oddělené (seperate) vlákno BackgroundWorker.

Ovšem, pokud máš nějaký školní projekt, nebo testovací aplikaci, můžeme to provést zhruba takto (netestováno):

Code:

private delegate void TextDelegate(string text);
private SerialPort _serialPort;

private void initSerialPort()
{
    _serialPort = new SerialPort("COM2", 19200, Parity.None, 8, StopBits.One);
    _serialPort.Handshake = Handshake.None;
    // Důležitá věc - navěsíme (handler) na DataReceived event.
    // To znamená, že až dorazí data, spustí se metoda SPDataReceived.
    _serialPort.DataReceived += new SerialDataReceivedEventHandler(SPDataReceived);
    // Tady se nastavují intervaly.
    _serialPort.ReadTimeout = 500;
    _serialPort.WriteTimeout = 500;
    _serialPort.Open();
}

void SPDataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Uspíme vlákno.
    Thread.Sleep(500);
    // Načteme data.
    string data = _serialPort.ReadLine();
    // Použijeme kouzlo s Invoke - async.
    this.BeginInvoke(new TextDelegate(interruptDataReceived), new object[] { data });
}

private void interruptDataReceived(string data)
{
    textBox1.Text = data.Trim();
}

A proč to je takto použito? Tím Invoke my řekneme, že zavoláme metodu asynchronně. Tedy, na pozadí se spustí delegát (TextDelegate), který zavolá metodu interruptDataReceived.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#3 04. 06. 2013 17:25

projectik.eu
Zelenáč
Příspěvky: 1
Škola: zakladna skola komenskeho
Pozice: upratovacka
Reputace:   
 

Re: C# serial port RT

Tu mas hotovy program v c# na komunikaciu pomocou RS232 - serial port
Hotovo :D

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson