Porta seriale Classe 4E Febbraio 2013 Form 1 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using 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 System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using 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.