Utilisation du port série et détection d'un modem rtc branché sur l'ordi

Soyez le premier à donner votre avis sur cette source.

Snippet vu 20 757 fois - Téléchargée 29 fois

Contenu du snippet

A la base du projet je veux faire un programme qui communique avec un central téléphonique PABX, pour modifier afficher des informations.

Pour cet exemple j'utilise juste une form appelée Form1 et un serialport appelé PSerie

J'ai fait une petite classe qui permet de :
Configurer un port COM
Ouvrir un port COM en vérifiant, qu'il est bien fermé et que le Numéro de port est bien branché au modem
Fermé un port COM
Vérifier l'état du port COM.
Vider Buffer
EnvoyerCommande() permet d'envoyer une commande, d'attendre... (tempo en milliseconde) et de lire le buffer du port COM.
TrouverModem() permet de d'envoyer une commande AT sur chacun des port, et si un Modem répond son nom et enregistré dans la variable NoPort

a l'ouverture de l'objet, le tableau ListePorts et initialisé avec la liste des port disonible sur l'ordinateur

je n'arrive pas a utiliser la fonction événement DataRecived(), c'est un problème de thread, j'ai comprends rien ca m'énerve si quelqu'un y arrive, qu'il me fasse signe.

Source / Exemple :


Public Class Form1

    Dim MonPort As New portserie

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        If (MonPort.TrouverModem()) Then
            MessageBox.Show("Connecter la ligne téléphonique sur le modem RTC branché sur le port " & MonPort.NoPort, "Modem Trouvé", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            MessageBox.Show("Aucun Modem RTC n'a été trouvé", "Boulette", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If

    End Sub

End Class

#Region "Classe port Serie"
Public Class portserie

    Public ListePorts() As String = System.IO.Ports.SerialPort.GetPortNames 'liste des port COM disponible sur l'ordinateur
    Public NoPort As String = "NULL" 'Numero de port où est branché un modem RTC
    Public Debit As Integer = 9600 'delit en bits/sec sur le port COM
    Public NbBits As Integer = 8 'bits de donnée
    Public BitStop As String = IO.Ports.StopBits.One 'bit de stop  
    Public Parite As String = IO.Ports.Parity.None 'parité 

    Public BufferIN As String = "" '

    Function configuration() As Boolean
        Form1.PSerie.PortName = NoPort
        Form1.PSerie.BaudRate = Debit
        Form1.PSerie.DataBits = NbBits
        Form1.PSerie.StopBits = BitStop
        Form1.PSerie.Parity = Parite
    End Function

    Function ouverture() As Boolean
        ' verifie que le port est fermé avant de l'ouvrir
        If (Not Form1.PSerie.IsOpen() Or NoPort = "NULL") Then
            Form1.PSerie.Open()
        End If
        ouverture = EtatPort()
    End Function

    Function fermeture() As Boolean
        ' verifie que le port est ouvert avant de le fermer
        If (Form1.PSerie.IsOpen()) Then
            Form1.PSerie.Close()
        End If
        fermeture = EtatPort()
    End Function

    Function EtatPort() As Boolean
        ' test le port et retourn 0 ou 1
        If (Form1.PSerie.IsOpen()) Then
            EtatPort = True
        Else
            EtatPort = False
        End If
    End Function

    Sub ViderBuffer()
        While (Form1.PSerie.BytesToRead() <> 0)
            BufferIN &= Form1.PSerie.ReadLine()
        End While
    End Sub

    Sub EnvoieCommande(ByVal TempoMs As Integer, ByVal commande As String)
        BufferIN = ""
        Form1.PSerie.Write(commande & vbCrLf)
        System.Threading.Thread.Sleep(TempoMs)
        ViderBuffer()
    End Sub

    Function TrouverModem() As Boolean
        'recherche dans la liste des port de l'ordi celui qui répond a la commande AT
        Dim i As Integer

        TrouverModem = False

        For i = 0 To listePorts.Length - 1
            Form1.PSerie.PortName = listePorts(i)
            Form1.PSerie.Open()
            EnvoieCommande(500, "AT")
            If (BufferIN Like "*OK*") Then
                NoPort = ListePorts(i)
            End If
            Form1.PSerie.Close()
        Next
        If (NoPort <> "NULL") Then
            ouverture()
            TrouverModem = True
        End If
    End Function
End Class
#End Region

Conclusion :


Je n'ai pas trouvé de source qui me convenais pour le port COM en VB.net alors j'en ai fais une et je vous la donne.

Voila, c'est mon 1er code en VB.NET, alors soyez indulgent

A voir également

Ajouter un commentaire

Commentaires

Messages postés
4
Date d'inscription
vendredi 27 février 2009
Statut
Membre
Dernière intervention
27 mai 2009

bon travail
svp, tu peut mettre ce programme en ZIP
Messages postés
17
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
18 mai 2009

salut;
je veut savoir si je peut recuperer les données reçues d'un buffer dans une table de base se donnée access'et si fesable commant?
Messages postés
17
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
18 mai 2009

salut;
je veut savoir si je veut faire la connexion puis envoyer une donnée et recuperer les données reçues sur le buffer dans une base se donnée?
Messages postés
64
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
21 novembre 2015

Et t'il possible d'avoir le projet complet?
Messages postés
7
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
13 juin 2007

J'essaye depuis un petit moment de detecter la reception de donnée sur mon port serie pour l'afficher dans une RichTextBox.

J'ai l'impression que c'est exactement ce que vous faites ici mais moi je n'y arrive pas je pense quue je doit mal declarer mon sous-programme DataReceved.
Quelqu'un pourrais jeter un coup d'oeil.

Private Sub PortRS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)

Dim Buffer As String = PortRS232.ReadExisting()

'L'évènement DataReceived se situe sur un thread différent que le form, nous devons donc appelé un délégué pour afficher le résultat à l'écran
If Me.InvokeRequired Then
Me.Invoke(New d_Affiche(AddressOf Affiche), Buffer)
End If
End Sub

'fonction permettant l'affichage des données lors de l'appel du délégué
Private Sub Affiche(ByVal Texte As String)
RichTextBox1.Text &= Texte
End Sub
Afficher les 24 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.