» Poradna » Programy

[C#] - Seriova komunikace

Odpovědět  |  Zobrazit bez stromu  |  Upozornit redakci  |  nových odpovědí: 15/15
 |   |  Microsoft Windows 8 Chrome 26.0.1410.43  |  [178.72.234.---]

Dobry den,nejaky ten den si hraju s programovanim C#. Ale vzhledem k tomu, ze jsem stale zacatecnik v teto problematice (nikoliv zacatecnik v programovani - 10 let PHP, a pak od kazdeho neco), tak jsem se dostal do situace, se kterou si nevim moc rad. Konkretne se mi jedna o zapis a cteni dat na seriovou linku. Neco malo jsem si nastudoval, ale ne vzdy to bylo pro me zrovna pochopitelne. V kazdem pripade jsem to prozatim vyresil tak, ze po zapsani dat do "odesilaciho bufferu" uspim na urcitou dobu vlakno a pak po uplynuti urcite doby ctu z "prijimaciho bufferu". Toto reseni je sice take reseni, ale rozhodne ne optimalni. Diky uspavani narusat cas, po kterou se data prenaseji. Chtel bych se timto na vas zkusene v teto problematice obratit s radou jak je to nejlepsi vyresit. Dekuji.

Odpovědi na otázku

 |   |  Microsoft Windows 7 Chrome 26.0.1410.43

Pro práci se sériovým portem slouží třída System.IO.Ports.SerialPort, která má event DataReceived - nic nemusíte uspávat.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.43  |  [178.72.234.---]

Ano, vim o teto udalosti, ale ani jednou se mi ji nepodarilo spustit :( Odeslal jsem data pres serialPort.Write() a pak jsem klidne mohl cekat jak dlouho chtel, ale udalost dataReceived se neprovedla. Mozna ceka na urcite naplneni prijimaciho bufferu, ale toto opravdu netusim jak ve skutecnosti funguje. Neni mozne nejak nastavit nejaky trigger, ktery by automaticky spustil tuto metodu napr. po prijeti 3 bajtu?Jinak co jsem nasel na netu, tak vetsinou to resili pres vlakna, jedno na odesilani a druhe na prijimani.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.43

Pokud se ti to nepodařilo spustit, tak jsi něco dělal špatně. Ale z tohohle popisu se nedá říct co.Ale více vláken je určitě dobrý nápad, pokud chceš, aby to přijímalo a odesílalo zároveň.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.43  |  [178.72.234.---]

Tak vice vlaknove to resit nechci, pac s tim nemam vubec zkusenosti ;) a je to v podstate pro me docela pole neorane ;) Ale navic tu seriovou komunikci mam potvrzovanou, takze nehrozi, ze bych vysilal a prijimal zaroven. Spise mi jde o tom, ze potrebuji odelsat data, coz neni problem, ale pak potrebuji precit potvrzeni ktere ma v postate 2 bajty a tim zjistim, zda data jsou v poradku nebo je potreba provest vysilani znova.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Opera 9.80

