Conversion vbnet sans issue

budboy34 Messages postés 5 Date d'inscription jeudi 9 décembre 2010 Statut Membre Dernière intervention 22 mars 2011 - 15 mars 2011 à 08:00
NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 - 22 mars 2011 à 21:42
Bonjour,

Débutant en VB.Net, je me heurte à des difficultés d'interprétation et de compréhension. Après de nombreuses tentatives solo, je pense que soumettre mon sujet devient la seule solution...
Je récupère d'une connexion série USB la chaine suivante à chaque interrogation d'un module Rfid :
60(+caractère saut de ligne)
600029201103150733130100040006A00000001480(+caractère saut de ligne)

Voici ce que je dois exporter dans un fichier texte :
1480:a20110315073313010:100
1480 = 4 derniers caractères
:a = extra texte
20110315073313010 = milieu de la chaine découpé, c'est la date et l'heure
:100 = extra texte

et l'enregistrer dans un fichier texte ligne après ligne.
Le soucis c'est que dès que je modifie la chaine, la fonction File.WriteAllLines("C:\Documents and Settings\Bureau\save.txt", createText, Encoding.UTF8) n'en veut plus!

Voilà ou j'en suis :
Public Sub updateTextBox()

Dim createText() As String = {txtDataReceived.Text}

J'ai essayé ca :
createText = Mid(createText, 1, 2)

File.WriteAllLines("C:\Documents and Settings\Bureau\save.txt", createText, Encoding.UTF8)

Je suis un peu perdu entre string, char, text, le saut de ligne semble limiter ma chaine aux deux premiers caractères, et j'obtiens une erreur (exception Invalid Cast Exception) des erreurs de débutant je suppose... Merci par avance,

8 réponses

NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 158
15 mars 2011 à 12:26
Bonjour,

Dim createText() As String
createText = Mid(createText, 1, 2)

Tu déclares un tableau, mais tu l'utilises comme une chaine ...

Essayes de faire une fonction qui en entrée prend la chaine de 60 caractères et, en sortie, retourne la chaine désirée. Ne tient pas compte des retours de lignes.

Ensuite, Fais un boucle qui utilises cette fonction.

Note annexe :
- N'utilises pas Mid, mais String.SubString

Mon site
0
budboy34 Messages postés 5 Date d'inscription jeudi 9 décembre 2010 Statut Membre Dernière intervention 22 mars 2011
15 mars 2011 à 15:57
Merci de ton aide nHenry,

Je me bat mais toujours sans succés, selon tes explications, je suis reparti sur un tableau, j'ai fais ca :

Dim Tableau() As Byte
Dim chaine As String
Dim i%

txtDataReceived = 344566HH
ReDim Tableau(Len(txtDataReceived))
For i = 1 To Len(txtDataReceived)
Tableau(i) = String.Substring(txtDataReceived, i, 1)
MsgBox(Tableau(i))
Next

...Aucun substring accessible n'accepte ce nombre d'argument!

Je ne fais pas encore bien le lien entre tout ca...
0
budboy34 Messages postés 5 Date d'inscription jeudi 9 décembre 2010 Statut Membre Dernière intervention 22 mars 2011
15 mars 2011 à 16:11
En fait je viens de comprendre que txtDataReceived est un objet... C'est peut-être pour ca que ca coince?
0
NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 158
15 mars 2011 à 20:13
Bonjour,

En clair, essayes de faire une Fonction :
Public FunctionTraduitEntrees(Byval MaChaineSource As String) As String
Fais en sorte que cette fonction fasse la traduction d'un seul élément.

Ensuite, on verra pour la faire tourner sur chaque ligne.

Note : SuBstring travail en base 0, pas 1 (comme l'était Mid )

Mon site
0

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

Posez votre question
budboy34 Messages postés 5 Date d'inscription jeudi 9 décembre 2010 Statut Membre Dernière intervention 22 mars 2011
16 mars 2011 à 18:43
Salut nHenry,

Bon je patoge vraiment là... Dis moi si j'ai bien compris stp...

Tu as du comprendre vu mon niveau en VB.Net (vb Express pareil??)que j'ai récupérer le code qui me permet de lire sur mon port série.
Code que tu connais à merveille (SerialCommChat), puisque je t'ai déjà lu sur d'autres posts.
Ce qui m'inquiètes moi c'est de ne pas voir par quel bout le prendre!!

A ce que, je comprend la trame que je reçois ici, et qui s'affiche dans une textbox nommée txtDataReceived c'est :
txtDataReceived.Invoke(New myDelegate(AddressOf updateTextBox),New Object(){}), non?

Dois-je créer une fonction qui va convertir cette objet(?) en un string, de manière à pouvoir mettre ce String dans un tableau et remanier ma trame?

Je n'arrive pas à palper la variable que je reçois!

Et "SuBstring travail en base 0" comment tu le traduit pour les neuneus??

Merci et tout cas d'accorder un peu de temps à des débuts difficiles... un jour peut-être, je te serais utile
0
NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 158
16 mars 2011 à 21:52
Bonjour,

txtDataReceived.Invoke
C'est utilisé pour les opérations entre threads, c'est bien au delà de ce que tu as à gérer.

Et "SubString travail en base 0" comment tu le traduit pour les neuneus??
La base 0, c'est quand tu commence à compter à partir de 0, la base 1 c'est quand tu démarra à 1, pour faire simple :
Dim lStr as String="abcdef"
Tu veux prendre le "a" :
Mid(lStr,1,1)
lStr.SubString(0,1)
Pour le "b" :
Mid(lStr,2,1)
lStr.SubString(1,1)


Pour ton analyse, ta conversion de texte, ressemblerais à ça :
pChaine.SubString(38,4)+":a"+pChaine.SubString(6,16)+":100"


Pour l'accès au port série, commence par simple, classe : System.IO.Ports.SerialPort
Il y a beaucoup de lecture sur ce site.
Par exemple :
http://www.vbfrance.com/codes/UTILISATION-PORT-COM-VS2005_42181.aspx

Mon site
0
budboy34 Messages postés 5 Date d'inscription jeudi 9 décembre 2010 Statut Membre Dernière intervention 22 mars 2011
22 mars 2011 à 06:41
Salut nHenry,

Voilà les choses commencent doucement à s'éclaircir... J'ai du ajouter un temporisation car la réception de mes données était souvent hachée. Du coup ca donne ca.

System.Threading.Thread.Sleep(220)

With txtDataReceived .AppendText(serialPort.ReadExisting)
.ScrollToCaret()
End With

Dim pchaine, export As String
pchaine = txtDataReceived.Text
Dim nb_octet As Integer = txtDataReceived.Text.Length()
pchaine = txtDataReceived.Text

If nb_octet = 43 Then
export = pchaine.Substring(38, 4) + ":a" + pchaine.Substring(6, 17) + ":100" & vbCrLf
My.Computer.FileSystem.WriteAllText("C:\Documents and Settings\Bureau\save.txt", export, True)
' Call btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
End If

txtDataReceived.Text = String.Empty

Ca marche plutôt pas mal seulement tu devrais pouvoir m'aider à régler deux points :
1. Je souhaite à présent à la fin de mon enregistrement renvoyer la commande 60 en lecture, afin de ré-interroger mon lecteur.

Private Sub btnRead_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnRead.Click

Labelnombre.Text = ""
txtDataToSend.Text = 60
Try
serialPort.Write(txtDataToSend.Text & vbCrLf)
[...]

Comment puis je déclencher cette fonction?

Call btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

VB.Net me dit "expression attendu"?? Alors je coince...

Autres cas
2. Je souhaite dans le cas ou la trame est = 7, 14, 21 ou 28, la découpé de manière à n'obtenir que des trames de 7 puis envoyer ces trames sur le port 80 de mon localhost où la trame sera traité par un autre programme!

Merci à toi si tu peux m'aiguiller un peu plus, je continue mes recherches...
0
NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 158
22 mars 2011 à 21:42
Bonjour,

Tu confond la déclaration et l'appel
Call btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

doit être remplacé par :
Call btnRead_Click(btnRead, new System.EventArgs)
ou
Call btnRead_Click(Nothing, Nothing)

Mon site
0