Gambas France BETA


Pas de compte ? Incription

Suppression d'octets cachés dans un string

Ce sujet est résolu.

1
AuteurMessages
siscard06#1 Posté le 7/6/2012 à 16:51:24
Bonjour,

Je poursuis d'un petit pas l'avancement de mon projet d'afficheur de balance via RS232.

Puisque le problème de l'affichage en soi est réglé, reste celui de ce caractère caché qui me fractionne cet affichage en 2 temps : -0.12 puis 3 kg N qui vient par dessus et masque la première partie.

Le problème ne se pose pas dans une Textarea puisque là, seuls s'affichent les caractères "imprimables"

J'ai donc fait afficher dans la textbox le code ASCII de tous les caractères entre la 7° et la 10° position ainsi que la longueur de la chaine : Textbox1.Text = Asc(Poids,7) & " " & Asc(Poids,8) & " " & Asc(Poids,9) & " " & Asc(Poids,10), et j'obtiens, toujours en 2 temps, une valeur 0 en 9° position, pour les autres, la valeur est normale et correspond bien à un chiffre ou un espace (32).

J'ai essayé la fonction Replace$(Poids, Chr$(0), "") sans succès.
J'ai essayé aussi de faire Pds = Left(Poids,8) & Right(Poids, 10) sans succès non plus.
J'ai essayé aussi de récupérer seulement les chiffres en tant que valeur numérique, mais il y a toujours ce Chr$(0) au milieu.

Il faudrait donc que j'essaie de créer une fonction comme Trim(), mais qu'elle s'applique à l'intérieur de la chaîne et pas seulement aux extrémités (on peut éventuellement garder les espaces Chr$(32)).

Si quelqu'un peut m'expliquer comment fonctionne Trim, je pourrais essayer de l'appliquer à chaque tronçon de la chaîne, voire caractère par caractère; il s'agirait d'éliminer tous les caractères dont le code < 32 ou =127 (OU alors il faut peut-être travailler avec les codes UTF8)

Ou alors, j'ai trouvé ça dans Wikipedia/wiki/Commandes_Unix :
strings : Affiche seulement les caractères imprimables (ASCII) d'un fichier binaire.

Est-ce qu'il existe quelque chose de similaire dans Gambas ou comment éxécuter cette commande dans Gambas, si elle existe dans Ubuntu (11.04) ou dans Linux (http://jp.barralis.com/linux-man/man3/string.3.php, pas très explicite)

Merci d'avance. :study: :scratch:



Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Fly06#2 Posté le 7/6/2012 à 21:50:33
Salut,

Essayes d'utiliser le composant Regexp :
http://gambasdoc.org/help/comp/gb.pcre/regexp?fr

En construisant un regex qui supprime les caractères non imprimables ou un regex qui ne conserve que les caractères imprimables de ta chaîne (au choix) :
http://gambasdoc.org/help/doc/pcre?fr

Sur la syntaxe des expressions régulières PCRE, il y a tout plein d'infos et de tutos sur le web.


Reivillo#3 Posté le 7/6/2012 à 23:35:32
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Bonsoir siscard06.

Ton sujet m' intéresse.

1: Si tu pouvais enregistrer dans un fichier BRUT,
on pourrait l' analyser avec un Editeur Hexadecimal.
2: Parfois une capture d'écran(on n'y pense pas toujours),
est source de facilité de solutions.

Reivillo.











Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
siscard06#4 Posté le 8/6/2012 à 15:14:49
Bonjour et merci,

@ Fly06
Piste intéressante à étudier, mais je connais pas encore "Regex", et je ne comprends pas très bien la notion de "classes", ça viendra sans doute à l'usage (objets et fonctions, c'est à peu près clair). Je la mets de côté pour le moment; mais si tu peux me donner quelques indications de plus sur ton idée...

(PS t'es dans quel coin du 06, moi c'est Levens, dans les collines au dessus de Nice)

@ Revillo
1- Si tu pouvais enregistrer dans un fichier BRUT,
on pourrait l' annaliser (analyser ? ) avec un Editeur Hexadecimal

(Ouais, pourquoi pas, ça confirmerai si c'est bien un chr$(0), ou si c'est un autre code interprété comme tel).

Piste intéressante aussi, il faut que j'apprenne à mettre un string dans un file, ça à l'air moins dur, mais après je le mets où ? directement dans ton mail ?

2: Parfois une capture d'écran(on n'y pense pas toujours),
est source de facilité de solutions.

