Utilisation du composant SerialPort
Méthode : Ouvrir le port
Cet exemple utilise une combo box et un bouton pour permettre de choisir un port disponible dans le système :
// A chargement du formulaire
// Remplissage de la combo box cmbPort avec les noms des ports séries disponibles
private void Form1_Load(object sender, EventArgs e)
{
foreach (string SerialName in System.IO.Ports.SerialPort.GetPortNames()) cmbPort.Items.Add(SerialName);
}
// Ouverture ou fermeture du port quand on clique sur le bouton OK
// La face du bouton change pour Stop quand le port est ouvert
private void btnOK_Click(object sender, EventArgs e)
{
if ( !serialPort.IsOpen)
{
String port = cmbPort.Text; // Nom du port choisi dans cmbPort
serialPort.PortName = port;
serialPort.Open(); // Ouverture du port
if (serialPort.IsOpen)
{
cmbPort.Enabled = false; // Impossible de choisir un autre port
btnOK.Text = "Stop"; // Modification du texte affiché sur le bouton
}
else MessageBox.Show("Impossible d'ouvrir le port " + port);
}
else
{
serialPort.Close(); // Fermeture du port
cbPort.Enabled = true; // On peut de nouveau choisir un port
btOK.Text = "OK"; // Modification du texte affiché sur le bouton
}
}
Méthode : Écriture de données
private void btnEcrire_Click(object sender, EventArgs e)
{
serialPort.Write("A écrire sur le port série");
}
Méthode : Lecture de données
Lorsque des données sont disponibles dans le tampon de réception, l'événement DataReceived
est déclenché sur un thread secondaire et non sur le thread principal. Toute tentative de modification d'éléments inclus dans le thread principal, tels que les éléments de l'interface utilisateur, peut lever une exception de thread.
S'il est nécessaire de modifier des éléments dans le formulaire, on peut :
renvoyer les demandes de modification à l'aide de
Invoke
, qui réalisera la tâche sur le thread approprié.utiliser l'événement d'un timer qui créer un thread secondaire dans lequel on pourra traiter les données lues à intervalle régulier.
Appel d'un thread secondaire avec Invoke
String RxString ; // Contiendra les données reçues
// Gestion de l'événement de réception de données sur le port série du formulaire (thread principal)
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = serialPort.ReadLine();
this.Invoke(new EventHandler(DisplayText)); //
}
// Méthode de traitement des données reçues exécutées dans un thread secondaire
private void DisplayText(object sender, EventArgs e)
{
// Affichage de la chaine reçue dans la text box txbRecu
txbRecu.Text=RxString;
}
Utilisation d'un timer pour rafraîchir l'IHM à intervalle régulier
String RxString ; // Contiendra les données reçues
// Déclenchement ou arrêt du timer avec un bouton
private void btnLireData_Click(object sender, EventArgs e)
{
if ( btnLireData.Text == "Démarrer la réception")
{
timer.Enabled = true; // Activation du timer
btnLireData.Text = "Stopper la réception" ;
}
else
{
timer.Enabled = false; // Désactivation du timer
btnLireData.Text = "Démarrer la réception"
}
}
// Gestion de l'événement de réception de données sur le port série du formulaire (thread principal)
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = serialPort.ReadLine();
}
// Mise à jour de l'IHM à chaque événement du timer
// Régler la propriété Interval du timer dans le gestionnaire
private void timer_Tick(object sender, EventArgs e)
{
// Affichage de la chaine reçue dans la text box txbRecu
txbRecu.Text=RxString;
}