A OR b pb de résultat

Résolu
Signaler
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011
-
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011
-
Bonsoir,

lorsque j'écris
time_send = time_val Or 192
j'ai un problème de résultat!
(192 = 1100 0000 en binaire)
Avec time_val 1 je devrais donc obtenir time_send 193 or j'obtient 51 (00110011)!!
pour                   2                       j'obtient                      52
etc

Es-ce que quelqu'un pourrait me venir en aide SVP?
Merci

Liro

19 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Pour le tableau c'est simple, il suffit de remplacer time_send qui est un byte simple, par un tableau de byte (ici de 1 élément) :

        Dim time_send(0) As Byte

        MsgBox("valeur de time_val: " & time_val)
        time_send(0) = time_val Or 192 '0b1100 0000 pour forcer les 2 derniers bits à 1
        MsgBox("valeur de time_send après OR 192: " & time_send(0))
        SerialPort1.Write(time_send, 0, 1) 'envoyé la durée

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Comment sont déclarer tes variables ?

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
salut

1 Or 192 me donne bien (testé) 193

conclusion ? time_val n'a pas la valeur 1 que tu crois, à mon avis ...
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Bonsoir,

J'ai ajouté des msgbox pour visualiser les valeurs de time_val avant le OR 192 et de time_send après le OR.
Et l'opération est correcte, c'est ma carte électronique qui doit avoir un problème (je visualisais le résultat sur cette dernière).

Merci pour votre aide.
Liro
Messages postés
492
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
2 juillet 2012
4
bonsoir
Je comprend pas, j'ai fait un essais et voila le résultat
Dim MyByte As Byte
    MyByte = 192 Or 1 '=193
    MyByte = 1 Or 192 '=193
    MyByte = 2 Or 192 '=194
A+


louis
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Ce serai donc un problème avec le port série puisque si je teste ma
carte avec un autre logiciel (type hyperterminal) en envoyant 193 j'ai
le bon résultat.


time_send = time_val Or 192 '0b1100 0000 pour forcer les 2 derniers bits à 1

SerialPort1.Write(time_send)

Pour 193 (1100 0001) je reçois toujours 51 (0011 0011)
Je suppose donc que c'est un problème de paraméttrage.
Ma config est la suivante: 2400 bauds,8 bits, pas de parité, 1 stop bit.

Dans les propriétés de serialPort1 je peux tout paramétrer sauf le stop bit. Je suppose donc que ça pourrait être l'origine de mon problème.
Es-ce que vous pourriez me dire comment faire SVP?
Merci

Liro
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Oups si je peux paraméttrer le stop bit et il est bien paraméttrer! [javascript:Insert_Emoticon('/imgs2/smile_angry.gif'); ]
Je sais plus où chercher![javascript:Insert_Emoticon('/imgs2/smile_dissapprove.gif'); ]
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
Salut,

c'est pas comme ca la synthaxe normale (je vous ai pas lu en entier)
time_send time_val Or time_send 192

A+
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
Oula, en effet, j'aurais du lire, je croyais que c'etait un test if DSL,

ca dois etre le OR qui va pas (il y a le OR bit a bit et un autre dint je me rappelle plus le nom)

Il n'y en a pas 2 en VB ?
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
Je pense finalement qu'il s'agit d'un format de données. Mais tout en format binaire, ca serait plus clair, car VB dois peut etre reformater tes données.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Ou là, Nicko, il était temps d'aller au lit, non?
 

Liro, SerialPort.Write attent une chaine de caractère en paramètre. En lui passant directement time_send, il ne faudrait qu'il convertisse le nombre en chaine de caractère, c'est à dire aulieu d'envoyer le nombre 193, il envoit peut etre les caractères 1, 9, 3.

Essaye peut-etre de faire l'envoie avec cette instruction :

SerialPort1.Write(Convert.ToChar(time_send))

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Bonjour et merci pour votre aide!

Casy, je pense qu'on est sur la bonne piste mais c'est pas encore ça.
Si je remplace par SerialPort1.Write(Convert.ToChar(time_send))
Je reçois 0011 1111 soit 63 et ce quelque soit la valeur de time_send.

Du fait que ma varaible time_send et du type Byte je pensais que write enverai l'octet.
La solution de tout écrire en binaire et sans doute une bonne idée, surtout que par rapport à mon application c'est plus compréhensible.

Qui pourrai me dire comment écrire en binaire? Avec les logiciels de programmation de microcontrôleurs que j'utilise habituellement
0b c'est le préfixe pour le binaire
0x                        pour l'hexa

J'ai essayé avec 0b mais c'est pas ça!

Merci pour votre aide!
Liro
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Cette possibilité n'existe pas, ici.

Essaye de nous mettre le code complet qui te sert à l'envoie. Ilo n'est pas normal que tu recoive systématiquement 63 quelque soit la valeur envoyée.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Casy,

Le code que j'utilise pour l'envoie c'est celui que tu m'as proposé. Afin de vérifier les valeurs de time_val et time_send j'ai ajouté des msgbox. Les valeurs dans les message box sont correct. Il y a donc bien un probléme de conversion comme tu l'as supposé!

MsgBox("valeur de time_val: " & time_val)
time_send = time_val Or 192 '0b1100 0000 pour forcer les 2 derniers bits à 1
MsgBox("valeur de time_send après OR 192: " & time_send)
SerialPort1.Write(Convert.ToChar(time_send)) 'envoyé la durée

Liro
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Il y a effectivement un problème. A partir du moment ou la valeur est suppérieure ou égale à 128, c'est systématiquement la valeur 63 qui est reçue par le périphérique.

Et je n'arrive pas à comprendre pourquoi. La valeur est de type byte, donc non signée, toutes les conversions sont correctes. Le problème intervient au niveau de la methode Write.

Par contre si la valeur envoyer est extraite d'un tableau de byte, même sans conversion, il n'y a plus de problème, elle est correctement envoyer.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Il semblerait que le codage par défaut soit le suivant: Western European(ISO) encoding
Or ce dernier n'utilise pas 8 bits!
(voir ce post: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1622843&SiteID=1)

Il faudrait donc changer de codage? Mais comment?
Merci.

Liro
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Oui effectivement, j'avais déjà rencontré ce problème. J'ai même pas percuté honte à moi

Le probleme est effectivement le codage, non pas Western European (ISO1252) qui est la page de code utilisé par Windows en france, mais le codage lui-même (Encoding). Il est par défaut fixé sur ASCII. Hors le codage ASCII sous .Net est fixé à 7bits, l'ascii étendu n'est pas reconnu.

Il faudrait donc changer de codage. Le problème est que les autres codages disponibles sont tous des codage UTF (Unicode) ou un caractère est codé sur 2 octets. Dans le cas présent ce n'est pas bon car c'est un seul caractère qui doit etre envoyer.

La solution la plus simple est de rester en codage ascii et de passer par l'envoi d'un tableau soit de Byte soit de Char, plutot que l'envoie d'une chaine de caractères.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Merci Casy!

Humm pour le tableau je vois pas...
Pourrais-tu me montrer STP?
Merci!!

(pendant ce temps j'ai résolu un autre problème (matériel), j'affiche sur un LCD 2x16 les caractères reçus depuis le port série! ;) )
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Super, ça marche!! Merci Casy pour ton aide depuis hier!!
Si tu veux voir ce que ça va donner, tu peux avoir un apperçu ici.

Je trouve ça génial les gens comme toi qui donnent de leur temps libre sur un forum!!
C'est beaucoup de boulot! Chapeau!

Merci
Liro