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

sla by ta komponenta nekde stahnout a doinstalovat?Neo pripadne udelat po svim??to by ale bylo asi slozity do zacatku,tvorba vlastnich komponent asi nebude uplne pro muj level… :frowning:

Takovýto scrollbar :slight_smile: Ten tu je, jmenuje se VScrollBar a HScrollBar.

A jaky si myslel ? :slight_smile: No ja ale nic nemuzu najit,myslel sem ze to bude v common controls ale tam nic nevidim,ani nikde jinde.V delphi stacil jeden a horizontal bo vertikal se u nej nastavilo v properties… :slight_smile: Ach jo to sou problemy…

Myslel jsem scrollbar třeba na formuláří nebo v textboxu, ty právě mají vlastní.
V toolboxu si rozbal “All Windows Forms”, tam je najdeš. Jen mi není jasný, proč má prevít maximum o 9 menší, než mu nastavím… :frowning:
No nic, přikládám klikátko se scrollbarem :wink:.
Nevím, jesli to bylo i v Delphi, ale mohly by se ti tu líbit “snipets” - zkus napsat třeba “for” a 2x TAB.
CS_W32_tahlo.zip (36.7 KB)

Jo tak sem ho nasel parada dikes.Ale snipes sem teda nenasel,nebo nevim co tim myslis,ani nnevim kam mam napsat for,nechapu tedkom… a kdyz dam open projekt a vyberu nejakej tvuj projekt kerej sem si odsud stahnul tak se mi nezobrazi kod ani formular.jen kdyz dam debug tak se to spusti a vidim jen ve vysledku co si naprogramoval…

view->solution explorer-> pravy na form1.cs-> view code, view designer
to ti zobrazi designer (= formulář) a (nečekaně:)) zdroják.
C# je objektovej jazyk, jehož základem jsou třídy (class). Ve třídách si můžeš vytvářet metody a do nich psát kód.
Právě když bys psal ručně, tak musíš napsat celej cyklus for(xx;xx;xx){}. Kdežto když napíšeš jen “for” a dáš 2x TAB, tak ti to tam celej cyklus hodí samo a ty si ho jen vyplníš. Taková fičurka :slight_smile: To jsou ty snipets - předpřipravený kusy kódu.
Kdyby ses chtěl podívat na jejich seznam, tak v místě, kde lze psát výkonný kód (v nějaký metodě) můžeš dát pravý->insert snippet a uvidíš je tam.
další užitečná je “mb” + 2xTAB = messageBox.

Zdarec, jak se daří? už jsi něco poslal? :slight_smile:

Kdyby sis chtěl pro začátek svůj výtvor vyzkoušet jen na PC, tak na to se dobře hodí emůlátor propojených seriových portů (null modem) com0com (sourceforge.net/projects/com0com/). Na jeden port si připojíš svůj prográmek, na druhý nějaký terminál a už můžeš zkoušet.
Jen bacha - ten program vymejšlí portům všelijaký jména. Abys mohl port používat v C#, musí se jmenovat “COM” + číslo, takže kdyžtak v programu přejmenovat.

Cao,bohuzel sem nemel dneska cas,a bude to horsi tak bna tejden :frowning:
No asi bych ztoho neco vykuchal,ale par vecem tam nerozumim tak kdyby si mi osvetlil par veci at aspon vim co kucham :slight_smile: Pridal sem tam komentare tak je prepis akorat vysvetlivkou.Diky ti velice Piityy uz ted…

[code]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace CS_W32_serial_ctrl
{
public partial class Form1 : Form
{
SerialPort serialPort; //Tady mi neni jasny co se deje,
public Form1()
{
InitializeComponent();
comboBox1.Tag = SerialPort.GetPortNames();
if (((string])(comboBox1.Tag)).Length != 0)//Nechapu: (string])(comboBox1.Tag)
{
for (int i = 0; i < ((string])(comboBox1.Tag)).Length; i++)
{
comboBox1.Items.Add(((string])(comboBox1.Tag))*);

            }
            comboBox1.SelectedIndex = 0;
        }
        else
        {
            MessageBox.Show("V počítači není žádný PORT !!!");
        }
        serialPort = new SerialPort();
        serialPort.PinChanged += new SerialPinChangedEventHandler(serialPort_PinChanged);
        serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
    }

    void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)//Tohle je funkce na prijem dat??
    {
        serialPort.DiscardInBuffer();//Tady ho jen vyprazdnujes a nevypisujes nekam??
    }

    void serialPort_PinChanged(object sender, SerialPinChangedEventArgs e) 
    {
        checkBox_Cd.Checked = serialPort.CDHolding;
        checkBox_Cts.Checked = serialPort.CtsHolding;
        checkBox_Dsr.Checked = serialPort.DsrHolding;
    }

    private void butt_open_Click(object sender, EventArgs e)
    {
        try
        {
            if (serialPort.IsOpen != true)
            {
                serialPort.PortName = ((string])(comboBox1.Tag))[comboBox1.SelectedIndex];//nechapu ten zapis
                //Podle čísla zvolené položky v comboboxu se přiřadí jméno dané položky na indexu v poli na proměnnou PortName.
                //Pole se jmény jse ve vlastnosti Tag daného comboboxu.
                serialPort.Open();
                label_stav.Text = "Port " + serialPort.PortName + " otevren.";
                butt_open.Text = "Close";
            }
            else
            {
                serialPort.Close();
                label_stav.Text = "Odpojeno";
                butt_open.Text = "Open";
            }
        }
        catch (Exception ex)//Nevim co je catch (Exception ex)
        {

            MessageBox.Show(ex.Message);
        }
    }

    private void checkBox_Dtr_CheckedChanged(object sender, EventArgs e)
    {
        if (serialPort.IsOpen)
        {
            serialPort.DtrEnable = ((CheckBox)sender).Checked;//Tenhle napis nechapu (CheckBox)sender),a nevim co je .DtrEnable
        }
    }

    private void checkBox_Rts_CheckedChanged(object sender, EventArgs e)
    {
        if (serialPort.IsOpen)
        {
            serialPort.RtsEnable = ((CheckBox)sender).Checked;
        }
    }[/code]*

Bylo to moc dlouhý, máš to jako přílohu :wink:.
zdrojak.txt (6.68 KB)

Tak a sou to otazky na odpovedi :smiley: Skoda ze tu nemam Visual studio,bych uz neco poslal MCUcku :frowning:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace CS_W32_serial_ctrl
{
public partial class Form1 : Form
{
SerialPort serialPort; //Tady mi neni jasny co se deje
// >> vytvoření proměnné typu SerialPort (třída pro obsluhu COMu), ale zatím je neinicializovaná
// přesněji jde o referenci na objekt typu …
public Form1()
{
InitializeComponent();
comboBox1.Tag = SerialPort.GetPortNames();
if ( ( (string]) (comboBox1.Tag) ).Length != 0)
/*
AHA TAK TAKHLE SE PRETYPOVAVA TEDA,NECHAPU ALE KDYZ TO MA BEJT POLE TAK ZE V TY ZAVORCE JE STRING]
A PROC KDYZ JE TO POLE SE TADY NEMUSI UVIST HRANATA ZAVORKA,TAKHLE ((string]) (comboBox1.Tag))].Length ???
/
{
for (int i = 0; i < ((string])(comboBox1.Tag)).Length; i++)
{
comboBox1.Items.Add(((string])(comboBox1.Tag))
);

            } 
            comboBox1.SelectedIndex = 0; 
        } 
        else 
        { 
            MessageBox.Show("V počítači není žádný PORT !!!"); 
        } 
        serialPort = new SerialPort();	// inicializace = vytvoření instance třídy SerialPort, její fyzický vznik v paměti.
        serialPort.PinChanged += new SerialPinChangedEventHandler(serialPort_PinChanged); 
        serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);  //[1]
    } 

    void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    { 
        serialPort.DiscardInBuffer();
									
    } 

    void serialPort_PinChanged(object sender, SerialPinChangedEventArgs e) 
    { 
        checkBox_Cd.Checked = serialPort.CDHolding; 
        checkBox_Cts.Checked = serialPort.CtsHolding; 
        checkBox_Dsr.Checked = serialPort.DsrHolding; 
    } 

    private void butt_open_Click(object sender, EventArgs e) 
    { 
        try 
        { 
            if (serialPort.IsOpen != true) 
            { 
                serialPort.PortName = ((string])(comboBox1.Tag))[comboBox1.SelectedIndex];//nechapu ten zapis
                serialPort.Open(); 
                label_stav.Text = "Port " + serialPort.PortName + " otevren."; 
                butt_open.Text = "Close"; 
            } 
            else 
            { 
                serialPort.Close(); 
                label_stav.Text = "Odpojeno"; 
                butt_open.Text = "Open"; 
            } 
        } 
        catch (Exception ex)//TOHLE TAKY NECHAPU !!!!!!!
        { 

            MessageBox.Show(ex.Message); 
        } 
    } 

    private void checkBox_Dtr_CheckedChanged(object sender, EventArgs e) 
    { 
        if (serialPort.IsOpen) 
        { 
            serialPort.DtrEnable = ((CheckBox)sender).Checked;
            /*A NESLO BY TU JEDNODUSE NAPSAT: serialPort.DtrEnable = CheckBox_Dtr.checked;
              PROSTE STAV BOXU PRI ZMENE SOUPNU NA PIN...

        } 
    } 

    private void checkBox_Rts_CheckedChanged(object sender, EventArgs e) 
    { 
        if (serialPort.IsOpen) 
        { 
            serialPort.RtsEnable = ((CheckBox)sender).Checked; 
        } 
    }
}

}*
zdrojak.txt (3.61 KB)

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”