Probleme SerialPort

Signaler
Messages postés
2
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
8 novembre 2007
-
Messages postés
329
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
10 mai 2014
-
Bonjour,

je dois créer un programme afin de récupérer et envoyer des données via un port série.
- Mon 1er soucis, est que je ne sais pas comment tester si mon programme fonctionne.
J'ai essayer de le faire dialoguer avec le logiciel Hyperterminal sur un autre PC mais impossible.
Ma 1ère question serait de savoir si quelqu'un saurait comment tester le dialogue entre mon programme et un autre ordinateur?

- Mon 2ème soucis viens du code de mon programme. Pendant l'exécution de celui ci j'ai un problème lors de l'ouverture du port. Le compilateur me dit : Access to the port 'COM1' is denied.
Il marche la 1ère fois de la journée une fois que mon PC à démarrer. Le PC plante au moment d'envoyer ou recevoir des données et du coup je ne referme pas le port après utilisation et j'ai l'impression que ca vient de la.

Voici ma class pour la gestion des données et configuration du port, je m'y suis mis depuis peu, faites preuve d'indulgence ... :


<!-- BEGIN TEMPLATE: bbcode_code -->



Code :
OptionExplicitOn
Imports System
Imports System.IO
Imports System.IO.Ports
Imports System.Text
Imports Microsoft.VisualBasic
 
PublicClass Form1
 
    Private MonPort AsNew PortSerie
    Dim returnStr AsString = ""
 
    PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)HandlesMyBase.Load
        LoginForm1.ShowDialog()
        Me.Text = "Terminal VIZ 100"
        Me.WindowState = FormWindowState.Maximized
        Send_Num.Enabled = False
        Num_serie_recup.Text = ""
    EndSub
 
    PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Button1.Click
        Form2.ShowDialog()
    EndSub
 
    PrivateSub Send_Num_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Send_Num.Click
        ProgressBar1.Value = 0
        SendSerialData(Form2.N_Serie)
    EndSub
 
    PrivateSub Receive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Receive.Click
         ProgressBar1.Value = 0
        
         ReceiveSerialData()
    EndSub
 
    PrivateSub ProgressBar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles ProgressBar1.Click
        ProgressBar1.Minimum = 0
        ProgressBar1.Maximum = 200
    EndSub
 
    Sub SendSerialData(ByVal data AsString)
        MonPort.configuration()
        Using PortSerie As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM1")
            MonPort.ouverture()
            PortSerie.WriteLine(data)
            ProgressBar1.Value += 100
            PortSerie.Close()
            ProgressBar1.Value += 100
            MonPort.fermeture()
        EndUsing
    EndSub
 
    Function ReceiveSerialData()AsString
        MonPort.configuration()
        Using PortSerie As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM1")
            MonPort.ouverture()
            If(SerialPort.IsOpen())Then
                Do
MsgBox("Ouverture réussi", MsgBoxStyle.Information)
                    ProgressBar1.Value = 70
                    Dim Incoming AsString = PortSerie.ReadLine()
                    If Incoming IsNothingThen
                        ExitDo
                    Else
                        returnStr &= Incoming & vbCrLf
                    EndIf
                    ProgressBar1.Value = 120
                Loop
            EndIf
            ProgressBar1.Value = 150
            MonPort.fermeture()
        EndUsing
        Return returnStr
        ProgressBar1.Value = 200
    EndFunction
 
EndClass
 
 
#Region"Classe Port Série"
PublicClass PortSerie
 
    Public NoPort AsString = "COM1"'Numero de port qui sera utilisé
    Public Debit AsInteger = 9600'debit en bits/sec sur le port COM
    Public NbBits AsInteger = 8'bits de donnée
    Public BitStop AsString = IO.Ports.StopBits.One'bit de stop 
    Public Parite AsString = IO.Ports.Parity.None'parité
 
    Dim i AsInteger
 
    Function configuration()AsBoolean
        Form1.SerialPort.PortName = NoPort
        Form1.SerialPort.BaudRate = Debit
        Form1.SerialPort.DataBits = NbBits
        Form1.SerialPort.StopBits = BitStop
        Form1.SerialPort.Parity = Parite
    EndFunction
 
    Function ouverture()AsBoolean
        ' verifie que le port est fermé avant de l'ouvrir
        If(Not(Form1.SerialPort.IsOpen)Or(NoPort = "NULL"))Then
            Form1.SerialPort.Open()
        EndIf
        ouverture = EtatPort()
    EndFunction
 
    Function fermeture()AsBoolean
        ' verifie que le port est ouvert avant de le fermer
        If(Form1.SerialPort.IsOpen())Then
            Form1.SerialPort.Close()
        EndIf
        fermeture = EtatPort()
    EndFunction
 
    Function EtatPort()AsBoolean
        ' test le port et retourn 0 ou 1
        If(Form1.SerialPort.IsOpen())Then
            EtatPort = True
        Else
            EtatPort = False
        EndIf
    EndFunction
 
   
EndClass
#End Region

5 réponses

Messages postés
329
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
10 mai 2014
4
Salut

   Voilà un petit programme qui envoi et reçoit des données depuis 1 port Com, à adapter pour ton besoin
   Il te faut une form, 2 textbox et 1 bouton

   Paramétrage et ouverture du port com au chargement de la fenêtre
   Il faut laisser le port com ouvert si tu veux pourvoir avoir accès aux données qui reviennent.
   Car ton cas tu le ferme après avoir envoyé des données donc tu ne pourras jamais recevoir le retour de ta demande

   En espérant que çà te débloquera

'Chargement de ta fenêtre
Private
Sub Form1_Load(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load

'Permet l'utilisation de datareceive
Control.CheckForIllegalCrossThreadCalls =
False
'N° du port de com à utilisé
SerialPort1.PortName =
"COM1"
'Ferme le port si il est ouvert
   If SerialPort1.IsOpen =
True
Then
      SerialPort1.Close()

   End
If
'Paramétrage du port
SerialPort1.BaudRate =
"9600"
SerialPort1.DataBits = 8
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.Handshake = IO.Ports.Handshake.None

'Ouverture du port
SerialPort1.Open()

End
Sub

Private
Sub btnEnvoi_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles btnEnvoi.Click

'Envoi sur le port série le contenue de la textbox
SerialPort1.WriteLine(txtEnvoi.Text)

End
Sub

Private
Sub SerialPort1_DataReceived(
ByVal sender
As
Object,
ByVal e
As System.IO.Ports.SerialDataReceivedEventArgs)
Handles SerialPort1.DataReceived

'Quand il y a quelquechose dans le buffer de réception çà lit les données et les ajoutes à la textbox
txtReception.Text = txtReception.Text & SerialPort1.ReadExisting.ToString

End
Sub

@+
LIM
Messages postés
329
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
10 mai 2014
4
Re

   J'ai oublié il faut évidement ajouter un objet serialport sur ta fenêtre via la boîte à outils

@+
LIM
Messages postés
2
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
8 novembre 2007

Merci j'essai ca demain et je te tiens au courant.
Messages postés
259
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
5 février 2015

Bonjour Lim,
j'ai essayer le bout de code pour envoyer et recevoir sur le port com
Mais à la fin des caracteres recus dans le textbox j'ai un petit trait vertical en plus a la fin des caracteres ? "
As-tu une idee ?
Mes remerciements
A
Messages postés
329
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
10 mai 2014
4
Salut SEB73460

   Il est possible que ce soit le codage ASCII d'un caractère de fin de trame du style chr(3) ou autre.
   Je ne vois que çà avec les infos que tu me donnes.

@+
LIM