porta seriale febbraio-marzo
Transcript
porta seriale febbraio-marzo
Porta seriale – Classe 4E – Febbraio 2013 Form 1 using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { /* * 1. inserire un componente SerialPort * mi accorgo che non rimane sul form1 * viene inserito nello spazio in basso * Controllare 5 Proprietà * Portname=COM1 * BaudRate=9600 * Parity=None * DataBits=8 * Stopbits=One * * 2. creazione di un form di dialogo * menù Progetto - Aggiungi Windows form * Windows Form - Aggiungi * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 3. Nel Form2 aggiungo un Button 3 proprietà: name = btnOK Text = OK DialogResult = OK 4. Nel Form2 aggiungo 2° Button 3 proprietà: name = btnCancel Text = Annulla DialogResult = Cancel 5. Nel Form2 aggiungere ComboBox 3 proprietà Name = cmbPortName TabIndex=0 (cursore nel ComboBox) Modifiers=Internal (ListBox in Form2 visibile anche dal codice presente in Form1) 6. Nel Form2 aggiungere 2° ComboBox 3 proprietà Name = cmbBaudRate TabIndex=1 Modifiers=Internal 7. Nel Form2 6 proprietà ControlBox = False Text=Selezione porta seriale FormBorderStyle=FixedDialog StartPosition=CenterParent AcceptButton=btnOK CancelButton=btnCancel 8. Aggiungere al form di avvio (Form1) un controllo MenuStrip 9. selezionare Menustrip1 nel Form1 poi cliccare su "digitare qui" e scrivere "RS232" (Proprietà Text) 10. cliccare su "digitare qui" sotto la scritta RS232 (punto 9.) e poi scrivere "Selezione port seriale" 11. Proprietà Name : mnuSelezione 12. cliccare su "digitare qui" sotto la scritta Selezione port seriale (punto 10.) e poi scrivere "Chiusura port seriale" 13. Proprietà Name : mnuChiudiPort 14. selezionare l'evento click per mnuSelezione (così in automatico si crea un metodo di gestione dell'evento click) si usa il pulsante "fulmine" poi doppio click sx su "click" 15. selezionare l'evento click per mnuChiudiPort (così in automatico si crea un metodo di gestione dell'evento click come punto 14.) 16. modificare la gestione dell'evento FormClosed: si seleziona Form1, poi l'evento FormClosed nel file Form1.Designer.cs (con esplora soluzioni) * cliccare su codice generato poi * sostituire * il presente this.Form1_FormClosed * con * il nuovo this.mnuChiusura_Click * infine cancellare il metodo Form1_FormClosed * * 17. nel Form1 scriviamo le istruzioni del * metodo mnuSelezione_Click * * 18. nel Form1 scriviamo le istruzioni del * metodo mnuChiudiPort_Click * * */ } private void mnuSelezione_Click(object sender, EventArgs e) { //dichiaro un nuovo oggetto della classe Form2 Form2 frmCom=new Form2(); //mostrare le finestra di dialogo modale in cui //selezionare la porta Com ed il relativo BaudRate frmCom.ShowDialog(this); //verificare se si è chiuso frmCom cliccando su OK if (frmCom.DialogResult == DialogResult.OK) try { serialPort1.PortName = frmCom.cmbPortName.SelectedItem.ToString(); serialPort1.BaudRate = Convert.ToInt32(frmCom.cmbBaudRate.SelectedItem); serialPort1.Open(); this.Text = serialPort1.PortName + "BaudRate=" + serialPort1.BaudRate; } catch (InvalidOperationException ex) { MessageBox.Show(ex.Message, "Attention"); } } private void mnuChiudiPort_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { this.Text = "Chiusa" + serialPort1.PortName; serialPort1.Close(); } } private void mnuSelezione_Click() { } } } Form 2 using using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms; System.IO.Ports; namespace WindowsFormsApplication1 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { // Form 2 // punto 1 // doppio click sx sul Form2 (crea metodo Form2_Load) // // punto 2 // aggiungo using System.IO.Ports; // // punto 3 // inseriamo istruzioni Form2_Load // // punto 3a // iniziamo dalle istruzioni per BaudRate cmbBaudRate.Items.Add(300); cmbBaudRate.Items.Add(1200); cmbBaudRate.Items.Add(2400); cmbBaudRate.Items.Add(4800); cmbBaudRate.Items.Add(9600); cmbBaudRate.Items.Add(14400); cmbBaudRate.Items.Add(19200); cmbBaudRate.Items.Add(28800); cmbBaudRate.Items.Add(38400); cmbBaudRate.Items.Add(57600); cmbBaudRate.Items.Add(115200); // punto 3b // impostiamo l'elemento iniziale cmbBaudRate.SelectedIndex=4; // punto 3c // salva elenco porte in una matrice string[] porteCom = SerialPort.GetPortNames(); // punto 3d // visualizza elementi matrice in cmbPortName for (int i = 0; i < porteCom.Length; i++) cmbPortName.Items.Add(porteCom[i]); // punto 3e // controllo della presenza di almeno una porta COM if (cmbPortName.Items.Count != 0) cmbPortName.SelectedIndex = cmbPortName.Items.Count - 1; else { MessageBox.Show("Attention", " there isn't port COM", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); } // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // } } } punto 4 dopo avere salvato tutto si esegue il programma si apre e si chiude una porta COM poi si verifica che se si apre 2 volte la porta COM viene visualizzato errore (non può aprire 2 volte) poi (dopo aver chiuso la porta COM già aperta) verificare che si può aprire la porta COM chiudo porta e chiudo programma riassumendo AVVIO - apro-chiudo apro - apro (ricevo errore) - chiudo - apro (ok) - chiudo - OFF preparare un cavo COM con i pin 2 e 3 cortocircuitati in questo modo ricevo ciò che trasmetto (sullo stesso computer) se trasmetto 3 (io stesso) ricevo 3 per operare tra 2 computer devo invece preparare un cavo COM con i pin 5 collegati tra loro (gnd) e i pin 2-3 incrociati ossia pin2 del PC1 va al pin3 del PC 2 ossia pin3 del PC1 va al pin2 del PC 2 punto 5 verificare il funzionamento del file.exe (con il programma Visual C chiuso) il quale si trova nella directory C:\Users\francesco\Documents\Visual Studio 2010\ Projects\porta seriale 4E febbraio 2013\ porta seriale 4E febbraio 2013\bin\Release o Debug Marzo 2013 Nel Form 1 abbiamo aggiunto un Text Box per inserire il dato da trasmettere, una label per visualizzare il dato ricevuto, 1 Button per dare il comando di Trasmissione. Abbiamo aggiunto le istruzioni abbinate al Button “Trasmetti” private void btnTrasmetti_Click(object sender, EventArgs e) { // dichiara matrice byte da un elemento byte [] dato = new byte[1]; // acquisisce dato da trasmettere try { dato[0] = Convert.ToByte(txtTrasmetti.Text); } catch(OverflowException ex) { MessageBox.Show(ex.Message, "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch(FormatException ex1) { MessageBox.Show(ex1.Message, "Attenzione", MessageBoxButtons.OK,MessageBoxIcon.Error); } // trasmette il dato alla porta seriale serialPort1.Write(dato, 0, 1); } Abbiamo aggiunto le istruzioni abbinate all’evento DataReceived (della porta seriale). private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { // lettura dato da porta seriale int dato = serialPort1.ReadByte(); // visualizzazione dato ricevuto lblRicevi.Text = dato.ToString(); } Utilizziamo un cavo USB – seriale RS232 Colleghiamo un cavo per cortocircuitare tra loro pin 2 e pin 3 (ossia cortocircuitare il pin Trasmetti con il pin Ricevi) Il pin 5 (gnd) è il medesimo e quindi vale sia per trasmettere che per ricevere. Collaudo: • colleghiamo il cavo • apriamo la porta seriale abbinata all’USB (ad esempio COM6), • trasmettiamo un numero tra 0 [0000 0000] e 255 [1111 1111] (compresi) • otteniamo contemporaneamente la trasmissione e la ricezione dello stesso dato numerico.