seriovy port

Programovacie jazyky, rady, poradňa...
pokrivnik
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 46
Registrovaný: 23 nov 2005, 19:35
Kontaktovať používateľa:

seriovy port

Príspevok od používateľa pokrivnik »

Zdravim, mam mensi problem. Potrebujem citat cez seriovy port z mcu nejake data a mam to spravene nasledovne:

pri inicializacii serioveho portu mam:

serial.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived);

a pre prijem a vypis mam funkcie:

private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string sprava = serial.ReadExisting();
vypis(sprava);
}

private void vypis(string vypis)
{
richTextBox2.Text = vypis;
}

Následne po spusteni aplikacie a inicializacii mi VS vypise hlasku pri richTextBox2.Text = vypis;

"Operace mezi podprocesy není platná: Přístup k ovládacímu prvku richTextBox2 proběhl z jiného podprocesu než z podprocesu, v rámci kterého byl vytvořen."

Neviete niekto poradit kde by mohol byt problem???
refr0
Star
Star
Príspevky: 521
Registrovaný: 26 nov 2005, 10:55
Bydlisko: Trenčín
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa refr0 »

Nemozes pristupovat z jedneho vlakna (DataReceived) krizom do vlakna GUI. Je to z bezp. dovodov zablokovane.
pokrivnik
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 46
Registrovaný: 23 nov 2005, 19:35
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa pokrivnik »

A ako mam teraz tie prijate data zapisať tam kam potrebujem?
refr0
Star
Star
Príspevky: 521
Registrovaný: 26 nov 2005, 10:55
Bydlisko: Trenčín
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa refr0 »

No mozes napr vyuzit delegata a funckiu Invoke.
Priklad impl.:

serial_DataReceived:

Kód: Vybrať všetko

private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  string sprava = serial.ReadExisting();
  vypis(sprava);
}
vypis:

Kód: Vybrať všetko

private void vypis(string value)
{
  // Pokial sa vola metoda z ineho vlakna
  if (InvokeRequired)
  {
     Invoke(new vypisDelegate(vypis), value);
  }
  else
  {
    richTextBox2.Text = value;
  }
}
vypisDelegate:

Kód: Vybrať všetko

delegate void vypisDelegate(string value); 
Pisem to z hlavy tak hadam to bude fungovat :D
pokrivnik
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 46
Registrovaný: 23 nov 2005, 19:35
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa pokrivnik »

refr0: paraaada funguje to. dakujem :wink:

A ešte k tomuto dotaz. Môže sa stať, že sa mi pri takomto spôsobe nejake dáta stratia? Že ich nestihnem prečítať, prípadne že prečítam neúplné slovo , alebo niečo podobné?
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa axxis »

pokrivnik napísal:refr0: paraaada funguje to. dakujem :wink:

A ešte k tomuto dotaz. Môže sa stať, že sa mi pri takomto spôsobe nejake dáta stratia? Že ich nestihnem prečítať, prípadne že prečítam neúplné slovo , alebo niečo podobné?
stat sa to samozrejme moze, vzdy ked robis citania ci z portov, socketov alebo stremov tak ich po praci zatvaraj. tym zaistis, ze vsetko bude tak ako ma byt.
(idealne to zatvaranie rob v bloku finally chytania vynimky, tak si zaistis konzistenciu za vsetkych okolnosti)
refr0
Star
Star
Príspevky: 521
Registrovaný: 26 nov 2005, 10:55
Bydlisko: Trenčín
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa refr0 »

Najlepsie by bolo keby si si precital dokumentaciu k danemu zariadeniu a cital pole bytov z bufferu. Urcite to ma nejaku kontrolu. Ci uz nejaky ACK (NAK) byte pri posielani poziadavky popripade nejaky BCC (Block Check Character) na overenie kompletnosti spravy. Co sa tyka otvarania a zatvarania komunikacie po kazdom prikaze nemyslim si ze je to dobra volba pri vsetkych situaciach. Hlavne nie ak prichodzia sprava je vyvolana na zariadeni a nie nejakou poziadavkou od uzivatela z programu.
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa axxis »

ja som napisal zatvorit po skonceni prace, nie po kazdom prikaze. :)
ale ked si komunikaciu flushne po kazdom citani nic sa mu nestane
pokrivnik
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 46
Registrovaný: 23 nov 2005, 19:35
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa pokrivnik »

No ja si data posielam z mikrokontrolera, nic dolezite, teplota, napetie a podobne, no potrebujem to v aplikacii zobrazovat. Budem to este musiet dat do nejakej formy, pretoze zatial posielam iba napetie, ale bude toho viac a budem to musiet nejak rozlisit.

Port zatvaram az pri ukonceni programu, pretoze aplikacia ovlada mikrokontroler a bolo by zbitocne ho stale otvarat a zatvarat ak nieco porebujem spravit.

Este by som sa opytal, aky prvok je najidealnejsi na zobrazovanie jednej hodnoty, napr. napetie 7.2V?? Skusam to v richtextbox aj v label, no ak tu hodnotu stale prepisujem po jednej sekunde, vzdy mi to vypise a potom sa akoby zmaze, cize to vlastne preblikava. Ak to ale v richtextbox necham zapisovat pod seba richTextBox2.Text += hodnota; tak to funguje
refr0
Star
Star
Príspevky: 521
Registrovaný: 26 nov 2005, 10:55
Bydlisko: Trenčín
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa refr0 »

axxis napísal:ja som napisal zatvorit po skonceni prace, nie po kazdom prikaze. :)
ale ked si komunikaciu flushne po kazdom citani nic sa mu nestane
Jj sry prehliadol som :D Len som uz videl niekde take riesenia ze to tak robili...

Hm no jasne ze to preblikne vsak sa predsa musi nejako zmenit to cislo... Samozrejme predpokladam ze slovo "napatie" mas v jednom label a to cislo samotne v dalsiom nech to nepreblikava cele.
pokrivnik
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 46
Registrovaný: 23 nov 2005, 19:35
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa pokrivnik »

jj to je samozrejme, ze je to osobitne :) len sa mi nepaci ze to preblikava :lol:
refr0
Star
Star
Príspevky: 521
Registrovaný: 26 nov 2005, 10:55
Bydlisko: Trenčín
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa refr0 »

No hej ale ako to chces potom prekreslit.

Inac k tomu zasielaniu tych hodnot ak to chces mat korektne...
Tak si urob taku vlastnu sadu instrukcii. A na konci vzdy posli nejaky BCC kod ktorym si overis kompletnost spravy.
pokrivnik
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 46
Registrovaný: 23 nov 2005, 19:35
Kontaktovať používateľa:

Re: seriovy port

Príspevok od používateľa pokrivnik »

a neslo by to spravit tak, aby mi v rich text box zapisovalo stale na prvy riadok?

//autoeditácia príspevku (16 Apr 2012, 17:04)
Teraz som prisiel na to, ze ono mne tam nevadi preblikavanie vykreslovania. ono to ne nejaky iny problem. mne zapise hodnotu do poľa a potom ju akoby vymaže/prepíše nejakým prázdnym elementom

//autoeditácia príspevku (16 Apr 2012, 17:18)
Tak preblikávanie mám vyriešené. Ja som posielal som z mikrokontrolera navyše znak 0x0D. A to tam blblo. Čo sa mi ale nepodarilo vyriešiť je to, že mi niekedy zobrazí iba posledné 3 znaky z prijatého reťazca. V terminále mi to ale funguje dobre.
Napísať odpoveď