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.