Gambas France BETA


Pas de compte ? Incription

Dialogue via RS232 entre une IHM en Gambas3 et un µcontroleur

12
AuteurMessages
Totof#16 Posté le 21/1/2013 à 20:09:48
Ce qui est pris n'est plus a prendreBonsoir, merci de ta réponse

J'ai déjà fait cette maniup mais cela ne me donne pas ce que mon µc attend
avec cette manière , si on part de la valeur décimale 400 on obtiens en Hex 00000190

ce qu'on cherche à faire , c'est de la valeur décimale 400 , envoyé par une liaison RS232

les 4 octets , je sais c'est pas simple :oops:

AMHA les octets 00 00 c8 43 sont les représentions des adresses de cette valeur déci de 400 stockée
en mémoire , c'est là que je sèche

A bientôt
Flachy Joe#17 Posté le 21/1/2013 à 20:34:05
Iguane : Il Gambas Uniquement pour Activer ses NEuronesJe viens de comprendre d'où vient le problème :

La fonction Hex$ de Gambas converti le nombre en Long puis en affiche la valeur hexa
On a donc bien 400(base10)=190(base 16)

Alors que ton programme en C affiche la représentation en mémoire d'un float et non sa valeur hexa !
Un float est codé avec la norme IEEE 754 (32 Bits = 1bit de signe, 8bits d'exposant et 23bits de mantisse), c'est donc un peu galère de retrouver la valeur à partir du code ou inversement.

Mais en fait on s'en f**t de cette représentation tant que le µC obtient la bonne valeur à travers le port RS232.
Donc si on lui envoi 400.0 en single depuis gambas(virgule flottante sur 32bits), il devrait obtenir la bonne valeur.

Donc la solution fournie dans mon message précédent est parfaitement applicable, tu n'as pas besoin de chercher la représentation de la valeur 400.0 en mémoire puisque tu peut l'écrire en décimal...

Ce code devrait allumer sans problème ta led de contrôle :
1
2
3
4
5
6
7
8
9
10
11
PUBLIC SUB Button2_Click()
DIM sTs AS STRING
IF Sport.Status = Net.Inactive THEN
Message("Open port first!")
ELSE
sTs = TxtSend.Text
WRITE #Sport, 1 AS INTEGER
WRITE #Sport, 400 AS SINGLE 'heu là je suis pas sûr, il faut peut être faire CSingle(400) As Single, du fait que 400 est une constante non typée.
'Print sTs
END IF
END


;) Flachy Joe ;)
Flachy Joe#18 Posté le 21/1/2013 à 21:01:04
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSi tu as vraiment besoin d'entrer les données sous la forme de série d'octet, voila comment faire la conversion :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FUNCTION LongToIEEE754 (x AS LONG) AS SINGLE

DIM p AS POINTER
DIM memp AS Stream
DIM l AS SINGLE

p = Alloc(4)
memp = MEMORY p FOR WRITE
memp.byteorder = gb.LittleEndian
WRITE #memp, x AS LONG
SEEK #memp, 0
memp.byteorder = gb.BigEndian
l = READ #memp AS SINGLE
RETURN l
END FUNCTION

DEBUG LongToIEEE754(&hC843&)
;) Flachy Joe ;)
Totof#19 Posté le 21/1/2013 à 22:00:44
Ce qui est pris n'est plus a prendreBonsoir

Mille sabords , vous êtes vraiment fort , chapeau bas :cheers:

J'essaye les 2 propositions de suite et je vous tiens au courant :alien:

A tout de suite
Flachy Joe#20 Posté le 21/1/2013 à 22:05:43
Iguane : Il Gambas Uniquement pour Activer ses NEuronesMa réponse #17 ne fonctionne pas, dans l'un des formats comme dans l'autre : il faut passer par une variable
1
2
3
DIM x AS SINGLE
x= 400
WRITE #Sport, x AS SINGLE
;) Flachy Joe ;)
Totof#21 Posté le 21/1/2013 à 23:48:09
Ce qui est pris n'est plus a prendreRe-bonsoir

Pas concluant dans l'immédiat, mais la nuit porte conseil alors je vais un peu réfléchir

Le post 17 avec la modif x=400 m'allume les bonnes led , par contre je doit appuyer sur envoi
soit bouton2_click() plusieur fois ( 5 au total ), j'ai pas encore vérifier si c'était pour
toutes les commandes ( valeur de cmde variable , un float )

bonne nuit et on en reparle


Totof#22 Posté le 26/1/2013 à 13:03:20
Ce qui est pris n'est plus a prendreBonjour

Suite à une refonte du programme du µc , maintenant je peut envoyer un n° de commande
et la valeur de cette commande sous forme de chaîne

sous la forme de

2
300
3
250
4
7
6
5.1
7
10.0

après chaque nombre entré je fait "entrée" ou sous Gambas un "\n" pour avoir un LF line end

etc , le prog décode ma chaine de caractère avec comme marqueur du point décimal le "."
la routine est basée pour interprétée un nombre avec 3 chiffres après le point

Avec Cutecom ça fonctionne nickel , donc j'ai commencé à implanter sous Gambas
pour envoyer le n° de cde et réceptionner le retour du µc
aucun soucis , par contre pour la valeur , pour 400 le µc
me renvoie 40
Un petit détail à résoudre :oops:
Je posterai un exemple de mes résultats cet après midi

ensuite la gestion de la communication avec le µc est une question de gestion
des chaînes de caractères (string) et gestion des fichiers

On avance en tout cas :alien:

Bon appétit

Totof#23 Posté le 26/1/2013 à 21:41:38
Ce qui est pris n'est plus a prendreBonsoir

Ci joint 2 captures, la première c'est au lancement du prog sous Gambas
quand j'ouvre le port com le prog lit le fichier List_cmde.txt et envoie les chaîne vers l'Atmega32
l'Atmega répond par le courant d'anode
les communication sont listée dans une listbox
Tout semble fonctionné ci-joint un bout de code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUBLIC SUB Init_hardware()

DIM hFile AS File
DIM sC AS STRING
DIM sLine, sSend AS STRING
DIM S AS String[]
hFile = OPEN "liste_cmde.txt" FOR INPUT
WHILE NOT Eof(hFile)
LINE INPUT #hFile, sLine
ListBox1.Add(sLine)
S = Split(sLine, "\n")
FOR EACH sSend IN S
sC = sSend & "\n"
'Print sSend
WRITE #Sport, sC
WAIT 0.01
NEXT
WEND

END


la deuxième capture en rentrant les 3 dernières commandes séparément
on remarque de suite que 300 devient 30 et -12 devient -1

Voilà pour l'avancement

Une idée du pourquoi du rabotage :?:


Bonne soirée
Totof#24 Posté le 26/1/2013 à 22:49:18
Ce qui est pris n'est plus a prendreRe bonsoir

j'ai trouvé pour envoyer les commandes en individuel , une petite temporisation ( idée qui m'est revenu en relisant les post de ce forum )
le bout de code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PUBLIC SUB Button2_Click()

DIM Y AS STRING
DIM X AS STRING
DIM Z AS SINGLE

IF Sport.Status = Net.Inactive THEN
Message("Open port first!")
ELSE
Y = Ncmde.Text & "\n"
X = Vcmde.Text & "\n"


WRITE #Sport, Y
WAIT 0.01
WRITE #Sport, X
'Print Y
'Print X
END IF

END

Si ça peut aider quelqu'un qui voudrait faire une interface µc :oops:
et le résultat sous Gambas
Totof#25 Posté le 26/1/2013 à 22:50:14
Ce qui est pris n'est plus a prendre
12