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
Public sub New()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private WithEvents MonPortCOM As Ports.SerialPort Private Buffer As StringBuilder ...
Je recois les données :
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 ...
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)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...
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
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
Partager