Diskuze: c# form - příjem dat po sériové lince
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 11 zpráv z 11.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Jj přečetl
že neobsahuje
definici pro BeginInvoke...
Používám tyto:
using System;
using System.IO.Ports;
using System.Net.Sockets;
using System.Windows.Forms;
Nevím kde je BeginInvoke....
Zatím jsem to nikdy nepotřeboval a ani nepoužil (zatím mi vždycky stačil BackgroundWorker), ale podle mě se BeginInvoke používá pro práci s vlákny...
Aha já jsem právě našel tuto část kódu na netu... Takže právě
pořádně nevím jak to funguje a chtěl jsem vysvětlení proč to nejde a jak
to funguje 
no je zajimave ze me ten tvuj kod jde prelozit bez problemu 
není to zrovna nejlepší řešení, co sis našel - jsou tam nesmyslné a
zbytečné věci - můžeš sem dát celou třídu ?
A taky napiš, k čemu konkrétně chceš SerialPort používat - s čím a jak
často budeš komunikovat.
Tak to je zajímavé, že tobě to funguje. Nakonec jsem to vyřešil jinak

Tak jak jsem psal výše vyřešil jsem to jinak. Serial port chci využívat na zápis a vyčítání dat. Takže trvalá komunikace. Jde o komunikaci s multimetrem (nastavení měřících rozsahů, vyčtení změřené hodnoty, atd.). Tady je celá třída Communication:
using System;
using System.IO.Ports;
using System.Net.Sockets;
using System.Windows.Forms;
namespace Sender_RS232
{
/// <summary>
/// Description of Communication.
/// </summary>
public class Communication
{
private RichTextBox _displayWindow;
public SerialPort comPort = new SerialPort();
public RichTextBox DisplayWindow
{
get { return _displayWindow; }
set { _displayWindow = value; }
}
// Konstruktor tridy
public Communication()
{
_displayWindow = null;
// prida udalost, ktera je vyvolana pokud dojde k zapisu do prijimaciho stringu
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
}
public void Connected()
{
try
{
comPort.Open(); // Otevru seriovou linku
}
catch (Exception err)
{
MessageBox.Show("Port nelze otevřít" + err, MainForm.appName, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = comPort.ReadExisting();
DisplayData(data);
}
private void DisplayData(string data)
{
_displayWindow.Invoke(new EventHandler(delegate
{
_displayWindow.SelectedText = string.Empty;
_displayWindow.AppendText(data + "\n");
}));
}
}
}
Po stisku tlačítka ve tříde MainForm nastavím parametry linky (rychlost,
název portu. atd.) a zavolám Connected() a otevřu port.
Teď již ve stringu data mám přimutý řetězec, ale vyskytl se mi nový
problém
Potřeboval bych v
metodě DisplayData(string data) zapsat data do richTextBox1, který je
umístěn ve třídě MainForm. Nebo lépe předat data (řetězec) do MainForm
a zde zapsat do richTextBox1. Zatím jsem to zkusil takto (viz. kod), ale
nefunguje to hlásí při debagovani chybu:
NullReferenceException was unhandled
Odkaz na objekt není nastaven na instanci objektu.
Díky za rady....
Potřeboval jsem vědět, na co to používáš, abych se ujistil, že to je
opravdu nějaká jednoduchá komunikace s nějakým zařízením.
V tvém případě ,a stejně jako v 90% jiných případů se můžeš
vyfláknout na nějaké Invoke a BeginInvoke - prostě je naprosto zbytečné
zpracovávat příjem dat v jiném vlákně.
To má smysl, pokud načítáš nějaké kB/MB dat a trvá to dlouho, takže by
to blokovalo hlavní vlákno a počítám, že ten tvůj multimetr neposílá
nepřetržitý proud dat, ale pouze na vyžádání, nebo v určitých
časových intervalech.
Jinak to máš celé nějak zamotané - proč ta vlastnost
public RichTextBox DisplayWindow
{
get { return _displayWindow; }
set { _displayWindow = value; }
}
?
trochu jsem si dovolil upravit tvoji třídu
public class Communication
{
private RichTextBox _displayWindow;
public SerialPort comPort = new SerialPort();
// Konstruktor tridy
public Communication(RichTextBox _displayWindow)
{
//předáváš odkaz na již existující RTB, který jistě máš v hlavním Formu
this._displayWindow = _displayWindow;
// prida udalost, ktera je vyvolana pokud dojde k zapisu do prijimaciho stringu
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
}
public void Connected()
{
try
{
comPort.Open(); // Otevru seriovou linku
}
catch (Exception err)
{
MessageBox.Show("Port nelze otevřít" + err, MainForm.appName, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = comPort.ReadExisting();
DisplayData(data);
}
private void DisplayData(string data)
{
_displayWindow.SelectedText = string.Empty;
_displayWindow.AppendText(data + "\n");
}
}
}
a ještě se zeptám - ne že by to něčemu vadilo, ale k čemu to
_displayWindow.SelectedText = string.Empty;
?
Tak jsem to podle tvých rad předělal do jednoho vlákna (do hlavního formuláře). A program už funguje. Díky za pomoc a rady....
Zobrazeno 11 zpráv z 11.