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
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
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):
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.
Offline
Tu mas hotovy program v c# na komunikaciu pomocou RS232 - serial port
Hotovo :D
Offline