[VB.NET] SerialPort dans une classe
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:
1 2 3 4
|
Private WithEvents MonPortCOM As Ports.SerialPort
Private Buffer As StringBuilder
... |
Public sub New()
Code:
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:
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:
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 :bug: