Assemblage de 2 variables

electrique5

Senior Member
Bonjour,
je souhaite compilé deux variables ensemble a l'occurence la variable C et la variable B en une seul et d'envoyé le tout par un serout le problème je sais pas comment faire.
je doit d'abord mettre la C avant la B
exemple si j'ai 12 avec la variable C et 56 avec la B je doit pouvoir envoyer 1256 en serout ce nombre il sera récupérer via un autre picaxe en serin
Merci
 

BESQUEUT

Senior Member
Si vous transmettez ces valeurs en ASCII, il faut obligatoirement un séparateur, sinon comment distinguer :
12 et 56 de 125 et 6 ? (qui tous deux donneront la chaîne 1256...)
Mais si vous transmettez deux octets, il n'y a aucun problème.
 

CrashDrives

New Member
Vous faite un serout avec comme donnée (#C,"255",#B)

puis avec serin vous récupérez le tout dans 3 variables en utilisant que la première et la dernière.

Je n'ais pas fait d’essai mais je pense que sa devrait fonctionner.
 

BESQUEUT

Senior Member
Vous faite un serout avec comme donnée (#C,"255",#B)
Le "255" ne sert à rien dans ce cas, et qui plus est ça fait 3 octets !
On pourrait imaginer (#C,",",#B) ce qui fait entre 3 et 7 octets à chaque envoi.
Mais il est plus simple de transmettre en binaire : serout (C,B)
Pour la solution "jojojo" :
Outre que ça ne sert à rien de passer par une variable Word puisque de toutes façons il faudra bien envoyer 2 octets,
j'ai un gros doute sur la capacité de serout à transmettre un word : la doc parle de variables (0-255)...
 
Last edited:

BESQUEUT

Senior Member
D'accord merci mais pouvez-vous me donner un exemple je suis un peu perdu
Merci
Vu les échanges avec jopjojo et CrashDrives, je comprends votre confusion...
Il ya deux méthodes :
- soit ou transmet en ASCII,, c'est à dire les lettres successives : "1" "2" "," "5" "6" ... soit dans ce cas 5 octets (et même plus car il faut une fin de ligne)
- soit on transmet en binaire deux octets : 12 et 56

La méthode ASCII n'est utile que si un être humain doit lire les caractères reçus, ou pour certains protocoles qui ne supportent pas le binaire.
Si c'est pour communiquer directement entre 2 picaxes, sans protocole, le binaire est plus simple et plus performant.

Pour illustrer mon propos, dans le code ASCII :
- l'octet de valeur 12 est utilisé pour une lettre ASCII non visualisable par un humain, à savoir "Form Feed", c'est à dire le "saut de page"
- l'octet de valeur 56 est utilisé pour représenter la lettre "8"
- l'octet de valeur 65 est utilisé pour représenter la lettre "A"

Encore une petite précision : un octet, c'est 8 bits. Sur un Picaxe c'est aussi une variable de type Byte.
J'utilise de préférence le terme "octet" car sur d'autres systèmes un Byte peut avoir plus que 8 bits...
 
Last edited:

electrique5

Senior Member
en faisant comme ca ca ne fonctionnerais pas ?
bintoascii varC,b5,b6,b7
bintoascii varB,b8,b9,b10
serout 1,N2400_4,(b6,b7,b9,b10)
 

BESQUEUT

Senior Member
je doit pouvoir envoyer 1256 en serout ce nombre il sera récupérer via un autre picaxe en serin
Mais peut-être avons nous mal compris la question ?
W0=C*100+B ' donne bien W0=1256
Dans ce cas il faut faire un serout (B1,B0) ( car B1,B0 est la même chose que W0)
 

BESQUEUT

Senior Member
en faisant comme ca ca ne fonctionnerais pas ?
bintoascii varC,b5,b6,b7
bintoascii varB,b8,b9,b10
serout 1,N2400_4,(b6,b7,b9,b10)
Oui : ça va marcher si B et C sont compris entre 0 et 99
Mais comment allez vous rédiger le serin ?

Pour info : ce faisant, vous utilisez une transmission en ASCII...

En référence à mon post #9, on aurait aussi pu écrire :
W0=C*100+B
serout 1,N2400_4,(#W0)
 

electrique5

Senior Member
bintoascii varC,b5,b6,b7
bintoascii varB,b8,b9,b10
serout 1,N2400_4,(254,128,b6,b7,b9,b10,"")
fonctione sur un LCD j'ai bien les 2 variables dans l'ordre donc normalement ca devrait fonctionner
serout 1,N2400_4,(b6,b7,b9,b10)
Pour la récupération du nombre dans l'autre picaxe j'ai essayé ca mais ca fonctionne pas

serin C.0,N2400_4,w1
bintoascii w1,b8,b9,b10,b11,b12
serout 7,N2400_4,(254,128,b8,b9,b10,b11,b12," ")

ensuite il faudrait que je sépare chaque chiffre pour 1258 ca sera
VAR_A = 1
VAR_B = 2
VAR_C = 5
VAR_D = 8

PS c'est toujours des nombres a 4 chiffres de 0000 à 2500
 

BESQUEUT

Senior Member
serout 1,N2400_4,(b6,b7,b9,b10)

Pour la récupération du nombre dans l'autre picaxe j'ai essayé ca mais ca fonctionne pas
serin C.0,N2400_4,w1

PS c'est toujours des nombres a 4 chiffres de 0000 à 2500
Normal que ça ne fonctionne pas :
- comme expliqué en #10, vous envoyez les données en ASCII,
- puis vous tentez de les recevoir en binaire,...
- et qui plus ai j'ai un gros doute sur la capacité de serin à traiter un Word.

Pour l'envoi, il semble que vous ajoutiez des caractères destinés à l'afficheur LCD. (Ce qui justifie mon post #7 : lecture par un être humain...)
En supposant un envoi épuré, genre :
W0=C*100+B
serout 1,N2400_4,(#W0)

Pour la réception, essayez plutôt :
serin C.0,N2400_4,#W1

En binaire, comme je l'ai déjà indiqué, l'envoi se ferait par :
W0=C*100+B
serout 1,N2400_4,(B1,B0)

et la réception par :
serin C.0,N2400_4,B1,B0
le résultat est dans W0 sans qu'il y ait autre chose à faire.
 
Last edited:

electrique5

Senior Member
Je vient de testé
serin C.0,N2400_4,#w1
bintoascii w1,b8,b9,b10,b11,b12
serout 7,N2400_4,(254,128,b8,b9,b10,b11,b12,"")
mais j'ai rien sur l'écran je sais pas du tous si il recoi les donnes via du premier picaxe
 

BESQUEUT

Senior Member
bintoascii w1,b8,b9,b10,b11,b12
serout 7,N2400_4,(254,128,b8,b9,b10,b11,b12,"")
C'est aussi simple d'écrire :
serout 7,N2400_4,(254,128,#W1,"")
Voir mon post #12 : vous polluez la réception du Picaxe par des caractères (254,128,...,"") destinés au LCD...
Je suggère un petit clignotement sur une LED après le serin pour voir si le Picaxe à reçu quelque chose...
 

electrique5

Senior Member
Oui effectivement ca doit bloquer quelques part j'ai écrit sur le picaxe qui recoi

serin C.0,N2400_4,#w1
serout 7,N2400_4,(254,128,#w1,"")
high 6
pause 200
low 6
pause 200

La sortie 6 avec la LED s'allume pas par contre dès que je vire le # de w1 cette fois la LED clignotte par contre j'ai rien sur l'écran

sur mon 1er picaxe qui envoie les donnée j'ai mis

let varA = varA + 1
let varB = varB + 2
bintoascii varA,b5,b6,b7
bintoascii varB,b8,b9,b10
serout 1,N2400_4,(b6,b7,b9,b10)
pause 500

qui tourne en boucle pour faire le test donc ca incrémente la variable A et B puis dans le serout
si je le connect sur un LCD pas de souci il fait bien la boucle et incrémente bien les variables
 

BESQUEUT

Senior Member
serout 1,N2400_4,(b6,b7,b9,b10)
qui tourne en boucle pour faire le test donc ca incrémente la variable A et B puis dans le serout
si je le connect sur un LCD pas de souci il fait bien la boucle et incrémente bien les variables
Avis aux spécialistes : ceci dépasse mes compétences Picaxiennes...
En particulier sur la réception de données ASCII. (Vous avez compris que je préfère travailler en binaire...)
Il doit manquer un séparateur de fin de ligne, sinon le Picaxe qui reçoit ne peut pas savoir si la ligne est terminée ou pas...

Mais la doc est muette sur ce point !

C'est peut être le "" utilisé avec le LCD.
De façon formelle, ceci ne devrait strictement rien envoyer, mais c'est peut-être une astuce pour envoyer l'octet zéro.
Dans ce cas, il faudrait tenter :
serout 1,N2400_4,(b6,b7,b9,b10,"")

Sinon, l'habitude, c'est d'envoyer CR, LF (Carriage Return, LineFeed)
Ce qui donnerait :
serout 1,N2400_4,(b6,b7,b9,b10,13,10)

Mais là, je suppute beaucoup trop : il vaudrait mieux un qui sait que 2 (ou plus) qui cherchent...
 

electrique5

Senior Member
Je sais pas mais existe t-il une autre technique qui permettrait d'envoyer une nombre de 4 caractères a partir d'un 1er picaxe et qu'il soit récupéré d'un autre picaxe puis une fois récupéré séparé chaque chiffre dans une variable ?
j'avais pensé a serin et serout mais peut etre il existe une autre facon de faire
 

westaust55

Moderator
serout 1,N2400_4,(b6,b7,b9,b10)
envoie quatre valeurs d'octets séparé sous forme de nombres binaires

Serin C.0,N2400_4,#w1
à cause de la # paramemter, il attend une valeur mutli chiffres ASCII encodée. Ce serait quelque chose comme
"1", "2", "3", "4", "5"
ou

31, 32, 33, 34, 35

Aussi il y a, comme indiqué, qu'il fallait envoyer un caractère non chiffre avec le SEROUT ci-dessus commande pour indiquer que l'envoi est terminé

Plus loin lors de l'envoi des 4 valeurs d'octets différents, vous attendent une seule valeur ASCII codé afin que les données ne correspond pas.

Essayez

serout 1, N2400_4, (b6, b7, b9, b10, cr)

et

Serin C.0,N2400_4, b8, b9, b10 b11
 

BESQUEUT

Senior Member
Serin C.0,N2400_4, b8, b9, b10 b11
Ceci ne répond pas à ma question : quel est le terminateur pour un nombre envoyé en ASCII ?
La doc est muette sur ce point.

Vous proposez :
serout 1, N2400_4, (b6, b7, b9, b10, cr)
Mais à moins que CR soit une constante prédéfinie, il vaudrait mieux utiliser 13.
 
Last edited:

electrique5

Senior Member
c'est pas possible je doit oublié quelque chose ou une erreur que je vois pas ca fonctionne pas
je vous donne le code au complet :


Celui qui envoie et tourne en boucle afin d'incrémenté varA et varB:
let varA = varA + 1
let varB = varB + 2
bintoascii varA,b5,b6,b7
bintoascii varB,b8,b9,b10
serout 1, N2400_4, (b6, b7, b9, b10, cr)
pause 1000

Celui qui recoi et renvoi sur LCD :
Serin C.0,N2400_4, (b8, b9, b10, b11,"")
bintoascii varA,b5,b6,b7
bintoascii varB,b8,b9,b10
serout 7,N2400_4,(254,192,b8,b9,b10, b11)


En ce qui concerne de celui qui envoie j'ai testé directement sur un LCD
j'ai remplacer la ligne
serout 1, N2400_4, (b6, b7, b9, b10, cr)
par
serout 1,N2400_4,(254,128,b6,b7,b9,b10)

j'ai bien les 2 variables A et B et sont bien incémenté au départ ca commence par 0000, 0102, 0204, 0306, 0408, 0510 etc...
J'ai testé également la ligne serout 1,N2400_4,(b6,b7,b9,b10) et connecté le LCD comme ca
j'ai bien les donnée sauf elle sont affiché les une a coté des autres mais ca c'est normal
donc par logique les données sont bien envoyé mais par contre je recoi rien sur le 2ème
 
Last edited:

BESQUEUT

Senior Member
Voir mon post #13 qui n'était pas complet...
Restons zen : tant que n'aurons pas ce terminateur, le récepteur restera bloqué en attente...
ou alors utiliser le binaire... (oui, je l'admet : je suis têtu...)
Serin C.0,N2400_4, (b8, b9, b10, b11,"")
n'a aucune chance de marcher !
Est-ce bien le code que vous utilisez ? (avec des parenthèses ?)
 

BESQUEUT

Senior Member
Je sais pas mais existe t-il une autre technique qui permettrait d'envoyer une nombre de 4 caractères a partir d'un 1er picaxe et qu'il soit récupéré d'un autre picaxe puis une fois récupéré séparé chaque chiffre dans une variable ?
j'avais pensé a serin et serout mais peut etre il existe une autre facon de faire
Voir post #12 solution binaire...
 

electrique5

Senior Member
oui c'ést bien le code avec les parenthèses mais la je vient d'essayé celui-ci
serin C.0,N2400_4,b0,b1,b2,b3
serout 7,N2400_4,(254,192,b0,b1,b2,b3)

cette fois j'ai quelque chose sur l'écran j'ai bien des chiffres seulement il sont tous dans le désordre
il faut que je retrouve quel chiffre correspond au 1er puis le second etc...
 

electrique5

Senior Member
Non non c'est moi le chiffre sont dans l'ordre apparament ca serais bon
maintenant il reste a séparé chaque chiffre dans une variable qui lui est propre
 

BESQUEUT

Senior Member
oui c'ést bien le code avec les parenthèses
Pas d'accord : avec les parenthèses, ça n'a pas pu marcher sur le LCD comme vous l'avez écrit en #20...
maintenant il reste a séparé chaque chiffre dans une variable qui lui est propre
Ben... ??? Les 4 chiffres sont dans les variables b0,b1,b2,b3
Que faut-il de plus ?

PS : j'ai cherché à quoi correspondait ce "" à la fin de vos commandes serout...
Nibe, nada, nitchevo niet, quedalle, même pas chouya...
En un mot : où avez-vous pêché ce truc ?
 

electrique5

Senior Member
c'est vrai je sais pas pourquoi j'ai mis ca
en ce qui concerne les variables normalement b0 c'est égal a varA, b1 a varB etc...
Quand je fait une comparaison de varA = 2 par exemple je fait high 0 pour testé
seulement arrivé a 2 rien ne se passe et parreille avec les autres variable si je remplace A par varB une fois arrivé a 2 rien ne se passe
voici l'organigrame
Sans titre.PNG
dans la case mon code serin :
serin C.0,N2400_4,b0,b1,b2,b3
serout 7,N2400_4,(254,128,b0,b1,b2,b3)
 

BESQUEUT

Senior Member
mon code serin :
serin C.0,N2400_4,b0,b1,b2,b3
serout 7,N2400_4,(254,128,b0,b1,b2,b3)
Je vous rappelle que vous travaillez en ASCII...
Donc les variables B0, B1, B2, B3 contiennent le code ASCII (la "lettre") correspondant à chaque chiffre...
Pour revenir à votre exemple de départ, le nombre 1256 est transmis en ASCII de la façon suivante :
"1" => 49 = B0
"2" => 50 = B1
"5" => 53 = B2
"6" => 54 = B3
Vous pouvez enlever 48 aux variables B0 à B3
Ce qui revient à convertir les caractères ASCII en nombres binaires.
Ou alors vous devez tester les valeurs binaires indiquées : 48 pour le "0", 49 pour le "1" etc...
 
Last edited:

BESQUEUT

Senior Member
Juste pour le fun, j'aurais bien aimé savoir si ce code marche :
Code:
Emission :
W0=C*100+B
serout 1,N2400_4,(#W0,13)

Réception :
serin C.0,N2400_4,#W1
serout 7,N2400_4,(254,192,#W1)
 

BESQUEUT

Senior Member
pouvez vous me donnez un exemple j'ai pas compris ce que vous voulez dire
Solution 1 :
B0=B0-48
B1=B1-48
B2=B2-48
B3=B3-48
if B0=2 then ...



Solution 2:
au lieu de
if B0=2 then
écrire
if B0=50 then

Je sais que ce n'est pas évident au début, mais vous avez mis le doigt sur un concept tout à fait essentiel, et vous êtes sur le point d'avoir ce que les anglophones appellent un "haha !"

a) les ordinateurs ne connaissent que 0 ou 1 à savoir : 0V ou +5V ; ça s'appelle un bit.
b) par commodité, on groupe les bits par paquets de 8 : ça s'appelle un octet
c) Sur un Picaxe, un octet est contenu dans une variable de type Byte
d) Une variable de type Byte contient un nombre entre 0 et 255 (inclus).
e) Une variable de type Byte contient une "lettre ASCII" dont le code va de 0 à 255 et qui peut être visualisée.
f) dans les instructions serout et serin, les variables sont transmises en binaire, sauf si on utilise le #, auquel cas, les variables sont converties vers ou depuis le code ASCII.
g) Les Chiffres de 0 à 9 sont codés de 48 à 57 dans la table ASCII
h) En BASIC Picaxe, écrire 65, c'est exactement la même chose que écrire "A"
i) De même, écrire 50, c'est exactement la même chose que écrire "2"

2 n'est pas égal à 50 mais "2"=50

Si vous ressentez des symptômes bizarres, genre sueurs froides, prévenez moi : vous êtes sur la bonne voie !

Votre programme marche et transmet les données codées en ASCII, bien que vous n'utilisiez pas le # tout simplement parce que vous faites la conversion avant la transmission. Reste que les données reçues sont toujours codées en ASCII et vous ne pouvez donc pas faire un test direct avec des nombres binaires.
Il faut soit convertir dans l'autre sens (de ASCII vers binaire)
soit comparer avec la valeur ASCII des chiffres...
 
Last edited:

electrique5

Senior Member
j'ai fait
serin C.0,N2400_4,b8,b9,b10,b11
serout 7,N2400_4,(254,128,b8,b9,b10,b11)
B0=B0-48
B1=B1-48
B2=B2-48
B3=B3-48

if varA = 2 then ...

j'ai bien le nombre sur l'écran exemple 2345 mais quand le 2 du nombre il est pas reconnu par if varA = 2 then ...
du coup je peut pas faire l'opération

et en faisant serin C.0,N2400_4,#W1 le # bloque tous il recoi plus rien
 

BESQUEUT

Senior Member
HELP

Désolé, je vais me déconnecter là...
En plus, je ne connais strictement rien à la programmation graphique...
Si quelqu'un est volontaire pour prendre la suite ?
 

electrique5

Senior Member
je vous remercie pour votre patience et de votre aide je vais essayé de me débrouillé vous m'avez pas mal aidé je vous remercie
 

electrique5

Senior Member
Ca y'est j'ai trouvé il fallais faire
let varA = b8 - 48 et j'ai bien varA et tous fonctionne bien
ouf enfin il était tant en tous cas je vous remercie de votre aide et de votre patience
 

electrique5

Senior Member
Bonjour
j'ai un autre souci je voudrait assembler 2 variables a l'occurrence VarA et VarB
VarA et VarB possède qu'un seul chiffre de 0 a 9 chacun je voudrait assembler les 2 dans une autre variable a l'occurrence VarC afin d'avoir un nombre a deux chiffre de 01 à 99 placer dans une unique variable.
Savez-vous comment faire cela ?

j'ai essayé :
let varC = varA,varB
let varC = varA|varB
let varC = varA&varB
ca fonctionne pas
 
Top