Lecture d'un fichier par octet et non caractère

romain145 Messages postés 25 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 3 février 2011 - 7 avril 2007 à 20:49
romain145 Messages postés 25 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 3 février 2011 - 8 avril 2007 à 17:18
Bonjour tout le monde,

je commence la programmation (en VB) et
je souhaite lire un fichier de données contenant une chaine à
transmettre par le port série. J'ai fait une recherche sur ce forum et sur google, mais n'ai pas trouvé la réponse à mon problème:

lorsque j'exécute :
Dim Fichier As New IO.FileStream(Chemin.Text, IO.FileMode.Open, IO.FileAccess.Read)
            Dim r As New IO.BinaryReader(Fichier)

            'Dim line As String
            ' Read data from Test.data.
            Dim i As Integer
            For i = 0 To 10
                TextBox2.Text += Convert.ToChar(r.ReadByte)
            Next i
            r.Close()
            Fichier.Close()

mon textbox contient les caractères (06 par exemple) et non leur code hexa (30 puis 36).
Pouvez-vous me filer un coup de main ?
Merci
Romain

6 réponses

cs_Anotine Messages postés 64 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 14 septembre 2008
7 avril 2007 à 20:59
Je n'ai pas très bien compris ton problème mais déjà remplace "TextBox2.Text += Convert.ToChar(r.ReadByte)" par "TextBox2.Text &= Convert.ToChar(r.ReadByte)" ça ira déjà mieux car tu ne fais pas une addition mais une concaténation ... Et pourquois cette boucle ?


Précise ton problème. Merci

Antoine ROUX











<hr />
La programmation est l'art de mettre 15 jours pour gagner quelques millisecondes ...
0
romain145 Messages postés 25 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 3 février 2011
7 avril 2007 à 21:06
Salut et merci,

la boucle ne me sert à rien pour l'instant, c'est juste pour m'arrêter dans la lecture et "voir ce que ça donne".
J'ai remplacé le += par &=, le résultat est identique.

ce que je souhaite faire :
mon fichier contient l'octet "30", soit le chiffre 0.
Je veux pouvoir lire cet octet et non le chiffre.

Je pense m'être rendu compte de mon erreur, je fais un essai avec mon matériel sur le port série et vous réponds pour vous dire ce qu'il en est.

++
Romain
0
cs_Anotine Messages postés 64 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 14 septembre 2008
7 avril 2007 à 21:14
Dim Fichier AsNew IO.FileStream(Chemin.Text, IO.FileMode.Open, IO.FileAccess.Read)
Dim r As New IO.BinaryReader(Fichier)



'Dim line As String
'Read data from Test.data.


Dim i As Integer
For i = 0 To 10
    TextBox2.Text &= r.ReadByte
Next i
r.Close()
Fichier.Close()





Essayez sans le Convert To Char et ce sera normalement bon ...









<hr />
La programmation est l'art de mettre 15 jours pour gagner quelques millisecondes ...
0
romain145 Messages postés 25 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 3 février 2011
7 avril 2007 à 21:35
Salut, c'est bien ça merci !!

J'ai fait un test avec mon matériel et ça fonctionne parfaitement si je fais :
MsCom.Write(Chr(r.Read)) pour une valeur de "02".

Seulement j'ai une erreur si je rencontre l'octet "FF" dans le fichier "Procedure Call or argument is not valid" ce qui parait logique car "FF" retourne -1 s'il est lu en tant qu'entier signé.

J'ai donc modifié la ligne pour : MsCom.Write(Chr(r.ReadByte))
l'octet est lu en tant qu'octet non signé et je n'ai plus l'erreur, mais toujours des soucis de transmission... j'analyse ça !

Merci pour ton aide Anotine ;-)
@@++
Romain
0

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

Posez votre question
romain145 Messages postés 25 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 3 février 2011
8 avril 2007 à 02:30
Bonsoir,

l'erreur venant du FF est que la table ASCII standard va de (0) à (127) (et non (255)). Par conséquent tout caractère ayant un code supérieur à 127 est envoyé en tant que "?" soit (63).
J'ai résolu ce problème de cette manière :
    Dim tab(1) As Byte
    tab(1) = 255
    MsCom.Write(tab, 1, 1)

Ainsi la fonction d'émission envoi le bon code, et l'envoi est compatible avec la lecture octet par octet dans un fichier.
Lecture qui fait n'importe quoi d'ailleur, merci de me dire si vous voyez quelque chose qui cloche là-dedans :
     ' Ouverture du fichier.
    Dim Fichier AsNew IO.FileStream(Chemin.Text, IO.FileMode.Open, IO.FileAccess.Read)
    Dim r AsNew IO.BinaryReader(Fichier)
    Dim Taille_Fichier As Integer = Convert.ToUInt16(Fichier.Length)
    Dim tab(Taille_Fichier) As Byte
    ' Lit le fichier et le stocke dans le tableau
    Dim i As Integer
    For i = 0 To Taille_Fichier - 1
        tab(i) = r.ReadByte
        TextBox2.Text &= tab(i) - 1
     Next i

Merci beaucoup à vous !
Romain
0
romain145 Messages postés 25 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 3 février 2011
8 avril 2007 à 17:18
Bonjour tout le monde,

mes problèmes sont résolus et mon programme avance à grands pas. J'arrive aujourd'hui à :
- lire un fichier et à stocker les octets dans un tableau de bonne dimension.
- envoyer ces octets vers mon périphérique cible sur le port série.
- gérer le protocole d'échange pour la transmission.

Je mettrai peut-être la source en ligne si des gens sont intéressés... (pour info le périphérique en question est un journal lumineux d'1m de long).

@@++
Romain
0
Rejoignez-nous