Diskuze: C# WPF Serial read line

C# .NET .NET (C# a Visual Basic) C# WPF Serial read line American English version English version

Aktivity (3)
Avatar
JirkaX
Člen
Avatar
JirkaX:6. března 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. března 19:45
Avatar
JirkaX
Člen
Avatar
JirkaX:6. března 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. března 19:52
Avatar
JirkaX
Člen
Avatar
JirkaX:10. března 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. března 8:43
 
Nahoru Odpovědět 10. března 8:43
Avatar
Odpovídá na JirkaX
Tomáš Vitek:10. března 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. března 20:36
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na JirkaX
ostrozan:10. března 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. března 22:59
Avatar
JirkaX
Člen
Avatar
Odpovídá na Tomáš Vitek
JirkaX:12. března 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. března 17:12
 
Nahoru Odpovědět 12. března 17:10
Avatar
JirkaX
Člen
Avatar
JirkaX:12. března 17:47

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

 
Nahoru Odpovědět 12. března 17:47
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na JirkaX
ostrozan:12. března 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 12. března 18:44
Avatar
JirkaX
Člen
Avatar
Odpovídá na ostrozan
JirkaX:14. března 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. března 16:28
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na JirkaX
ostrozan:14. března 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. března 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.