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)//Nechapu: (string[])(comboBox1.Tag) /* Předně : TENTO PROGRAM NEUMÍ POSÍLAT/PŘIJÍMAT DATA, JEN MANIPULUJE S PINY PORTU ;) Teď k dotazům: mnoho formulářových objektů má vlastnost, která se jmenuje "Tag" a je typu "object" což je nejvyšší třída, od které se vše odvozuje a je tedy schopna pojmout jakéhokoli potomka od ní odvozeného. To jsou prakticky všechny objekty ke kterým se běžně dostaneš. O řádek výš si pomocí "SerialPort.GetPortNames()" vytáhnu všechny dostupné porty v PC a uložím je právě do "comboBox1.Tag". Ty porty jsou v poli stringů a to lze bezproblémů do prom. typu "object" vložit. V tom IFu se koukám, jesli to pole, který jsem si do "comboBox1.Tag" uložil, nemá nulovou délku. Naneštěstí překladač nemůže čuchat, co si má chorá mysl usmyslela do "Tag" uložit, tak mu to musím říct -> přetypování. "comboBox1.Tag" je vlastnost, kterou budu přetypovávat, musí být v závorkách, jinak by se přetypoval "combobox" a teprve pak se v něm hleda vlastnost "Tag", to by ale byl nesmysl, protže přetypovávám na pole a to tu vlastnost nemá. Výsledkem ((string[])(comboBox1.Tag)) je tedy pole stringů (vlastnost Tag přetypovaná na pole stringů - proč ne, když jsem si tam to pole předtím uložil a tedy VÍM že je to pole) a výrazem "((string[])(comboBox1.Tag)).Length" získám jeho délku. */ { for (int i = 0; i < ((string[])(comboBox1.Tag)).Length; i++) { comboBox1.Items.Add(((string[])(comboBox1.Tag))[i]); } 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)//Tohle je funkce na prijem dat?? //Vpodstatě ano. Třída SerialPort má událost "DataReceived", toto je její obsuha. Přiřazena je o 4 řádky výše (u [1]) { serialPort.DiscardInBuffer();//Tady ho jen vyprazdnujes a nevypisujes nekam?? // správně, tenhle program není určen pro komunikaci, jen na hýbání piny, případná // data by jen prudila v bufferu. } 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 /* Jak je uvedeno výše - výsledkem "((string[])(comboBox1.Tag))" je pole stringů (se jmény portů v PC). K prvkům pole se přistupuje hranatýma závorkama a indexem. "comboBox1.SelectedIndex" je zde ten index. */ //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 /* nejdřív "DtrEnable": je to vlastnost třídy SerialPort, když tam dáš "True", tak se nahodí na pin DTR připojeného COMu jednička. "checkBox_Dtr_CheckedChanged(object sender, EventArgs e)" je událost checkboxu se jménem "checkBox_Dtr", vyvolává se když se zmení stav toho zaškrtávacího políčka. V proměnné "sender" je obvykle reference na objekt, který událost vyvolal, tady je to ten checkBox. Tyto parametry jsou ovšem společné všem událostem a překladač opě neví, co v té proměnné je. Já ovšem vím, že když ji vyvolal checkBox, tak tam taky on je. A proto si zápisem "(CheckBox)sender" tu proměnnou přetypuji na typ "checkBox" aby to věděl i překladač. Jelikož si tu nejsem jistej prioritama, radši závorkuju -> ((CheckBox)sender) = proměnná typu checkBox. Vím, že checkBox má vlastnost "Checked" = jeho stav zaškrtnuto/nezaškrtnuto. Tu vlastnost si vytáhnu právě tím ".Checked". Ta vlastnost je typu bool, tedy true/false. To se mi přesně hodí do toho, co je na levý staraně (serialPort.DtrEnable je taky typ bool), tak to tam tak dám. */ } } private void checkBox_Rts_CheckedChanged(object sender, EventArgs e) { if (serialPort.IsOpen) { serialPort.RtsEnable = ((CheckBox)sender).Checked; } } } }