NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C# WPF Serial read line

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
JirkaX
Člen
Avatar
JirkaX:6.3.2018 19:45

Ahoj,

mám takový problém se čtením a nevím jak ho vyřešit. Používám kód od:

https://github.com/…ndow.xaml.cs

Hlavní problém mám v tom, že data nechodí celá a když to chci dát do textBoxu tak to vynechává skáče mimo prostě nečitelné :( co s tím?

Když data ověřím v programu "Herkules" co přicházení na seriovou linku tak jsou v pořádku. Data chodí ve formátu čísla zakončená \r\n např "1540\r\n" -> potřeboval bych je čitejně zobrazovat v textboxu a v RichTextBox.

Když jsem něco podobného dělal ve Formech tak jsem s tím neměl problém.

Děkuji

 
Odpovědět
6.3.2018 19:45
Avatar
JirkaX
Člen
Avatar
JirkaX:6.3.2018 19:52

Když koukám na 85 řádek tak data co přichází jsou strašně dlouhá např... "540\r\n540\r­\n540\r\n540\r\n540\r\n" čtení si dělá co chce. Místo toho aby to četlo po řádku a zobrazovalo tak to různě skáče :(

 
Nahoru Odpovědět
6.3.2018 19:52
Avatar
JirkaX
Člen
Avatar
JirkaX:10.3.2018 8:43

Malinko jsem přišel na to kde mám chybu ale pořád jsem to nevyřešil :(

Je to v tom, že čtu ze seriového portu pokaždé co přijde byte. :) Nikdy nevím kdy co přijde. Moje datová zpráva vypadá tak, že chodí každých 500ms hodnota od 0-9999.

Nemám vůbec nápad jak to vyřešit, zkoušel jsem i buffer ale to pořád není ono :(

Hotové řešení by mělo vypadat tak, že v textboxu bude poslední hodnota, co přišla na seriovou linku. V listboxu bude posledních 50 hodnot co přišli na seriovou linku.

Edit: Ještě přemýšlím, že bych tu datovou zprávu upravil na např D9999,999K Kde D bude začátek zprávy 4 znaky do text boxu a listboxu a 3 znaky do listboxu a K bude konec. ;) Myslím, že to bude lepší na čtení. Posílám to z PIC procesoru tak si to můžu upravit jak chci.

Editováno 10.3.2018 8:43
 
Nahoru Odpovědět
10.3.2018 8:43
Avatar
Odpovídá na JirkaX
Tomáš Vitek:10.3.2018 20:36

Ahoj,

napadá mě, že ještě lepší by mohlo být dát na konec každé zprávy nějaký oddělovací znak, a pak jen vždycky, když přijde byte, tak si ho buď uložíš do nějakého stringu, nebo, v případě, že přijatý byte bude oddělovač, již složený string přečteš.

Tedy něco jako (kód píšu z hlavy, takže nezaručuji 100% správnost:

string zprava;
void prijatyByte()
{
        char znak = (char) serialPort.ReadByte();
        if(znak==oddelovac)
                napisZpravu(zprava);
        else
                zprava += znak;
}
 
Nahoru Odpovědět
10.3.2018 20:36
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na JirkaX
ostrozan:10.3.2018 22:59

Ale řešení sis už napsal do titulku

serial.ReadLine();

dej místo

serial.ReadExisting();

Když teda píšeš, že tam máš ten znak \n

 
Nahoru Odpovědět
10.3.2018 22:59
Avatar
JirkaX
Člen
Avatar
Odpovídá na Tomáš Vitek
JirkaX:12.3.2018 17:10

Děkuji, že se mi snažíte pomoct ale pořád to nemám :) jsem to asi blbě úplně napsal, a problém, je v tom, že to neumím zobrazit ty data.

Edit: ze zařízení (co posílá na sériovou linku) jsem už upravil data na D9999,999K a posílání cca co 500ms (mění se to)

Editováno 12.3.2018 17:12
 
Nahoru Odpovědět
12.3.2018 17:10
Avatar
JirkaX
Člen
Avatar
JirkaX:12.3.2018 17:47

Tady je celý projekt https://uloz.to/…/wpfapp1-zip

 
Nahoru Odpovědět
12.3.2018 17:47
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na JirkaX
ostrozan:12.3.2018 18:44
private void Recieve(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
 {
     recieved_data = serial.ReadLine();
     DiscardInBuffer(); //radsi vyprazdni buffer
     Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(WriteData), recieved_data);
 }

musí fungovat

stačí přidat za číslo \n

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
12.3.2018 18:44
Avatar
JirkaX
Člen
Avatar
Odpovídá na ostrozan
JirkaX:14.3.2018 16:28

Už to funguje DÍKY MOC, taková blbost ;) Jen ještě maličkost, co myslíš tím vyprázdni buffer? Jestli jsem to dobře pochopil tak při zavření aplikace a v polovině čtení řádku to může zlobit?

 
Nahoru Odpovědět
14.3.2018 16:28
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na JirkaX
ostrozan:14.3.2018 19:20

No - hodně zjednodušeně: ve vstupním bufferu se hromadí všechny došlé bajty, událost DataReceived se volá po každém přijatém bajtu proto se můžeš v některých příkladech setkat i s tím, že se po přijetí prvního bajtu čeká (Thread.Sleep()) až dojdou i ty zbylé, což je špatné.
Proto existuje ta metoda ReadLine, která zajistí to, že se program nepohne dál, dokud nepřijde znak pro konec řádku \n
A proč teda vyprazdňovat ten buffer
Stávalo se mi, že jsem z bufferu dostával něco, co jsem nechtěl a proto je lepší, když před tím, než čekáš zprávu mít buffer úplně čistý, pak máš jistotu, že tam bude jen poslední zpráva a nic jiného.

 
Nahoru Odpovědět
14.3.2018 19:20
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.