Problème de réception port série visual basic ( visual studio 2012)
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Problème de réception port série visual basic ( visual studio 2012)



  1. #1
    extremgear

    Problème de réception port série visual basic ( visual studio 2012)


    ------

    Bonjour,

    J'essaye de faire fonctionner une application toute simple en visual basic qui doit recevoir des valeurs du port série pour ensuite les afficher dans une listbox, mais ça fonctionne de manière très aléatoire, j'ai tout un tas de messages d'erreur que je ne comprend pas même en cherchant sur le web , enfin rien qui correspond à mon application.
    Le programme est issu de morceaux de codes trouvés sur le web que j'ai agencé à ma manière ( surement comme il faut pas ...)
    Lorsque je reçois les données sur un terminal tout est OK donc j'exclue une erreur venant de l'extérieure , ou alors une erreur de timing ...

    Grosso modo j'attend que le port reçoive quelque chose par le biais de l'évènement "SerialPort1_DataReceived" : aprés réception d'un nombre donné d'octets sur le port série cette fonction se déclenche et en appel une autre afin d'afficher les valeurs , je pensais qu'en réglant le paramétre "ReceivedBytestreshold" sur le nombre d'octet à recevoir tout allait se passer comme prévu sauf que j'ai ce message d'erreur "L'index se trouve en dehors des limites du tableau." lorsque je tente de lire les octets dans le buffer de réception ...
    je ne sais pas quoi faire , tout les examples que je trouve sur le web ne correspondent pas à ce que je veux faire .
    sachant que si je tente de lire un seul byte à la fois c'est ok et ça a marché a peu prés correctement il y a 3 jours j'affichais les valeurs comme je le voulais , mais je pense que ma "méthode " de réception n'est pas bonne et j'ai rien trouvé de mieux .

    Avant je me servais d'un timeout d'un timer pour lire le buffer toute les X secondes mais j'ai lu que c'est pas le mieux .
    Depuis j'utilise ça :
    Code HTML:
        Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            'Handles serial port data received events
            UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf acquisition)
            Dim n As Integer = SerialPort1.BytesToRead 'find number of bytes in buf
            comBuffer = New Byte(n) {} 're dimension storage buffer
            SerialPort1.Read(comBuffer, 0, n)
            Me.Invoke(UpdateFormDelegate1) 'call the delegate
    Mais je comprend pas tout ....
    De plus je n'ai plus la possibilité de mettre le programme en pause j'ai ce message :" la pile d'appel contient du code externe" aucune source disponible.

    Merci pour votre aide.

    Voila le programme , enfin je sais pas si on peut appeler ça comme ça :

    Code HTML:
    Imports System.IO
    Imports System.IO.Ports
    Imports System.Threading
    
    Public Class Form1
        Shared _continue As Boolean
    
        Private SerialPort As New SerialPort
        Private comBuffer As Byte()
        Private Delegate Sub UpdateFormDelegate()
        Private UpdateFormDelegate1 As UpdateFormDelegate
    
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            SerialPort1.Close()
            AddHandler SerialPort1.DataReceived, AddressOf SerialPort1_DataReceived
        End Sub
    
        Private Sub Boutonconnecter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Boutonconnecter.Click
            SerialPort1.PortName = "COM8" 'change com port to match your Arduino port
            SerialPort1.BaudRate = 19200
            SerialPort1.DataBits = 8
            SerialPort1.Parity = Parity.None
            SerialPort1.StopBits = StopBits.One
            SerialPort1.Handshake = Handshake.None
            ' SerialPort1.Encoding = System.Text.Encoding.Default 'very important!
            Boutonconnecter.Enabled = False
            Boutonconnecter.Enabled = True
            Try
                SerialPort1.Open()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    
        End Sub
    
        Private Sub Boutonfermer_Click(sender As Object, e As EventArgs) Handles Boutonfermer.Click
            Boutonfermer.Enabled = False
            Boutonfermer.Enabled = True
            SerialPort1.Close()
        End Sub
        Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            'Handles serial port data received events
            UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf acquisition)
            Dim n As Integer = SerialPort1.BytesToRead 'find number of bytes in buf
            comBuffer = New Byte(n) {} 're dimension storage buffer
            SerialPort1.Read(comBuffer, 0, n)
            Me.Invoke(UpdateFormDelegate1) 'call the delegate
        End Sub
    
        Dim flag As Integer
        Dim start As Integer
        Dim checksum1 As Integer
        Dim checksum2 As Integer
        Dim checksum3 As Integer
        Dim checksum4 As Integer
        Dim checksumpic As Integer
        Dim checksumpc As Integer
        Dim adress As Short
        Dim mesurelsb As Integer
        Dim mesuremsb As Integer
        Dim mesure As Integer
        Dim erreur As Byte
        Dim checksumbyte As Integer
        Dim increment As Integer
        Private Const start_transmit = 1
    
        Private Sub acquisition()
            adress = 0
            increment = 0
            'While Not flag
            'start = CStr(comBuffer(increment)) ' rechercher dans le buffer le start byte
            ' If start = start_transmit Then flag = 1
            'increment += 1
            ' End While
    
            checksum1 = CStr(comBuffer(0))
            If checksum1 > 57 Then checksum1 -= 7
            checksum1 = checksum1 - 48 ' conversion code ascii--> numérique
    
            checksum2 = CStr(comBuffer(1))
            If checksum2 > 57 Then checksum2 -= 7
            checksum2 = checksum2 - 48 ' conversion code ascii--> numérique
    
            checksum3 = CStr(comBuffer(2))
            If checksum3 > 57 Then checksum3 -= 7
            checksum3 = checksum3 - 48 ' conversion code ascii--> numérique
    
            checksum4 = CStr(comBuffer(3))
            If checksum4 > 57 Then checksum4 -= 7
            checksum4 = checksum4 - 48 ' conversion code ascii--> numérique
    
            checksumpic = checksum1 + (checksum2 << 4) + (checksum3 << 8) + (checksum4 << 12)
            TextBox1.Text = checksumpic
    
            [COLOR="#FF0000"]For adress As Short = 4 To 100  // ça merde ici en général
                mesurelsb = CStr(comBuffer(adress))
                If mesurelsb > 57 Then mesurelsb -= 7
                mesurelsb = mesurelsb - 48
                adress += 1
                mesuremsb = CStr(comBuffer(adress))
                If mesuremsb > 57 Then mesuremsb -= 7
                mesuremsb = mesuremsb - 48[/COLOR]
    
                mesure = mesurelsb + (mesuremsb << 4)
                checksumpc = checksumpc + mesure
                ListBox1.Items.Add(mesure) 'ajoute chaque mesure dans une liste
    
            Next
            checksumbyte = checksumpic + checksumpc
            If checksumbyte <> 0 Then erreur = 21 Else erreur = 6
            'send_status(erreur)
            TextBox1.Text = checksumbyte
    
            'calcul du checksum et comparaison avec le checksum du pic
    
    
        End Sub
       
    
    
     
    End Class

    -----

  2. #2
    bisou10

    Re : Problème de réception port série visual basic ( visual studio 2012)

    Execute le en debug et dis moi sur quelle ligne tu as ton exception. Je ne vois pas trop ce que vient faire dans ton code le Delegate UpdateFormDelegate.

    Je te conseille de lire byte par byte (1 par 1) et de retourner la valeur finale.

  3. #3
    extremgear

    Re : Problème de réception port série visual basic ( visual studio 2012)

    ça plante içi :
    Code HTML:
    For adress As Short = 4 To 10
                mesurelsb = CStr(comBuffer(adress)) //[COLOR="#FF0000"] ICI[/COLOR]
                If mesurelsb > 57 Then mesurelsb -= 7
                mesurelsb = mesurelsb - 48
                adress += 1
                mesuremsb = CStr(comBuffer(adress))
                If mesuremsb > 57 Then mesuremsb -= 7
                mesuremsb = mesuremsb - 48
    
                mesure = mesurelsb + (mesuremsb << 4)
                checksumpc = checksumpc + mesure
                ListBox1.Items.Add(mesure) 'ajoute chaque mesure dans une li
    avec ce message:
    Une exception de type 'System.IndexOutOfRangeExcepti on' s'est produite dans WindowsApplication5.exe mais n'a pas été gérée dans le code utilisateur

    Informations supplémentaires*: L'index se trouve en dehors des limites du tableau.

  4. #4
    extremgear

    Re : Problème de réception port série visual basic ( visual studio 2012)

    Citation Envoyé par bisou10 Voir le message
    Execute le en debug et dis moi sur quelle ligne tu as ton exception. Je ne vois pas trop ce que vient faire dans ton code le Delegate UpdateFormDelegate.

    Je te conseille de lire byte par byte (1 par 1) et de retourner la valeur finale.
    je me suis servi de cette doc :http://www.me.umn.edu/courses/me2011...al-port-vb.pdf

  5. A voir en vidéo sur Futura
  6. #5
    bisou10

    Re : Problème de réception port série visual basic ( visual studio 2012)

    d'accord mais quelle ligne exactement ? (sous VS c'est celle qui est en jaune)
    Au debut du For Adress ? Tu devrais faire For adress as short = 4 to combuffer.Count-1

  7. #6
    extremgear

    Re : Problème de réception port série visual basic ( visual studio 2012)

    Citation Envoyé par bisou10 Voir le message
    d'accord mais quelle ligne exactement ? (sous VS c'est celle qui est en jaune)
    Au debut du For Adress ? Tu devrais faire For adress as short = 4 to combuffer.Count-1
    arf désdolé je l'ai précisée dans la réponse précédente mais c'est pas bien visible , c'est la ligne marquée içi en bout .

    For adress As Short = 4 To 10
    mesurelsb = CStr(comBuffer(adress)) // ICI
    If mesurelsb > 57 Then mesurelsb -= 7
    mesurelsb = mesurelsb - 48
    adress += 1
    mesuremsb = CStr(comBuffer(adress))
    If mesuremsb > 57 Then mesuremsb -= 7
    mesuremsb = mesuremsb - 48

    mesure = mesurelsb + (mesuremsb << 4)
    checksumpc = checksumpc + mesure
    ListBox1.Items.Add(mesure) 'ajoute chaque mesure dans une li

  8. #7
    extremgear

    Re : Problème de réception port série visual basic ( visual studio 2012)

    ok merci ta soluce à résolu mon problème d'index en dehors des limites du tableau.
    je crois que mon soucis venait aussi de la ligne adress+= 1
    mais j'ai toujours un soucis , il me faut envoyer 2 fois les données pour avoir quelque chose qui s'affiche , j'y travail je fais quelques essais et je donne des news ,merci pour les réponses !

  9. #8
    extremgear

    Re : Problème de réception port série visual basic ( visual studio 2012)

    bon ça fonctionne pas .
    je comprend pas je n'arrive pas à savoir combien de valeur arrive dans le buffer , c'est pas clair , je comprend pas le mécanisme de réception , j'ai l'impression que je ne reçois jamais le même nombre de bytes .
    cette méthode est foireuse .

  10. #9
    bisou10

    Re : Problème de réception port série visual basic ( visual studio 2012)

    Pourtant de mémoire un port série en VB tu n'as qu'a lire le buffer de réception, tout s'entasse dedans, et il est vidé quand tu le lis.

    J'ai plus de port série pour tester... Mais ton code est trop gros pour être honnête

  11. #10
    extremgear

    Re : Problème de réception port série visual basic ( visual studio 2012)

    Alors maintenant ça fonctionne , en fait le paramétre ReceivedBytestreshold était mal réglé , je recevais moins d'octets que ce que je pensais recevoir.
    maintenant c'est ok .
    merci pour l'aide .
    oui le programme n'est pas terrible c'était pour essai, et je connais pas trop ce langage de programation ,
    je préfère programmer des microcontroleurs.

Discussions similaires

  1. reception de données via rs232 (visual.Basic 6.0)
    Par zouzoumou dans le forum Électronique
    Réponses: 27
    Dernier message: 07/05/2013, 14h55
  2. Commander le port parallele en Visual Basic
    Par invitece65c535 dans le forum Électronique
    Réponses: 35
    Dernier message: 17/12/2012, 14h10
  3. Ecrire en C avec Visual Studio Premium 2012 ?
    Par julien_4230 dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 01/10/2012, 11h51
  4. Traduction des commandes SQL dans visual Basic Studio pour une application windows mobile
    Par invite0da6e6b6 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 10/12/2011, 15h06
  5. port série # sous visual studio 2010
    Par invite74119562 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 09/03/2010, 22h42