Umím AVR (C), jaký zvolit jazyk a prostředí pro PC aplikace?

Odpovědi na dotazy k odpovědím na dotazy :smiley:
zdrojak.txt (5.11 KB)

BUDU MUSET NAJIT NAKOU DOBROU LITERATURU,PAC TE TAKHLE OTRAVOVAT PORAD NEJDE… :slight_smile:
ZDROJAK.txt (1.26 KB)

Kdybys tomu chtěl rozumět všemu, čekalo by tě dost práce. Tyhle události a podobný věci jsou pro pokročilý začátečníky :slight_smile:. Tyto věci za tebe obstarává VS samo jen tím, že v properties na něco poklikáš a většinou to nemusíš řešit.
Jinak možná sis všimnul, že si instanci třídy sériovýho portu vytvářím ručně. S klidným svědomím můžeš použít komponentu z toolboxu, je to to samý.
zdrojak.txt (2.82 KB)

Tu máš další kousek na zkoumání, je to odesílání hodnoty nastavený scrollbarem a příjem v dekadický podobě.
CS_W32_tahlo.zip (73.4 KB)

Ahoj.Diky.Tady mi neni jasny tohle:private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { try { if (serialPort1.BytesToRead > 0) { byte] tmp = new byte[this.serialPort1.BytesToRead]; this.serialPort1.Read(tmp, 0, tmp.Length); //This ?? StringBuilder builder = new StringBuilder(); //StringBuilder ?? znam jen string for (int i = 0; i < tmp.Length; i++) { if (i > 0) { builder.Append(" "); } builder.Append(tmp*.ToString()); } if (textBox1.InvokeRequired) //InvokeRequired ??? { Invoke(new EventHandler(delegate { textBox1.Text = "In: " + builder.ToString() + "\r\n" + textBox1.Text; })); } else { textBox1.Text = "In: " + builder.ToString() + "\r\n" + textBox1.Text; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } *

Zdarec,
SringBuilder je proto, že když upravuješ řetězec, vždy je vytvořen nový a starý zahozen -> režie s alokaci a uvolňováním paměti. Kdežto u StringBuileru se upravuje stávající řetězec uložený v builderu. Je to rychlejší, ale když použiješ jen “string”, nic se neděje.

Vlastnost “invokeRequired” souvisí s vícevláknovm programováním. Například formulář jede na jednom vlákně, pak přijde událost a tu .Net vytvoří na vlákně jiném. Pokud potom potřebuješ přistupovat z 1 vlkna k prostředkům jiného, je potřeba tady provést jakýsi “invoke”. Taky přesně nevím o co jde, ber to jako nezbytné tajné zlo, nebo si najdi další info na netu, s tímhle ti víc neporadím. Osobně to používám tak jak to leží, ale hloubji do toho nevidím. Nejsem IŤák, jen .NET využívám, jak určité věci dělá je holt mimo můj dosah. Nejsem si jist, jesli je v možnostech některého člověka pobrat celý C# a . NET :slight_smile:
Mrknu i zítra(teda vlastně dneska) jesli ještě něco nedovymyslím až vystřízlivím :slight_smile: Jinak možná si všimneš, že ve větvi invoke.required i v té druhé je vpodstatě stejný kód. Kdy je to delší než řekněme 10 řádků, vyplatí se to dát do jedn funkce a tu pak volat.

To znamena ze kdyby tam bylo cisty vlozeni toho stringu to TextBoxu tak se to nemusi povist??To se musi vzdy takhle delat kdyz ses v nejake udalosti a chces pracovat s nakou komponentou??Jeste mi pls vysvetli to slovicko this.

Když to tam nebudeš mít, tak ti to vyhodí nějakou threading něco výjimku. To si ostatně můžeš zkusit. Týká se to ale jen asynchronních událostí, což právě příchod dat na port je. Třeba událost od tlačítka na formuláři řešit nemusíš - ta vznikla právě na tom formuláři a je tedy na stejném vlákně.

“this” je odkaz na instanci třídy, ve který právě pracuješ. Když budeš mít například ve třídě proměnnou se stejným názvem jako je parametr funkce, tak k parametru přistupuješ pomocí jeho jména, kdežto k proměnné třídy se dostaneš přes “this.jmenoPromenne”.

Stim this mi to neni uplne jasny,ale to nekde este nastuduju.Mam ted ale problem se spustenim programu.Na radku “SerialPort1.Write(tmp, 0, 1);”
mi to pise ye “The port is closed” .Prikladam projekt(neni este hotovej,ve finale by to ale melo ovladat RGB diodu).
SerRGB.rar (40.2 KB)

To bude asi tím, že port je v ten okamžik uzavřen, proto do něj nemůžeš zapisovat :slight_smile:. Dej to do ifu, podmínka bude “SerialPort1.IsOpen”

Nojo.ja to ale papouskoval od tebe a tys ji tam taky nemel… :slight_smile:

Jenže já v té události jednak nic neposílám a také ji nevyvolávám hned při startu formuláře změnou hodnoty scrollbaru v konstruktoru formuláře :wink:.
Mimochodem - jsi zapoměl heslo že nejsi přihlášen? :slight_smile:

Prihlasen.Spokojenost ? :slight_smile:

Nj,je to tim ze to mam v tom konstruktoru.Jinak to mam jako ty,posilam hodnotu scrollbaru v udalosti change.
Je vhodny inicializovat komponenty prave v tom konstruktoru?Neni na to lepsi nejaka udalost formulare?V delphi bylo asi 5 udalosti kery se postupne vyvolavaji pri startu formulare a byl mezi nima sakra rozdil.Form_OnCreate,Form_Open,atd…

Tady je těch událostí taky povícero. Stačí kliknout na komponentu (tedy i formulář) a v properties se přepnout do “events”.
Ruční způsob je “jmenoKomponenty.jmenoUdalosti +=” + 2xTAB. VS ti vytvoří obsluhu a tu jen doplníš.

Není problém kde provádíš inicializaci ale v tom, že se pokoušíš zapisovat na zavřený port. Tak jak jsi to měl to bez kontroly na otevřenost portu udělat nelze.
Nevím z čeho sosáš, ale já v “táhlu” na port nic nezapisoval, jen zobrazoval hodnotu v labelu (událost “_Scroll”).
Mimochodem - asi bych tam udělal časový omezení třeba na 10 zápisů za vteřinu. Jinak s tím zakvedláš a přenos ti pojede ještě za minutu :smiley:
events.gif

Prepnuti do udalosti znam,ale nic co bz odpovidalo tomu co znam z delphi sem tam prave nenasel.Takze asi ten konstruktor musi stacit.

Je tu “Load” - po načtení formuláře. Víc jich je pro ukončování (closing, closed…)

Protože, poslední dobou řeším taky komunikaci procesoru s PC , ale nejen to - taky zpracování dat z MCU v nějakých grafech , tabulkách atd. - tak sleduju váš dialog - zkoumám pityyho kody a tak.
Ale pro showleeho bych měl jednu radu - nejdřív si prostuduj základy OOP, pak si zkus udělat příklady přímo z VS a pak prostudovat nějaké tutorialy - třeba tady: builder.cz/vb/index.html - tam jsou sice ve VB a C++ (v C# jsem nenašel),ale rozdíl je jen v zápisu (basikovký sub a endsub místo { a} apod.) nebo taky existuje kniha Microsoft Visual studio C#- krok za krokem.
Já jsem to tak udělal a věř mi ,že bys rychleji pochopil, co má pityy na mysli a neptal by ses třeba na this :slight_smile:

To Piityy: Zatim este nemem spichlej prevodnik tak nemuzu experimentovat,tak se mi dystak na to mrkni jestli to dava smysl.

Vysilani z PC mam takto:

//poslu try byte za sebou

private void Timer1_Tick(object sender, EventArgs e) { if (SerialPort1.IsOpen) { byte] tmp = new byte[3]; tmp[0] = (byte)TahloR.Value; tmp[1] = (byte)TahloG.Value; tmp[2] = (byte)TahloB.Value; SerialPort1.Write(tmp, 0, 3); } }
Prijem v MCU:

[code]
//Temi tremi byty si naplnim pole a pri prijmu tretiho posledniho byte pole
rozhodim do prislusnejch promenejch
ISR(USART_TXC_vect)
{
// MCU nema bufer tak delam takhle krkolomne

static unsigned char POLE[3];
static unsigned char INDEX = 0;
if (INDEX < 2)
{
POLE[INDEX] = UDR;
INDEX++;
}
else
{
POLE[INDEX] = UDR;
INDEX = 0;

RED = POLE[0],GREEN = POLE[1],POLE[2];

}

}[/code]

Měhlo by to fungovat. Neděláš to krkolomě, v mcu bez DMA to jinak nejde :slight_smile:
Mimochodem ta obsluha by šla napsat o pár instrukcí efektivněji.

[code]static unsigned char POLE[3];
static unsigned char INDEX;
// staticke promenne automaticky inicializovany na 0
// “nazvyPromennych” by mely byt malymi pismeny aby byly odlisitelne od konstant

POLE[INDEX++] = UDR;

if(INDEX == 3)
{
INDEX = 0;
RED = POLE[0],GREEN = POLE[1],POLE[2];
// tady to asi nepujde napsat na 1 radek a chybi ti tam blue :slight_smile:
}[/code]
Program v PC si můžeš vyzkoušet pomocí com0com a nějakého terminálu. Odkaz jsem tu někde ve vlákně dával.

Nojo, to je krasa:)