Période 2 : Développement logiciel

Utilisation du composant SerialPort

MéthodeOuvrir 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éthodeLecture 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;

}

PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimerRéalisé avec Scenari (nouvelle fenêtre)