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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
et enfin ce timer_wait va lancer la procédure declenchement_dispositif() pour effectuer le traitement final dont j'ai besoin !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager