Comment gérer la réception de donnée avec SerialPort
Bonsoir,
voila j'ai crée une application qui effectue un traitement sur les données au ASCII que je reçois par le port série avec la classe SerialPort, voici actuellement ma méthode que je vais vous détailler, mais je me demande si il n'existe pas plus simple ???
Tous d'abord dans le dataReceived je récupére les donnnées reçu que je convertie en ASCII et
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
Private Delegate Sub _Affiche_ASCII(ByVal donnee As String)
Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
Dim nb_octet As Integer = RS232.BytesToRead ' on récupère le nombre d'octet présent dans le tampon
Dim trame(nb_octet - 1) As Byte ' Tableau acceuillant les données au format byte
RS232.Read(trame, 0, nb_octet) 'on lit le port
Dim donnee As String = System.Text.Encoding.ASCII.GetString(trame) ' on récupère les données au format ASCII
'L'évènement DataReceived se situe sur un thread différent que le form, nous devons donc appelé un délégué pour afficher le résultat à l'écran
If Me.InvokeRequired Then
Me.Invoke(New _Affiche_ASCII(AddressOf Affiche_ASCII), donnee)
End If
End Sub |
Ensuite ma procédure qui efface les sauts de ligne et autres caractère qui apparaissent dont je n'ai pas besoin et je remplace et ensuite j'envoi les données formaté vers une Textbox1, la textbox2 contenant tous les caractére brut reçu non formaté par cette procédure.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Private Sub Affiche_ASCII(ByVal donnee As String) 'permet de ranger correctement les données ASCII recu, en faisant les sauts de lignes
TextBox2.Text = TextBox2.Text & donnee
For Each ligne As String In TextBox2.Text
Try
attente = TextBox2.Text.Replace(Chr(10), ControlChars.CrLf).Replace("W1", "").Replace("W1", "").Replace("W1E", "").Replace("W1E", "").Replace("W0F", "").Replace("E", "").Replace("F", "")
TextBox1.Text = attente
Catch ex As Exception
les_try("fonction Affiche_ASCII" & ex.Message) 'ecrit dans le fihier texte exception l'erreur
End Try
Next
End Sub |
Enfin je lance un timer lorsque l'on detecte un changement de text dans la textbox1 aprés 1s8 j'ai mis cette tempo afin d’être sur d'avoir tout recu (ce qui correspond à l'arrivée des données)
Code:
1 2 3 4 5
|
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Timer_wait.Interval = 1800
Timer_wait.Start()
End Sub |
et enfin ce timer_wait va lancer la procédure declenchement_dispositif() pour effectuer le traitement final dont j'ai besoin !
Code:
1 2 3 4
| Private Sub Timer_wait_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_wait.Tick
declenchement_dispositif()
Timer_wait.Stop()
End Sub |
j'ai constaté que cela est très lourd pour le programme ! j'aurais voulu tout placer dans le datareceived mais le soucis c'est que le texte est assez long et le datareceived va tout de suite ce déclenché au premier caractére recu, alors que j'ai besoin de toutes les données reçu pour lancer ma procédure declenchement_dispositif(), j’espère mettre fait comprendre. d'avance merci