viz MSDN: "The DataReceived event is not guaranteed to be raised for every byte received. Use the BytesToRead property to determine how much data is left to be read in the buffer."Takže pokud odešleš požadavek a hned na něj očekáváš odpověď, tak tohle asi nejde použít.Tohle bych asi řešil tak že bych tomu seriovemu portu nastavil třeba 5s timeout.A pak bych dotaz-odpověď vyrobil takto:serialPort.ReadTimeout = 5000;serialPort.Write(Vyslání tvého dotazu);try{int odpoved = serialPort.ReadByte();//zpracování odpovědi.} catch (TimeoutException ex) {//došlo k timeoutu, dané zařízení neodpovídá}

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.43

Hoď někam svůj kód, třeba na pastebin. Takhle ti moc nepomůžeme

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.43  |  [178.72.234.---]

Osekal jsem to na minimum, ale i tak si myslim, ze by to melo zahlasit.http://pastebin.com/WDX5fMr6

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.43

A určitě jsi tu metodu serialPort1_DataReceived přiřadil k události DataReceived?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.43  |  [178.72.234.---]
 |   |  Microsoft Windows 8 Chrome 26.0.1410.43  |  [178.72.234.---]

Neda mi to jeste se nezeptat, jak to presne funguje s tou udalosti serialPort1_DataReceived? Spusti se kdy? Pri kazdem novem prichozim bajtu? Nebo az po naplneni input bufferu?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.43

Zopakuju to co jsem napsal již dříve:viz MSDN:"The DataReceived event is not guaranteed to be raised for every byte received. Use the BytesToRead property to determine how much data is left to be read in the buffer."Takže opravdu nelze říci kdy se ten event spustí. Může to být po prvním Bytu, ale taky to může být až po přijetí 5B, nebo třeba 1KB. Určitě to nebude při naplnění, tam by hrozilo, že při zpracování toho co v bufferu je, by mohlo dojít k zahození dalších příchozích dat.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 26.0.1410.43  |  [217.112.166.---]

Tak se mi podarilo rozjet tu udalost serialPort1_DataReceived a nejak to funguje. Ale ted se pro zmenu trapim na casovaci. Kdyz jej spustim timer1.Start(); nebo timer1.Enabled = true; tak se mi spusti, ale uz jej nedokazu vypnout. Nefunguje timer1.Stop() ani timer1.Enabled = false;Nevite jak na to?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Opera 9.80

Funkce stop ten timer musí zastavit. Něco tam máš špatně.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 36.0  |  [77.78.117.---]

Zdravím,řeším stejný problém jak Vy. Po příchodu dat po sériové lince mi nechce nastat událost serialPort1_DataReceived. Zkoušel jsem to úplně stejně jak Vy. MessageShow.show("prisla data"); a čekal jsem, že když přijde aspoň jeden byte, tak to vyhodí okno (provizorně...pak samozřejmě data zpracuju).Chci se tedy zeptat, jak jste tento problém vyřešil. Mockrát děkuji.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 26.0.1410.43  |  [178.72.234.---]

Ano, byla to opravdu moje chyba ;) Do udalost tick jsem mel vrazeny MessageBox, ktery se generoval porad znova do chvile nez se mi podarilo klepnout na tlacitko OK ;) Myslel jsem ze tento MessageBox vygeneruje pouze jedenkrat, ale opak byl pravdou.

Souhlasím  |  Nesouhlasím  |  Odpovědět



Určitě si přečtěte


Neuronová síť Nvidie ukázala, že už brzy nebudeme moci věřit fotografii

Neuronová síť Nvidie ukázala, že už brzy nebudeme moci věřit fotografii

** Zpravodajství je už déle než sto let založené na fotografii ** Vývoj na poli A.I. CGI ale ukazuje blížící se problém ** V éře A.I. bude pochybné téměř vše

5.  12.  2017 | Jakub Čížek | 29

Nejlepší raketa vzduch-vzduch na světě vzejde ze spolupráce Japonců a Britů

Nejlepší raketa vzduch-vzduch na světě vzejde ze spolupráce Japonců a Britů

** Japonsko a Velká Británie utvořili tým, který vyvíjí unikátní střelu pro vzdušné souboje ** Měla by být dokonce lepší, nežli legendární raketa AMRAAM americké U. S. Air Force ** Dotyčná raketa bude náležet do výzbroje stealth letounů v obou zemích

7.  12.  2017 | Stanislav Mihulka | 1

Jak propojit Windows 10 s telefonem: Ideál zatím neexistuje

Jak propojit Windows 10 s telefonem: Ideál zatím neexistuje

** Poslední velká aktualizace Windows 10 přinesla možnost bližšího spojení systému s mobilním telefonem ** Funkcí je zatím minimum, ale existují alternativní způsoby ** Jsou 4 cesty, jak počítač s mobilem provázat

6.  12.  2017 | Vladislav Kluska | 43