Ouais, j'ai aussi installé desktop recorder y a pas longtemps


OK, c'est pas Gambas qui est compliqué, c'est mon problème qui est un peu coton pour débuter !

Ca fait 4 pistes à essayer. je vous poste les résultats ici.
Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Reivillo#5 Posté le 8/6/2012 à 17:33:26
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Merci pour la correction orthographique.

Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
siscard06#6 Posté le 9/6/2012 à 17:26:57
Pas de quoi, Reivillo

J'ai le correcteur d'orthographe omniprésent même que c'en est cassec...(bonbons)
1° essai
(je vous mets pas l'ouverture avant et la fermeture après pour gagner de la place)
Public Sub SPort_Read()

Dim Poids, Pds As String
Poids = Read #SPort, Lof(Sport)
Exec ["strings", "Poids"] To Pds
TextBox1.Text = Pds

End

N'affiche rien du tout. Erreur de syntaxe ?
Il faudrait que je teste la fonction en mode console pour voir si ça fonctionne.

2° Essai
Public Sub SPort_Read()

Dim Poids, Pds As String
Dim I As Integer
Poids = Read #SPort, Lof(Sport)
For I = 1 To 15
If Asc(Poids, I) > 31 And Asc(Poids, I) < 127 Then
Pds = Pds & Mid(Poids, I, 1)
Endif
TextBox1.Text = Pds
Wait 1
Next
End


(J'ai mis le Next de la boucle après l'affichage et le Wait pour voir comment ça se passait au ralenti)
Toujours affichage en 2 temps, le caractère récalcitrant est toujours là.
Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Reivillo#7 Posté le 10/6/2012 à 01:32:12
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Peut-être avec cet exemple.
(Si bien compris le soucis).

Désolé pour l'aspect du code.
Les Balise, me le tronque.

Public Sub _new()

Dim sCr As String = "CaractèreRécalcitrant" 'Création chaîne Test

Print sCr 'Affiche chaîne Test
sCr = "Caractère" & Chr$(9) & "Récalcitrant" 'Insertion du caractère 9
Print sCr 'Affiche chaîne après Insertion du caractère 9
'ci-dessous suppression du Caractère 9
sCr = Mid$(sCr, 1, InStr(sCr, Chr$(9)) - 1) & Mid$(sCr, InStr(sCr, Chr$(9)) + 1, Len(sCr))
Print sCr 'Affiche après suppression du Caractère 9

End

Nb: Le Caractère ascii 9 = Tabulation.

Poids = Read #SPort, Lof(Sport)
Poids = Mid$(Poids, 1, InStr(Poids, Chr$(9)) - 1) & Mid$(Poids, InStr(Poids, Chr$(9)) + 1, Len(Poids))
TextBox1.Text = Poids


Avec un point décimal à la place du 9:
Poids = Mid$(Poids, 1, InStr(Poids, Chr$(9)) - 1) &"."& Mid$(Poids, InStr(Poids, Chr$(9)) + 1, Len(Poids))


1° essai
(je vous mets pas l'ouverture avant et la fermeture après pour gagner de la place)
Public Sub SPort_Read()

Dim Poids, Pds As String
Poids = Read #SPort, Lof(Sport)
Exec ["strings", "Poids"] To Pds
TextBox1.Text = Pds

End

N'affiche rien du tout. Erreur de syntaxe ?

Dans l'Exec, peut-être Supprimer les guillemets autour de Poids.
C'est une Variable, pas du Texte.
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
Reivillo#8 Posté le 10/6/2012 à 07:23:06
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »En code Optimisé.

Ici le code s'affiche bien.

1
2
3
4
5
6
7
8
9
10
11
PUBLIC SUB SPort_Read()

DIM sPoids AS STRING
DIM iLocate AS INTEGER

sPoids = READ #SPort, Lof(Sport)
iLocate = InStr(sPoids, Chr$(9)) 'ou changer Chr$(9) en Chr$(0)
sPoids = Mid$(sPoids, 1, iLocate - 1) & Mid$(sPoids, ilocate + 1, Len(sPoids))
TextBox1.Text = sPoids

END


Essayer ceci aussi, en remplaçant les lignes 7 et 8
Par
1
sPoids = Replace(sPoids, Chr$(0), "")


Merci de me faire un retour de résultat.


Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
Fly06#9 Posté le 10/6/2012 à 12:13:46
@siscard06:

Piste intéressante à étudier, mais je connais pas encore "Regex", et je ne comprends pas très bien la notion de "classes", ça viendra sans doute à l'usage (objets et fonctions, c'est à peu près clair). Je la mets de côté pour le moment; mais si tu peux me donner quelques indications de plus sur ton idée...

Les regex sont un outil très puissant et très utile implémentés dans beaucoup de langages de programmation mais il faut un petit effort d'apprentissage pour en comprendre le principe et la syntaxe ;-)
Le problème qui consiste à supprimer les caractères de contrôle d'une chaîne est un problème classique abondamment discuté sur le web.
Concernant l'utilisation du composant Regexp de Gambas, je ne pourrais pas t'aider ne l'ayant pas encore utilisé... mais il me semble qu'il y a deux ou trois files sur ce forum qui en parlent...

(PS t'es dans quel coin du 06, moi c'est Levens, dans les collines au dessus de Nice)

Je suis sur Cannes.
siscard06#10 Posté le 10/6/2012 à 16:00:10
Essais String Rebelle

1- Exec ["strings", Poids] To Pds : n'affiche rien

2- Dim Poids, Pds As String
Dim I As Integer
FOR I = 1 To 13
Pds = Pds & " " & Asc(Mid(Poids, I, 1))
TextBox1.Text = Pds
WAIT 1
NEXT : Affiche 2 1/2 de chaines successives en 2 temps pour 0.376 kg sur la balance:
32 32 32 32 48 46 51 55 0 0 0 0 puis 56 32 107 103 32 32 32 32 32 78 13 10 0
SP SP SP SP 0 . 3 7 6 SP k g SP SP SP SP SP N CR LF
|C'est ici que le 1° affichage s'interrompt pour laisser place à la 2° partie


3- Dim Poids, Pds As String
Dim I As Integer
Poids = Read #SPort, Lof(Sport)
I = InStr(Poids, Chr$(0))
Pds = Mid$(Poids, 1, I - 1) & Mid$(Poids, I + 1, Len(Poids))
TextBox1.Text = Pds
Wait 1 : affiche toujours en 2 temps

4- Pds = Replace(Poids, Chr$(0), " ") aucun effet
(j'ai essayé avec tous les codes de 0 à 31 + 127)

5- Dim Poids, Pds As String
Dim I As Integer
Poids = Read #SPort, Lof(Sport)
I = InStr(Poids, Chr$(0))
TextBox1.Text = I
Wait 1 : Affiche I=0
NE TROUVE PAS le caractère NUL
(J'ai essayé aussi avec tous les codes de 0 à 31 + 127)

Conclusion : La chaine reçue est coupée par un caractère non ASCII, qui est interprété comme une fin de chaine ou un saut de ligne, bref qui fractionne l'affichage.

Merci de vos contributions à tous, j'ai appris plein de choses.
Si d'autres idées, on peut tout de même essayer pendant que j'ai un peu de temps.
Pour le moment, j'essaye d'assembler les 2 morceaux de string avec un temporisateur entre les 2 lectures de chaque morceau.
Faut aussi que j'essaye en modifiant les paramètres de connexions (+ ou - vite ?)
Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
siscard06#11 Posté le 10/6/2012 à 17:53:21
AYE j'ai trouvé :cheers:

1
2
3
4
5
6
7
8
9
10
11
PUBLIC SUB SPort_Read()

DIM Poids, Pds AS STRING
Poids = READ #SPort, Lof(Sport)
Pds = Poids
WAIT 0.1
Poids = READ #SPort, Lof(Sport)
Pds = Pds & Poids
TextBox1.Text = Trim(Pds)

END


C'est pas très joli, mais ça marche.
Merci à tous :arrow:
Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Reivillo#12 Posté le 10/6/2012 à 23:10:54
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Re.

Peux-tu me Faire un Copier/Coller
de la Console Gambas,
du résultat de cette procédure.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PUBLIC SUB SPort_Read()

DIM sPoids AS STRING
DIM iLen AS INTEGER
DIM iAscCar AS INTEGER
DIM sHexCar, sAscCar AS STRING

sPoids = READ #SPort, Lof(Sport)
iLen = Len(sPoids)

WHILE iLen > 0
iAscCar = Asc(Mid$(sPoids, iLen, 1))
sAscCar = Chr$(iAscCar) & sAscCar
sHexCar = Hex$(iAscCar) & " " & sHexCar
DEC iLen
WEND

PRINT sAscCar
PRINT sHexCar

END

Je pourrai mieux appréhender ton problème,
en essayant une simulation avec tes retours de Console.
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
1