cs_Liro
Messages postés159Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention30 septembre 2011
-
26 mai 2007 à 22:09
cs_Liro
Messages postés159Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention30 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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
cs_Liro
Messages postés159Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention30 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_lermite222
Messages postés492Date d'inscriptionjeudi 5 avril 2007StatutMembreDernière intervention 2 juillet 20124 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+
cs_Liro
Messages postés159Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention30 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
cs_Liro
Messages postés159Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention30 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'); ]
cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 septembre 20073 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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
cs_Liro
Messages postés159Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention30 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
cs_Liro
Messages postés159Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention30 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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #