Calcul du bit de parité (pair ou impair)

senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004 - 7 sept. 2004 à 17:53
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 - 22 sept. 2004 à 19:49
Bonjour !
Etant débutant dans VB, qui peut m'indiquer
comment faire pour générer le bit de parité pair ou impair , sachant que je sais convertir un nombre décimal en binaire

Je ne trouve pas les fonctions de décalages comme en "asm pic"
J'ai vu la fonction Xor qui est presente

Sur le site microsoft msdn , on trouve la fonction <<= ou >>=
mais ne fonctionne pas chez moi ( erreur de compilation ???)
Si on pouvait me faire un résumé la dessus !

Merci
@+
A voir également:

43 réponses

senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004
10 sept. 2004 à 17:47
Salut à tous !
Grace à toutes vos explications fournies , je suis arrivé à faire exactement ce que je souhaitais
à savoir
1)
je modifie ma fonction de la sorte
avant => Call Inverse(variable)
apres => Call Inverse(variable, Label6, 6)
' ici Label6.Caption = image inverse

A l'appel de la fonction "Inverse" , je spécifie le contenu de variable , passe le n° de Label , puis le nb de bits à afficher obligatoirement

Ma fonction devient alors :

Public Function Inverse(variable As String, obj As Label, nb_bit As Integer)
'-------------------------------------------------------------------------
Dim i As Variant
Dim tmp As String
Dim image As String

Call NB_BITS(nb_bit) ' Force un format d'affichage sur le nb de bits exemple => minutes affichage sur 6 bits

For i = Len(variable) To 1 Step -1
tmp = tmp & Mid(variable, i, 1) 'Mid=Renvoie un nombre spécifié de caractères à partir d'une chaîne
Next i
image = tmp
'Inverse = tmp obj tmp ' afin de passer à n'importe quelle fenetre "Labelx.Caption " image

End Function
------------------------------------------------------------------------------------------------------------------
Public Function NB_BITS(nb_bit)
Dim NB_zero As String

Select Case (nb_bit) 'calcul le nb de bits à afficher

Case 1: NB_zero = "#0"
Case 2: NB_zero = "#00"
Case 3: NB_zero = "#000"
Case 4: NB_zero = "#0000"
Case 5: NB_zero = "#00000"
Case 6: NB_zero = "#000000"
Case 7: NB_zero = "#0000000"
Case 8: NB_zero = "#00000000"
Case 9: NB_zero = "#000000000"

End Select
variable = Format(variable, NB_zero)
'mise en forme de la fonction "Format"

End Function
------------------------------------------------------------------------------------------------------------------

Sans doute , des erreus ou alors d'autres solutions sont possibles , en tout cas ceci fonctionne
Si vous avez des remarques et/ou commentaires sur la maniére de faire , alors pas d'hésitation
Je ne demande que cela , c'est comme ça que l'on progresse

Il ne me reste plus qu'à récupérer les quelques 58 bits, à traduire un "0" par un pulse de 100ms , un "1" par un pulse de 200ms
et à les envoyer sur le port serie au rythme d'un bit par seconde
Sûrement bien des surprises ,vu que je ne connais pas du tout le fonction MSComm1

Sans doute ferais-je appel à votre savoir encore une fois
J'attends vos remarques avec impatience

@
Bonne soirée
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
10 sept. 2004 à 19:24
Bonjour Senga, j'ai quelques critiques à formuler, non je ne me permettrais pas, donc si tu veux bien j'ai quelques remarques.
Tout d'abord la fonction NB_BITS ne marche pas chez moi, la variable variable (bizarre bizarre) n'est pas définie. As tu mis l'option Explicit ?
Ensuite une fonction doit renvoyer une valeur, sinon c'est pas une fonction.
J'ai donc modifié comme ceci en spécifiant les types, en supprimant Variant, en remplaçant Mid par Mid$, Format par Format$, etc...

Public Sub Inverse(variable As String, obj As Label, nb_bit As Integer)
    Dim i           As Integer
    Dim tmp      As String
    Dim image  As String
    image = NB_BITS(nb_bit, variable)
    For i = Len(image) To 1 Step -1
        tmp = tmp & Mid$(image, i, 1)
        Next i
    obj = tmp
End Sub

Public Function NB_BITS(nb_bit As Integer, variable As String) As String
    Dim NB_zero As String
    Select Case (nb_bit)
       Case 1: NB_zero = "#0"
       Case 2: NB_zero = "#00"
       Case 3: NB_zero = "#000"
       Case 4: NB_zero = "#0000"
       Case 5: NB_zero = "#00000"
       Case 6: NB_zero = "#000000"
       Case 7: NB_zero = "#0000000"
       Case 8: NB_zero = "#00000000"
       Case 9: NB_zero = "#000000000"
       End Select
    NB_BITS = Format$(variable, NB_zero)
End Function


Si maintenant j'appelle la fonction de cette façon:
Call Inverse(59, Label6, 6)
elle me renvoie: 950000
je vois pas de binaire la-dedans, mais si c'est ce que tu veux ça va ?
D'autre part, on peut aussi supprimer la fonction NB_BITS en l'intégrant directement dans Inverse.
Ce qui donne après modification:

Public Sub Inverse(variable As Integer, obj As Label, nb_bit As Integer)
    Dim i             As Integer
    Dim tmp        As String
    Dim image     As String
    Dim NB_zero As String
    NB_zero = "#" & String$(nb_bit, "0")
    image = Format$(variable, NB_zero)
    For i = 1 To Len(image)
        tmp = Mid$(image, i, 1) & tmp
        Next i
    obj = tmp
End Sub


Bonne Soirée :)
0
senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004
11 sept. 2004 à 09:54
Salut Gobillot !.
Concernant toutes remarques , meme désobligentes , ne te géne pas , ce n'est que bénéfique pour qui veut les entendre

Bon certes , mon pb est que je n'étudie le vb depuis 3 semaines , que je ne posséde pas un livre vb extra
et de plus je n'ai même pas MSDN (j'ai pas le cd )
Je devrais l'avoir d'ici peu !..

Je reviens à mon prgm et mets toutes les infos utiles , je passe sur le création de fenetre .....
je mets l'exemple qui traite les minutes et heures , vu que pour le reste ( jour ,jour_semaine,mois,année ) le traitement
est identique
Seule la fenêtre d'affichage est différente bien-sûr

Je commence:

Option Explicit

' declaration des variables
'€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
Dim variable As String ' (1 octet) ' pour conversion image
Dim tmp As String ' pour conversion image

Dim prct As Integer 'Fonction barre de progression

Dim essai As String
Dim Nul As Variant 'fonction Timer affiche une trame de "00000......."
---------------------------------------------------------------------------------------------------------
Private Sub Timer1_Timer()

Label1.Caption = Date & Space(3) & Time ; en decimal Date et heure systeme

'€€€€€€€€€€€€€€€€€€€€€€€€€€€
' AFFICHAGE MINUTES sur LABEL_6
'€€€€€€€€€€€€€€€€€€€€€€€€€€€
'affiche Minute N° bit 21 22 23 24 25 26 27
'-----------Conversion decimale binaire

variable = DecimalToBinary(Minute(Time), 9) 'conversion decimale en Binary de minute

' -----------inverse les bits------

Call Inverse(variable, Label6, 7) ' Label6.Caption = image inverse

'€€€€€€€€€€€€€€€€€€€€€€€€€€€
' AFFICHAGE PARITE sur LABEL_7
'€€€€€€€€€€€€€€€€€€€€€€€€€€€

'Calcul de la parité 'affiche Parite bit N° 28

Dim n As Byte
n = (Minute(Time)) 'Label6.Caption

If Paritee(n) = True Then
Label7.Caption = 1
Else
Label7.Caption = 0
End If

'€€€€€€€€€€€€€€€€€€€€€€€€€€€
' AFFICHAGE HEURE sur LABEL_8
'€€€€€€€€€€€€€€€€€€€€€€€€€€€

variable = DecimalToBinary(Hour(Time), 8) 'affiche HEURE bit N°29 30 31 32 33 34

' -----------inverse les bits------
Call Inverse(variable, Label8, 6) ' Label6.Caption = image inverse


'€€€€€€€€€€€€€€€€€€€€€€€€€€€
' AFFICHAGE PARITE sur LABEL_9
'€€€€€€€€€€€€€€€€€€€€€€€€€€€

'Calcul de la parité 'affiche Parite bit N° 35
n = (Hour(Time)) 'Label8.Caption

If Paritee(n) = True Then
Label9.Caption = 1
Else
Label9.Caption = 0
End If

' NOTA : le routine de conversion decimale hexa nest pas de moi ,récupérée sur vbfrance

' CONVERSION D'UNE VALEUR DECIMALE EN CHAINE BINAIRE
'€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$

' Decimal : valeur décimale à convertir
' NbBits : nombre de bits a considérer
' Completed : la chaine binaire est complétée de 0 si necéssaire

Public Function DecimalToBinary(Decimale As Long, NbBits As Byte, Optional Completed As Boolean) As String


Dim L, B As String
DecimalToBinary = ""
If Decimale > (2 ^ NbBits) - 1 Then Exit Function
If Decimale < -(2 ^ (NbBits - 1)) - 1 Then Exit Function
If NbBits > 32 Then Exit Function

If Decimale < 0 Then
Decimale = 2 ^ NbBits + Decimale
End If
If Decimale 0 Or Decimale 1 Then L = "" Else L = 1
Do If Decimale Mod 2 0 Then B "0" Else B = "1"
DecimalToBinary = DecimalToBinary & B
Decimale = Decimale \ 2
Loop Until Decimale <= 1
DecimalToBinary = StrReverse(DecimalToBinary & L)
If Completed = True Then
DecimalToBinary = Right("00000000000000000000000000000000" & DecimalToBinary, NbBits)
End If
End Function

'************* CALCUL de la PARITE*********Posté par : Gobillot***********************

Private Function Paritee(n As Byte) As Boolean 'renvoie Paritée=vrai ou faux en réponse
'-------------------------------------------------
Dim x As Integer
Dim R As Integer

x = 128 'masque
Do
If n And x Then R = R + 1
x = x \ 2 ' divide par 2
Loop Until x = 0 'tant que pas 0
Paritee = R Mod 2 ' reste modulo 2

End Function

'************* CALCUL de la PARITE********Posté par : Gobillot*******************

Private Function Byte2String(m As Variant) As String
'--------------------------------------------------------
Dim i As Integer
Dim temp As Variant
Dim Reste As Variant

For i = 1 To 8
temp = m \ 2
Reste = m - 2 * temp
m = temp
Byte2String = Reste & Byte2String
Next i
End Function


' FONCTION INVERSE
'€€€€€€€€€€€€€€€€

'Fonction qui inverse l'ordre 'des caractéres de la string

Public Function Inverse(variable As String, obj As Label, nb_bit As Integer)
'-------------------------------------------------------------------------
Dim i As Variant
Dim tmp As String
Dim image As String

Call NB_BITS(nb_bit) ' Force un format d'affichage sur le nb de bits exemple => minutes affichage sur 6 bits

For i = Len(variable) To 1 Step -1
tmp = tmp & Mid(variable, i, 1) 'Mid=Renvoie un nombre spécifié de caractères à partir d'une chaîne
Next i
image = tmp
'Inverse = tmp obj tmp ' afin de passer à n'importe quelle fenetre "Labelx.Caption " image

End Function

Public Function NB_BITS(nb_bit)
'------------------------------------
Dim NB_zero As String

Select Case (nb_bit) 'calcul le nb de bits à afficher

Case 1: NB_zero = "#0"
Case 2: NB_zero = "#00"
Case 3: NB_zero = "#000"
Case 4: NB_zero = "#0000"
Case 5: NB_zero = "#00000"
Case 6: NB_zero = "#000000"
Case 7: NB_zero = "#0000000"
Case 8: NB_zero = "#00000000"
Case 9: NB_zero = "#000000000"

End Select
variable = Format(variable, NB_zero) 'mise en forme de la fonction "Format"

End Function

Voilà c'est tout pour le moment , je n'ai pas mis la fonction progress_bar

La 1ere chose est de récupérer la valeur decimale de Minutes , de la convertir en binaire et de stocker le résultat dans "variable"
variable = DecimalToBinary(Minute(Time), 9) 'conversion decimale en Binary de minute
Ok , "variable" comme variable , c'est pas tres recherché , mais bon

Ensuite , il me faut inverser l'ordre des bits ,identifier la fenetre Label concernée ,et , respecter aussi le nb de bits minimum pour le parametre "Minutes"
le protocole dcf77 que je veux simuler impose par exemple
Minute N° bit 21 22 23 24 25 26 27

Donc j'envoie cette commande , "variable" est égal à la valeur de minutes en binaire
Label 6 pour informer que je traite pour cette fenetre et enfin "7" pour indiquer que l'affichage se fera dans tous les cas sur 7 bits
et ce quelle que soit la valeur "de variable"
Call Inverse(variable, Label6, 7) ' Label6.Caption = image inverse

Pour finir le calcul de la paritée mais ça je crois que vous connaissez
Il fallait que "n" soit en décimal et non pas en binaire comme je le fesais
'Calcul de la parité 'affiche Parite bit N° 35
n = (Hour(Time)) 'Label8.Caption

If Paritee(n) = True Then
Label7.Caption = 1
Else
Label7.Caption = 0
End If

Finalement on teste vrai ou faux et on envoie le résultat sur la fenetre qui vas bien!.....
Je confirme, ya que du binaire

un exemple il est 20h51 j' affiche
1100110 0 001010 0
minutes binaire mais LSB en premier en partant de la gauche donc 1 +2 + 16 + 32 = 51 suivi du bit de parité forcément à 0
heures binaires Lsb en premier donc 4 +16 = 20 bit paritée à 0

€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€$

Maintenant vos remarques et /ou suggestions

>Tout d'abord la fonction NB_BITS ne marche pas chez moi, la variable variable (bizarre bizarre) n'est pas définie. As tu mis l'option Explicit ?
Ah ça marche pas ! et pourquoi , sinon variable est bien définie , j'ai mis option explicit

>Ensuite une fonction doit renvoyer une valeur, sinon c'est pas une fonction.
Ah bon je crois ,sauf erreur de ma part bien sûr ,que toutes mes fonctions renvoient une valeur

