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 ??? >> pomocí závorek se přistupuje k prvkům pole (nelze prázdné závorky mimo deklaraci/přetypování), tady potřebuješ přístup k celému objektu "pole", nikoli k některému prvku. Když bys do závorek dal nějaké číslo, získal bys vlastnost "Length" od prvku, kterým je "string". Tedy bys dostal délku řetězce na daném indexu v poli. Kdybys tedy napsal "int tmp = ((string[])(comboBox1.Tag))[0].Length;", dostal bys délku názvu prvního portu v PC. Pro "COM1" by to bylo 4. */ { 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) { 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 !!!!!!! /* To je zachycení a ošetření výjimky vzniklé v bloku "try". Například dělení nulou nebo pokus o práci se zavřeným portem by bez ošetření vyvolalo výjimku, která by způsobila pád programu (ikdyž někdy to ustojí a nabídne pokračování). Takto tu výjimku zachytíš a v bloku "catch" se rozhodneš, co dál. Vzniklá výjimka se sem předává jako parametr. Je to reference na objekt typu "exception", ten má vlastnost "message", ve které je popis výjimky. Jen zde tu výjimku vypíšu uživateli do messageBoxu a dál nic neřeším. */ { 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... >> tady šlo, jen někdy používám jednu obsluhu pro více událostí a tam bys potom nevěděl, od koho ta událost vznikla, takhle máš vždy k tomu prvku, který událost vyvolal, přístup. Tady je to opravdu zbytečné, protože jsem každému checkboxu udělal událost vlastní. Šlo by to ovšem napsat do jedné a pak už bys bez toho byl namydlenej :) } } private void checkBox_Rts_CheckedChanged(object sender, EventArgs e) { if (serialPort.IsOpen) { serialPort.RtsEnable = ((CheckBox)sender).Checked; } } } }