A OR b pb de résultat

Résolu
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011 - 26 mai 2007 à 22:09
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011 - 27 mai 2007 à 20:56
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

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 mai 2007 à 20:23
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 #
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 mai 2007 à 22:24
Comment sont déclarer tes variables ?

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

1 Or 192 me donne bien (testé) 193

conclusion ? time_val n'a pas la valeur 1 que tu crois, à mon avis ...
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
26 mai 2007 à 22:40
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
0

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

Posez votre question
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
26 mai 2007 à 22:44
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
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
26 mai 2007 à 22:55
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
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
26 mai 2007 à 23:01
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'); ]
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
26 mai 2007 à 23:55
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+
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
26 mai 2007 à 23:58
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 ?
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
27 mai 2007 à 00:15
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.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 mai 2007 à 09:16
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 #
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
27 mai 2007 à 10:50
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 mai 2007 à 10:57
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 #
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
27 mai 2007 à 11:02
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 mai 2007 à 14:44
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 #
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
27 mai 2007 à 17:06
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 mai 2007 à 19:12
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 #
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
27 mai 2007 à 19:46
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! ;) )
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
27 mai 2007 à 20:56
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
0
Rejoignez-nous