>J'ai donc modifié comme ceci en spécifiant les types, en supprimant Variant, en remplaçant Mid par Mid$, Format par Format$, etc...
Ca fait quoi le fait de changer Mid par Mid$, Format par Format$ , j'ai modifié bien sûr , ne voit pas la différence
En cherchant sur le net j'ai trouvé une faq VB qui me dit

Remarque : La fonction Mid renvoie une chaîne de caractères Variant, la fonction Mid$ renvoie une chaîne
de caractères au format String.
Les instructions Mid et Mid$ fonctionnent de manière identique.

>D'autre part, on peut aussi supprimer la fonction NB_BITS en l'intégrant directement dans Inverse.
>Ce qui donne après modification:

Public Sub Inverse(variable As Integer, obj As Label, nb_bit As Integer)
Dim i As Integer
Dim tmp As String
Dim image As String
Dim NB_zero As String

NB_zero = "#" & String$(nb_bit, "0")
image = Format$(variable, NB_zero)

For i = 1 To Len(image)
tmp = Mid$(image, i, 1) & tmp
Next i

obj = tmp
End Sub

Ben là je plane , piges que dalle pour le moment je dois étudier
J'ai remplacé mon " Call NB_BITS(nb_bit)" par
NB_zero = "#" & String$(nb_bit, "0")
effectivement NB_zero prends bien le nb correspondant à la valeur de nb_bit , là je piges pas comment !
L'appel se fait comment ?
Il faudrait aussi integrer "variable " pour que j'ai le meme résultat
Je vais essayé de voire cela

Bon j'arrete là , je crois que ça fait pas mal de chose
Bonne journée ou soirée
@+
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
11 sept. 2004 à 20:21
Salut Sanga.
Moi non j'ai pas de bouquins, je fais du VB que depuis 6 mois, et j'ai pas l'aide non plus, mais je me débrouille.
MSDN tu le trouves ici:
http://www.microsoft.com/france/msdn/outils/vbasic.mspx
Je vois avec plaisir que le programme avance. Le principal c'est que ça tourne, le mieux c'est d'optimiser.
Revenons à nos moutons

1) Différence entre SUB et FONCTION

Private Function NB_BITS(nb_bit As Integer, variable As String) As String
Dim NB_zero As String
NB_zero =  "#" & String$(nb_bit, "0")
NB_BITS = Format$(variable, NB_zero)
End Function


Les différences sont en rouge. Une fonction s'utilise comme une variable et non pas avec un Call:
image = NB_BITS(nb_bit, variable)
IF NB_BITS(nb_bit, variable) then blablabla...
Dans une fonction, il faut pas faire appel à des variables externes, toutes les variables doivent être Locales, ou en paramètres. ça permet de l'utiliser dans n'importe quel programme.

2) Les Fonctions avec $ à la fin
Les fonctions Mid et Mid$ font bien en effet la même chose, mais pas de la même façon. Les premières travaillent en Variant, ça prend plus de place, ça met plus de temps, et de toute façon ça reconvertit en chaîne (en VB.NET je crois que le Variant n'existe plus) les autres, celles avec un $, c'est les classiques fonctions des vieux basic (Left$, Rights, Mid$, chr$, ...) mais ça marche encore et c'est plus rapide.
c'est pourquoi je me permet de modifier cette ligne:
Label1 = Date$ & Space$(3) & Time$
et aussi celle ci:
Dim L As String, B As String
le Dim L va disparaître de toute façon

3) Fonction String$
renvoie une chaîne de Longueur spécifiée avec le caractère répété.
String$(3, " ") est équivallent à Space$(3)
String$(10, 48) est équivallent à String$(10, "0")
rappel: Asc("0") --> 48
remplace ici avantageusement le Sélect Case, permet d'avoir une chaîne de Longueur nb_bit remplis de zéros.

4) La Fonction DecimalToBinaire
C'est la même chose que ByteToString avec des trucs en plus.
-Contrôle des limites:
If Decimale > (2 ^ NbBits) - 1 Then Exit Function
If Decimale < -(2 ^ (NbBits - 1)) <s>-1</s> Then Exit Function
If NbBits > 32 Then Exit Function
il y a des erreurs
[red]dans le cas d'erreur --> rien ne se passe ?
-Gestion des négatifs:
If Decimale < 0 Then
Decimale = 2 ^ NbBits + Decimale
End If
est-ce bien nécessaire ?
-La conversionIf Decimale 0 Or Decimale 1 Then L = "" Else L = 1
DoIf Decimale Mod 2 0 Then B "0" Else B = "1"
DecimalToBinary = DecimalToBinary & B
Decimale = Decimale \ 2
Loop Until Decimale <= 1
DecimalToBinary = StrReverse(DecimalToBinary & L)
du négatif il y en a plus et pourquoi s'arrêter à 1<s>If Decimale 0 Or Decimale 1 Then L = "" Else L = 1</s>
DoIf Decimale Mod 2 0 Then B "0" Else B = "1"
DecimalToBinary = [red]B & DecimalToBinary
Decimale = Decimale \ 2
Loop Until Decimale = [red]0
<s>DecimalToBinary = StrReverse(DecimalToBinary & L)</s>
le dernier caractère se traite comme les autres, donc L n'est plus nécessaire.
[red] La fonction StrReverse n'est plus nécessaire

