Extraire données d'une chaine de caractères avant de l'afficher

Résolu
harryweb77 Messages postés 6 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 28 novembre 2011 - 28 nov. 2011 à 09:11
harryweb77 Messages postés 6 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 28 novembre 2011 - 28 nov. 2011 à 17:50
Bonjour,

Je suis complètement débutant. J'ai réussi à modifier un petit terminal série (RS232) que j'ai récupéré sur la toile en y ajoutant mes éléments.
Toutefois je suis ennuyé pour extraire des caractères d'une chaine. J'utilise ceci pour la "non extraction":

Private Sub ReceivedText(ByVal [text] As String)
'compares the ID of the creating Thread to the ID of the calling Thread
If Me.rtbReceived.InvokeRequired Then
Dim x As New SetTextCallback(AddressOf ReceivedText)
Me.Invoke(x, New Object() {(text)})
Else
Me.rtbReceived.Text &= [text]
End If

If text = "RDL*" Then
btnRFOFF.Enabled = True
btnSend.Enabled = True
btnRFON.Enabled = False
Me.txtAction.Text = "Couper la RF puis RF OFF"
End If

If text = "RDH*" Then
btnRFOFF.Enabled = False
btnRFON.Enabled = True
Me.txtAction.Text = "Mettre la RF puis RF ON"
End If

If text = "COK*" Then
Me.txtAction.Text = "Calibration Terminée"
btnRFOFF.Enabled = False
btnRFON.Enabled = False
End If

End Sub


Comme vous le voyez, j'ai réussi à faire réagir le programme si je reçois dans text RDL* ou RDH* ou encore COK*
Par contre je peux recevoir d'autres choses comme: ATT123456* et je désirerais afficher 123456 seulement. C'est à dire que je voudrais extraire cette valeur en chaine et peut-être aussi en valeur numérique.(ce pourrait être un plus si je désire ultérieurement effectuer des opérations)

Mes réceptions sur le port série se terminent toujours par "*" par contre la longueur de la valeur que je reçois (123456) peut être sur 3 à 6 caractères.

Ces données sont envoyées par un µControleur PIC que je programme en basic, mais je débute avec VB.net

Merci de votre aide, liens où pistes pour ma solution

Amicalement

14 réponses

Utilisateur anonyme
28 nov. 2011 à 16:13
Re:
Si tu programmes des µC, tu verras vb.net c'est rien à coté, c'est juste une habitude.
Merci pour melabs PICBASIC PRO je vais chercher un peu, moi j'avais un vieux truc (Basic11) qui était un peu limité.
Et je suis sous la pluie de Goyave




CF2i - Guadeloupe
Ingénierie Informatique
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2011 à 09:41
Boinjour,

je pense que tu ne devrais rencontrer aucune difficulté à transposer pour VB.Net ce petit bout de code/exemple :

toto = "ATT123456*"
  titi = StrReverse(Val(StrReverse(Left(toto, Len(toto) - 1))))
  MsgBox titi

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
harryweb77 Messages postés 6 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 28 novembre 2011
28 nov. 2011 à 10:26
Bonjour ucfoutu

Merci pour ton exemple mais je dois peut-être déjà m'assurer que c'est bien "ATT" les 3 premiers bytes reçus, car il peut y avoir d'autres messages encore... du genre VLO123456*

Sur mon PIC j'écrirais un truc du genre:
IF bytesIn[0] = 65 and BytesIn[1] = 84 and BytesIn[2] = 84 THEN ' (ATT)
je prends les caractères suivants jusqu'à "*"
éventuellement je passe de l'ascii au numérique en retirant 48
et j'envoie sur mon afficheur.

C'est possible de faire un truc de ce genre ?

Big merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2011 à 11:09
Que les premiers caractères soient "ATT", "trucmachin" ou autres, mon code traitre toute chaine se terminant par un "*" (ou tout autre caractère, pourvu qu'il n'y en ait qu'un) !
Ainsi, il retirerait (par exemple) "879" de toute chaine commençant par ce que tu veux et se terminant par un caractère à ne pas prendre en compte !
Exemple, donc "gkgjhhlljkl879m" retournerait "879"

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2011 à 11:12
Mais si tu veux dire qu'en plus cela doit commencer par "ATT" suivoi d'un chiffre, rien de plus simple ! ===>> une expression conditionnelle :
If ta_chaine like "ATT#" then
'le traitement montré
end if

Quiel est le problème ? Je n'en vois pas.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
harryweb77 Messages postés 6 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 28 novembre 2011
28 nov. 2011 à 12:18
Ok, j'essaye d'expliquer mieux...

Ton code me convient pour extraire la chaine 123456.
Maintenant comment mon programme peut se rendre compte que les 3 premiers caractères sont ATT ou autres ?

Car tu me donnes:
[i]If ta_chaine like "ATT#" then
'le traitement montré
end if /i


Ce qui suivra ATT, c'est une suite de chiffres selon une valeur au départ inconnue

Ce que je cherche à faire c'est:

1) Je vérifie si mes 3 premiers caractères sont bien ATT
2) Si oui je prélève les chiffres (avec ta formule et le -1 cela doit coller)
3) J'affiche ces chiffres


J'ai utilisé ton dernier exemple de code en l'inserant à la suite de ce qui marche déjà, chez moi, juste pour voir s'il discernait ATT,(avant d'extraire le reste) comme ceci:

[i] If text Like "ATT#" Then
Me.txtAction.Text = "reçu"
'le traitement montré
End If/i

Et j'ai envoyé ATT123456* ou ATT ou encore ATT# sans qu'il ne m'affiche "reçu". Aucune réaction en fait.

Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2011 à 12:38
Ouais.
Je vois que tu as "tout compris"... et ... te laisse planté maintenant là (à d'autres d'essayer de t'éveiller)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
28 nov. 2011 à 13:05
Salut

D'abord tu doit savoir la structure de ta chaine
donc est ce que c'est
XYZ1234455678

XYZ :3 caractères non numérique
ou c'est une autre structure ?
et tu veux extraire la suite de nombre de la
chaine ?
0
Utilisateur anonyme
28 nov. 2011 à 13:13
Salut tout le monde

Oui s'il y a des numériques et des lettres tu peux faire comme ça:
        Dim Toto As String = "toto458titi"
        Dim Var As String = "toto"
        Do
            Var &= "?"
        Loop Until Var.Length = Toto.Length
        If Toto Like Var Then Me.Text = Toto


Question: c'est quoi ton PIC?


CF2i - Guadeloupe
Ingénierie Informatique
0
harryweb77 Messages postés 6 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 28 novembre 2011
28 nov. 2011 à 13:44
Salut les gars,

@ShayW: Oui c'est théoriquement 3 caractères ascii (en majuscule) puis la valeur que mon pic envoie.

Je dis théoriquement car c'est une transmission série classique mais par RF et il peut y avoir des parasites... Alors on reçoit.. n'importe quoi... Alors j'envoie la trame 3 fois pour assurer un peu, puis je fais des accusés de RX.

@Acive: Je vais essayer une approche avec ton bout de code en l'adaptant... J'espère y arriver enfin. Le pic, pour cette application est un 18F14K22 avec lequel j'utilise l'USART hardware, mais la trans par RF (avec des modules bon marché OOK - AM) ne se laisse pas toujours faire ;-)
Sinon j'utilise un grand nombre de pics différents... jusqu'au 18F8520
avec PBP PRO 2.60

PS: En Gwada ? Petit veinard ! J'adore...
0
Utilisateur anonyme
28 nov. 2011 à 14:11
Oui mais il pleut...

Je programme des 68HC11, mais je voudrais m'y mettre aux pics, tu les programmes en basic? Avec un compilateur assembleur?




CF2i - Guadeloupe
Ingénierie Informatique
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
28 nov. 2011 à 14:39
tu peux comme ça théoriquement

Dim chaine As String
 Dim numeric As String
 chaine = "XYZ123456*"
 numeric = chaine.Substring(3, chaine.Length - 4)
0
harryweb77 Messages postés 6 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 28 novembre 2011
28 nov. 2011 à 14:59
@Acive: Oui, il existe plusieurs compilateurs basic (mikro basic, Proton, Et melabs PICBASIC PRO (celui que j'utilise depuis 10 ans car il a un forum débordant d'astuces)) Mais j'avoue que programmer les µC n'a rien à voir avec vb.net, d'où mes errances... ).... Que je serais heureux sous la pluie de Deshaie

@ShayW: OK, merci pour cet exemple... Je bosse un peu sur tout ce qu'on m'a donné, tout en apprenant vb.net
Je vais bien y arriver, à tourner ça comme il faut pour mon application.
Sinon, je reviendrais en
Je me donne un peu de temps pour expérimenter.

Peut-être à bientôt quand même !
Merci
0
harryweb77 Messages postés 6 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 28 novembre 2011
28 nov. 2011 à 17:50
bien bien, j'y suis arrivé... Merci à vous 3 !
0
Rejoignez-nous