Bonjour,

Voila ça fait bientot 2 jours que je regarde tous les forums à la recherche d'un bug possible dans mon code de la liaison série mais je ne trouve rien!
Je log toutes les trames reçu sur le port série et je me suis rendu compte que des trames incohérentes étaient dans le fichier. J'ai eu ce problème que 2 fois pour l'instant et sur 2 PC différents...

Aperçu du fichier :
<B01C0994104340C76086904110B> ' trame valide
<STA3013500B5B0126019405229B> ' trame valide
<'04B 98 0494F F06878022F484 ' trame incohérente
<'T46004 04D4C 309 ' cette trame se répète indéfiniment jusqu'à la fin du fichier suite à un plantage !!!???
<'T46004 04D4C 309
<'T46004 04D4C 309

Le format de la trame incohérente ressemble un peu mais pas complètement. Je suis sur de l'appareil qui envoi les données car 2 PC recoivent les trames en même temps et aucun problème sur l'autre PC (les 2 PC ont la même version).

Voici mon code :

J'ai fais une classe ou je déclare le serialport, mon buffer plus d'autres variables
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
Private WithEvents MonPortCOM As Ports.SerialPort
Private Buffer As StringBuilder
...
Public sub New()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
Me.MonPortCOM = New Ports.SerialPort(nomPort, 19200, Ports.Parity.None, 8, Ports.StopBits.One)
Me.Buffer = New StringBuilder(128)
 
Me.MonPortCOM.Encoding = Encoding.Default
 
' Ouvre le port com
Me.MonPortCOM.Open()
... plus d'autre variables ...
Je recois les données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
Private Sub DataReceived_PortSerie(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles MonPortCOM.DataReceived
 
Me.Buffer = Me.Buffer.Append(Data)
 
' Recherche les caractères qui m'interesse
' Je parcours mon buffer du début à la fin
' Je ne mets pas le code car c'est long
 
' Quand je trouve la trame qui m'interesse, je l'extrais
dim Passage as string = Me.Buffer.ToString(IndexCaractereDebut, IndexCaractereFin)
 
' Je log ce passage dans un fichier texte
Me.AjoutePassageTexte(Passage)
 
' Je met ce passage dans une structure
' et je raise un evenement pour la form main
MaStructure = ExtraireChampsPassage(Passage)
 
' Ma structure contient que des champs bytes ou integer
RaiseEvent PassageRecu(MaStructure)
 
' Puis je supprime mon buffer traité
Me.Buffer = Me.Buffer.Remove(0, IndexCaractereFin + 1)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Public Sub AjoutePassageTexte(ByVal Passage As String)
 
            Dim sw As StreamWriter = Nothing
 
            Try
                If Me.FichierPassageTexte <> "" Then
                    sw = New StreamWriter(Me.FichierPassageTexte, True)
                    sw.WriteLine(Passage)
                End If
 
            Catch ex As Exception
                Console.WriteLine("AjoutePassageTexte " & ex.Message)
 
            Finally
                If sw IsNot Nothing Then
                    sw.Close()
                End If
            End Try
 
        End Sub
Je tiens à préciser que ça fonctionne "bien" puisque j'ai laissé mon PC en test toute la nuit et je n'ai pas eu une erreur ! (plus de 45000 trames recu toutes les 1s). Je ne sais pas si l'erreur vient du plantage du fichier de log, d'un manque de mémoire, du stringbuilder...

Est ce que mon raiseevent est bon déjà ? Sachant que dans la form main je m'abonne à cet évènement et j'utilise Me.BeginInvoke car le DataReceived du port série est dans un autre Thread. Si vous avez besoin d'autres précisions...

Merci