5) je vais arrêter ici, j'attends les réactions

Bon Week-end
0

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

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
11 sept. 2004 à 20:28
hum! il y a eu quelques erreurs avec les attributs.
le rouge souligné ne marche pas ? je ressaye.

Daniel
0
senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004
13 sept. 2004 à 18:21
Bonjour Gobillot!
Le week end a été bon !

P'tite question ,Est-ce votre métier la programmation , je demande ça ,parce que , pour moi ,ça n'est pas
le cas, et, je ne connais pas le basic de base
Je connais l'asm pic , et c'est tout
Alors je dois chercher dans tous les sens en même temps, si vous voyez ce que je veux dire

Bon !suite à vos explications

Dans mon prgm j'avais mis , indispensable à mon protocole
Nul = "00000000000000000001" ' affiche les 19 premiers bits à 0, bit 20 à 1
je remplace par
Nul = String$(19, "0") & String$(1, "1") ' "00000000000000000001" ' affiche les 19 premiers bits à 0, bit 20 à 1
C'est mieux ?
Ok ca marche pareil ,de plus ça fait plus pro

La Fonction DecimalToBinaire n'est pas de moi , celle-ci a été la premiére fonction que j'ai piquée sur le site
Je n'ai fait que l'adapter à mes besoins
Ben au départ on essaye de s'aider avec des exemples tout fait , ais-je tord ?
et puis on essaye de comprendre un minimum sur le truc pour s'en servir

J'ai quand meme regarder en mode "pas à pas"
Là ou je bloque c'est

DecimalToBinary = StrReverse(DecimalToBinary & L)
If Completed = True Then
DecimalToBinary = Right("00000000000000000000000000000000" & DecimalToBinary, NbBits)

Je ne connais pas StrReverse mais je pense avoir compris que le role est d'inverser tout simplement
comme son nom l'indique
If Completed => ???? oui ! completed quoi ?de quel test sagit-il
ensuite "Right" ? pareil

Ce qui me surprend c'est que vous me dites n'avoir aucun livre et pas MSDN, alors comment faites vous pour connaitre les fonctions de base ou autre de "vb" , ou alors le prgm c'est votre métier
Moi je crois que tant que je n'aurais pas ce qu'il faut , je vais ramer tout de même Qu'en pensez vous ?

Je n'ai pas encore assez de connaissances en vb pour m'attaquer
déjà à l'optimisation
C'est déjà pas si évident d'écrire une routine qui fonctionne
Mais j'estime néanmoins avancer quand même!

Bon c'est tout pour le moment je retourne à mon prgm
j'ai quelques soucis avec mon protocole dcf

ps j'ai modifié votre routine de calcul parité pour de nbs
sur 23 bits
(Private Function Paritee) fonctionne sans pb

Voilà c'est tout pour ce soir , comme je le disais j'y retourne
Bonne soirée
@+
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
13 sept. 2004 à 19:39
Oui la prog c'est mon métier depuis pas mal de temps.
Comme j'ai fait du Fortran, du Cobol, de l'Assembleur, du Basic ... Le langage change, mais la logique est toujours la même.
J'ai des bouquins mais c'est du vieux Basic et pas du VB, il faut donc s'adapter, alors quand je connais pas je cherche.
J'ai eu du mal a me lancer dans le VB, je pensais que ça allait être trop compliqué, je suis parti de rien, j'ai trouvé VB par hasard, et j'ai tout de suite commencé à écrire un programme qui devait m'être utile. Peu à peu en cherchant, j'ai modifié mon programme et j'ai essayé tous les objects un par un. J'ai de la chance toutes les fonctions de base existaient déjà dans Turbo Basic, ce qu'il y a de nouveau c'est la programmation évênement, l'utilisation des contrôles, les API's , ...
Je connaissais pas la fonction StrReverse, c'est toi qui me l'a appris, ça n'existe pas dans le Basic standard, en fait c'est pas trop dur à comprendre:
tu as une chaîne "ABC" en entrée et en sortie --> "CBA"
Pour Completed si t'en a pas besoin tu le vires. Il s'agit de compléter avec des zéros si sa valeur est à True, ce qui doit toujours être ton cas, sinon par défaut sa valeur est False, et alors là t'as pas le nombre de caractères.

Public Function DecimalToBinary(Decimale As Long, NbBits As Byte) As String
Dim  B As String
DecimalToBinary = ""
'If Decimale > (2 ^ NbBits) - 1 Then Exit Function
'If Decimale < -(2 ^ (NbBits - 1)) - 1 Then Exit Function
'If NbBits > 32 Then Exit Function
'If Decimale < 0 Then Decimale = 2 ^ NbBit's + Decimale
DoIf Decimale Mod 2 0 Then B "0" Else B = "1"
DecimalToBinary = B & DecimalToBinary
Decimale = Decimale \ 2
Loop Until Decimale = 0
DecimalToBinary = Right$(string$(32,"0" & DecimalToBinary, 
NbBits)
'NB: faut-il mettre les zéros derrière ?
'DecimalToBinary = Left$( DecimalToBinary & string$(32,"0", 
NbBits)
End If
End Function


quand tu écris:
Nul = String$(19, "0") & String$(1, "1")
il y a quelque chose qui me chifonne, je veux bien ça marche mais String$ c'est surtout quand il y a plusieurs caractères, quand il y en a qu'un c'est pas utile:
Nul = String$(19, "0") & "1"

Si tu connais ASM, tu as déjà pas mal de connaissances, alors courage VB c'est pas trés dur.
Bonne Soirée
0
senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004
13 sept. 2004 à 20:28
Re_bonsoir Gobillot !
Je me doutais bien que tu étais "programmiste" ou "programmeur"
Moi je suis électronicien , et depuis 2 ans je bosse sur l'asm

ps: mes réalisations sont sur le net , sur le site de Bigonoff
avec qui je travaille

POur "StrReverse" , c'est sûr ,c'est pas difficile de comprendre
l'utilisation de celle-ci

OK pour Nul = String$(19, "0") & "1" , c'est corrigé

Ce que je trouve de plus "chiand" ( excuse ) , c'est d'essayer de transposer un "algo" tout en ignorant qu'elles sont les possibilitées de vb, mais bon petit à petit on trouve

Je regarde ta fonction modifiée "Function DecimalToBinary"
Si ya quelque chose qui m'échappe , je te demanderai

Bonne soirée
@+
0
senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004
15 sept. 2004 à 20:05
Bonsoir Gobillot !
J'en ai fini avec mes calculs de parité
Je me retrouve avec une trame de 58 bits composée évidemment de 0 et de 1

Me reste plus qu'à envoyer cette fameuse trame , à raison d'un bit par seconde
sachant qu'un 0 dure "200ms" et qu'un 1, "100ms"

Le début d'envoie de la trame ne doit commencer uniquement si les secondes sont à "0"

La fameuse trame de 58 bits est le résultat de la conversion de
19 premiers bits = 0 19 bits
20eme bit toujours à 1 1 bit

puis ensuite

minutes 7 bits
parité des minutes 1 bit
heures 6 bits
parité des heures 1 bit
jour 6 bits
jour_semaine 3 bits
mois 5 bits
annee 8 bits
parite de jour, jour_semaine, mois et annee 1 bit

total 58bits

Si je prends cet extrait de mon prgm
---------------------------------------------
les 20 premiers bits sont sous la forme
Début_trame = String$(14, "0") & bit_15 & bit_16 & bit_17 & bit_18 & bit_19 & "1"

sachant que je modifie à souhait la valeur de bit_15 à bit_19
ceci fonctionne sans pb

La 1ere chose a mettre en place est de générée
si le bit = 0 état haut pendant 200ms puis état bas
si le bit = 1 etat haut pendant 100ms puis état bas

Comment réaliser cette fonction , avec un timer ?
avec cet exemple trouvé dans une faq ?
'Placez cette ligne dans la partie Déclarations d'un module :
'Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'Vous pourrez ainsi faire une pause de 2 secondes avec l'appel suivant :
'Sleep 2000

Sinon ,Peut-on modifier le parametre "Interval" d'un Timer dans un prgm
Si oui ! comment ? j'ai pas réussi à trouver

Maintenant je souhaite envoyer ce contenu sur le port série , mettre un bouchon sur ce port et relire les datas envoyées pour vérification
Oui mais comment?

Donc voilà un peu les questions que je me pose actuellement !
Si vous avez une idée! un exemple ou autre !....
Encore merci de toute façon , j'ai déjà eu pas mal de tuyaux

Bonne soirée
@
Claude
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
15 sept. 2004 à 21:33
Bosoir Sanga.
exemple avec un timer

    Dim bT    As Boolean

Private Sub Command1_Click()
    Dim trame As String
    Dim i     As Integer
    Dim tps   As Long
    
    trame = "00100101010101010111"  'c'est un exemple
    
    Timer1.Enabled = True
    tps = Timer    'pour vérifier le temps mis
    For i = 1 To Len(trame)
        If (Mid$(trame, i, 1)) = "0" Then
            Text1 = Text1 & "0"    'pour voir si ça tourne
            Timer1.Interval = 200
            bT = True
            Else
            Text1 = Text1 & "1"    'pour voir si ça tourne
            Timer1.Interval = 100
            bT = True
            End If
         While bT
            DoEvents
            Wend
         Next
    Timer1.Enabled = False
    Timer1.Interval = 0

    
    MsgBox Int((Timer - tps) * 1000)
'   doit obtenir 3000 environ
'   parce que (10 * 200) + (10 * 100)
End Sub

Private Sub Timer1_Timer()
    bT = False
End Sub
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
15 sept. 2004 à 21:50
exemple avec Sleep

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command2_Click()
    Dim trame As String
    Dim i     As Integer
    Dim tps   As Long
    
    trame = "00100101010101010111"  'c'est un exemple
    
    Text1 = "":  DoEvents
    tps = Timer    'pour vérifier le temps mis
    For i = 1 To Len(trame)
        If (Mid$(trame, i, 1)) = "0" Then
            Text1 = Text1 & "0"    'pour voir si ça tourne
            Sleep 200
            Else
            Text1 = Text1 & "1"    'pour voir si ça tourne
            Sleep 100
            End If
         Next
    
    MsgBox Int((Timer - tps) * 1000)
'   doit obtenir 3000 environ
'   parce que (10 * 200) + (10 * 100)

End Sub
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
15 sept. 2004 à 23:48
Exemple avec GetTickCount

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command3_Click()
    Dim trame As String
    Dim i     As Integer
    Dim tps   As Long
    Dim tp    As Long
    
    trame = "00100101010101010111"
    
    Text1 = ""
    DoEvents
    tps = GetTickCount
    For i = 1 To Len(trame)
        tp = GetTickCount
        If (Mid$(trame, i, 1)) = "0" Then
            Text1 = Text1 & "0"
            tp = tp + 200
            Else
            Text1 = Text1 & "1"
            tp = tp + 100
            End If
         While GetTickCount < tp
            DoEvents
            Wend
         Next
    MsgBox (GetTickCount - tps)
End Sub
0
senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004
16 sept. 2004 à 18:35
Bonjour Gobillot!

Je ne peux que vous remercier de toutes ces infos et exmples
J'ai déjà essayé le 1er exemple
Ceci fonctionne mais le temps affiché n'est pas constant

Si je mets dans
trame = "0000000000" 'c'est un exemple
soit 10x 200ms , celui-ci me retourne des valeurs comprises entre
1800 et 2500 apres l'appui sur la touche

Ne doit -on pas reseter "Timer ",des que l'on entre dans la routine afin que celui ci commence à compter avec toujours la meme valeur
J'ai essayé timer=0 mais le compilateur me jéte
Peut etre une erreur de syntaxe!

De toute façon il me faut examiner cette routine afin de la comprendre

Je vous tiens au courant si besoin
J'espére que ce n'est pas moi qui vous oblige à aller vous coucher
tard , dernier post à 23h48 aie aie aie !!!

Merci des liens sur le port série, il me faut aussi étudier ceci
Encore milles merci à vous!
Bonne soirée
@+
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
16 sept. 2004 à 18:41
non on peut pas changer Timer, on ne peut que le lire. ça me sert seulement qu'à vérifier le temps.
En effet le timer de VB n'est pas très précis, le plus précis doit être GetTickCount
0
senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004
19 sept. 2004 à 12:40
Bonjour Gobillot!
J'ai essayé avec GetTickCount , en effet c'est tres précis et me convient parfaitement
Je me dois donc d'apprendre les API, me semble t-il ?

J'ai plus qu'à comprendre la routine avec DoEvents et
Wend que je ne connais pas
Il me suffit de chercher la signification et ça devrait aller

pour le port série ,j'en suis pas encore là , je crois qu'il est temps de faire une syntaxe de tout ce que j'ai mis en oeuvre pour bien comprendre

Je continue à travailler!...
Bonne soirée
0
senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004
20 sept. 2004 à 18:41
Bonsoir Gobillot !

JUste pour savoir si vous pouvez jeter un oeil à ma routine
( copier sur la votre avec getickcount) mais adaptée à mes besoins

Je veux faire la chose suivante
Toujours avec une trame de 58 bits composée de 0(200ms) et de 1(100ms) , je la scrute aux rythmes des secondes et affiche la valeur respective dans une fenetre Label
J'ai quelque soucis d'affichage et peux sauter une valeur comme
passer de la valeur 55 à 57 (bits)

mes calculs de temps sont ils exacts?

ma routine:
Private Sub Calcul_temps_bit() 'Exemple avec GetTickCount

Dim Text1 As String

Dim trame As String
Dim i, t As Integer
Dim tps As Long
Dim tp As Long
Dim le_temps As Long
Dim val_precedente, result As String

trame = Label5.Caption ' "0101010"

Text1 = ""
DoEvents ' demande au système de traiter les événements en attente, s'il y en a, dans la file des messages Windows.
tps = GetTickCount

For i = (Second(Time)) To Len(trame)
'test si secondes 59 alors i 58
'---------------------------------------------
If (Second(Time)) = 59 Then
i = 58
End If

tp = GetTickCount


' Xor les secondes avec val precedente
'---------------------------------------------------
result = (Second(Time)) Xor val_precedente

'test le résultat
'----------------------
If result > 1 Then ' result=1 si les secondes ont été incrémentées

' boucle if....else
If (Mid$(trame, i, 1)) = "0" Then
DoEvents
Text1 = Text1 & "0"
tp = tp + 200
Label2.Caption = (tp - tps) & i 'calcul et affiche
val_precedente = (Second(Time)) 'sauve valeur des secondes


Else
DoEvents
Text1 = Text1 & "1"
tp = tp + 100
Label2.Caption = (tp - tps) & i 'calcul et affiche
val_precedente = (Second(Time)) 'sauve valeur des secondes


End If
Else
DoEvents
End If

' boucle while....wend
While GetTickCount < tp ' tant que inférieur à tp
DoEvents
DoEvents
Wend ' on sort si getickcount > à tp

Next

End Sub

--------------------------------------------

Voilà c'est tout , je continu à bosser et j'espére trouver mon pb

Bonne soirée
@+
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
20 sept. 2004 à 18:53
Bon j'ai pas trop le temps de regarder en détail
mais seuls petits trucs:

1)
Text1 = Text1 & "1"
DoEvents

le DoEvents permet d'afficher le "1" dans Text1, simple question d'affichage, ne joue en rien sur le traitement. si tu met pas DoEvents, text1 ne s'affiche pas mais le traitement se fait quand même.

2)
deux DoEvents qui se suivent ?
un seul doit suffire

3)
pour le Xor je regarderais plus tard
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
21 sept. 2004 à 00:55
Private Sub Calcul_temps_bit()
Dim trame As String
Dim i As Integer
Dim tp1 As Long
Dim tp2 As Long
Dim Tps As Long

trame = Label5.Caption

'Text1 c'est un Textbox et pas une variable
'on met DoEvents si nécessaire
Text1 = "": 'DoEvents

'Tps c'est pour vérufier le temps
Tps = GetTickCount
tp2 = Tps

'il faut envoyer les 58 bits
For i = 1 To Len(trame)

'début des temps
'tp1 pour le bit
'tp2 pour la seconde
tp2 = tp2 + 1000
tp1 = GetTickCount

'là il faut aller vite parce que le temps coule
If (Mid$(trame, i, 1)) = "0" Then
tp1 = tp1 + 200
Text1 = Text1 & "0":
Else
tp1 = tp1 + 100
Text1 = Text1 & "1":
End If

'attente pour la durée du bit
While GetTickCount < tp1
DoEvents
Wend

'affichage vérif temps total
'je le met ici pour que ça n'influe pas dans le temps
Label2.Caption = (tp2 - Tps)

'attente pour finir la seconde
While GetTickCount < tp2
DoEvents
Wend

Next

End Sub
0
senga34 Messages postés 14 Date d'inscription vendredi 27 août 2004 Statut Membre Dernière intervention 22 septembre 2004
21 sept. 2004 à 18:02
Bonjour Mr GOBILLOT!

On dirait que cela devient une discussion à deux!
Mais enfin puisque vous accepter de m'accorder de votre temps!

Je me posais la question à savoir pourquoi mon horloge passait de 34 à 36 secondes ( c'est un exemple ) et je pensais que cela venait de ma derniére routine
En fait ce n'est pas du tout le cas .
Si je compare l'horloge systeme du PC avec mon horloge , on voit
que les secondes sont en retard par rapport au systeme , et au bout de 15 à 20 secondes , mon horloge "rattrappe" ce retard
d'ou le fait de sauter 1 seconde

J'ai essayé de supprimer le maximum de chose sans résultat, je n'arrive pas à trouver le "pourquoi"

J'ai l'impression que mes routines de conversion décimale-binaire
et/ou routine d'inversion en sont la cause

J'ai essayé aussi de remplacé le timer par les api sans succés
le résultat est identique

Avez-vous une idée à me soumettre !...

J'ai essayé la derniére routine Private Sub Calcul_temps_bit()
elle ne fonctionne pas comme il se devrait
Cependant , bien vu la simulation d'un timer (tp2 = tp2 + 1000)
Je dois avant toute chose corriger mon histoire de retard!

Comment mettre en commentaire plusieurs lignes en meme temps
je ne trouve pas la commande qui vas bien
Bon Je retourne à mon probléme !

Bonne soirée et encore mille merci à vous!...
@+
0
Rejoignez-nous