Gambas France BETA


Pas de compte ? Incription

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

12
AuteurMessages
Totof#1 Posté le 18/1/2013 à 10:28:23
Ce qui est pris n'est plus a prendreBonjour et meilleurs voeux a tous

Je me présente , mon surnom est Totof
légèrement autodidacte et passionné de "DIY à lampes", je me suis mis
a Gambas pour mon plaisir personnel et mon projet DIY 2013
Après avoir parcouru pas mal le forum et d'autres sources , je suis bloqué
je n'ai pas trouvé de quoi me dépatouiller tout seul, d'ou cet appel à l'aide

L'objet:

je voudrais créer une IHM qui pilote un µc Atmega32L via le port RS232

l'ouverture du port et la réception de trame venant du µc est opérationelle

je bloque en envoyant au µc des trames composées comme ceci
n° de commande = x
valeur de commande = y

exemple
n° de cde = 1 (en Hex)
valeur de cde = 400 (en Hex)

sous Cutecom mon µc répond correctement
la trame est 01 00 00 c8 43 ou 010000c843, ce qui m'allume une led de contrôle

Ma question, sous Gambas j'utilise le code suivant

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, sTs '& Chr(13) & Chr(10)
'Print sTs
END IF

END


je bloque dans la manière de créer la trame pour obtenir sTs = 010000c843

j'ai essyé sTs = Hex$(x) & Hex$(y) ou les autres formes de la page d'aide de l'IDE
mais sans succès
la page dont je parle est celle-ci http://www.gambasdoc.org/help/lang/hex?fr&v3

Est ce un soucis de déclaration de variable en créant sTs
Est ce un soucis de déclaration de variable dans la routine Button2_click() :?:
Une mauvaise utilisation de Write :?:

Merci de vos réponses
Et a très bientôt
Flachy Joe#2 Posté le 19/1/2013 à 20:06:48
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSalut,
es-tu sûr qu'il faille l'envoyer en texte ? j'aurai plutôt fait :
1
2
3
4
5
6
7
DIM x AS LONG, y AS LONG, cmd AS LONG
x = &h01
y = &h00c843
cmd = (x * CLong(&h100000000)) + y
DEBUG Hex$(cmd) 'renvoi bien 10000C843

WRITE #Sport, cmd 'envoi en Long et pas en texte


;) Flachy Joe ;)
Totof#3 Posté le 19/1/2013 à 21:27:27
Ce qui est pris n'est plus a prendreBonsoir

Merci de ta réponse

En fait je doit envoyer un n°de commande et une valeur de commande via le port RS232

J'espère ne pas déborder du cadre de ce forum , si oui je m'en excuse d'avance

On a actuellement une moulinette en C qui communique avec le µc
ce dernier embarque un programme écrit en C lui aussi , la moulinette envoi
est ces lignes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int envoi_cmde(int fd,int cmde,float v)
{
unsigned char rec;

//printf("envoi de la commande %d\n",cmde);

//envoi du numero de commande
rs232_tx_8(fd,cmde);

//envoi du float associe
rs232_tx_32(fd,v);

//recup du code retour
rs232_rx_8(fd,&rec);

//printf("code retour %d\n",rec);

RETURN rec;
}


Donc en fait après réflexion , je devrait envoyer un integer et un single au µc

le bout de code qui réceptionne la commande dans le µc est le suivant
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//-------------------------------------------------------------------------------------
//reception d'un message en provenance de la liaison RS232
//-------------------------------------------------------------------------------------
ISR(USART_RXC_vect)
{
unsigned char cmde; //commande recue
float valeur; //valeur recue

//reception du mot de commande
cmde=rs232_rx_8();

//la cmde est elle dans le dictionnaire PRINT
// si non, on fait pointer sur une commande "nulle" qui ne fait rien
IF (cmde>ncom)
{
cmde=0;
}

IF (cmde<0)
{
cmde=0;
}

//reception du flottant
valeur=rs232_rx_32();


//appel de la routine pointée par la commande
pf[cmde](valeur);
}
//-------------------------------------------------------------------------------------
Totof#4 Posté le 19/1/2013 à 21:28:28
Ce qui est pris n'est plus a prendreVoilà si ça peut aider à trouver ou je bloque

Merci de vos idées :alien:
Flachy Joe#5 Posté le 20/1/2013 à 12:31:21
Iguane : Il Gambas Uniquement pour Activer ses NEuronesOups, ce que j'ai indiqué avant fonctionnait en Gambas 2, ça détectait automatiquement le type de données
1
2
3
4
5
DIM numero AS INTEGER, valeur AS SINGLE
numero = &h01
valeur = &h0c843
WRITE #Sport, numero 'envoi 2 octets
WRITE #Sport, valeur 'envoi 4 octets


En Gambas 3, il faut utiliser un typage explicite :
1
2
WRITE #Sport, numero AS INTEGER
WRITE #Sport, valeur AS SINGLE


Références : http://gambasdoc.org/help/lang/write?fr&v3 et http://gambasdoc.org/help/lang/write?fr&v2
;) Flachy Joe ;)
Totof#6 Posté le 20/1/2013 à 12:52:45
Ce qui est pris n'est plus a prendreBonjour

Merci pour la réponse, je décortique cela et fait mes essais
je vous tiens au courant du résultat :lol:
a+
Totof#7 Posté le 20/1/2013 à 18:47:44
Ce qui est pris n'est plus a prendreBonsoir

Pour Flachy joe, ta solution fonctionne en effet

Soit je trouve le moyen de générer les &h01 et &h0c843 au départ de le valeur numérique
soit il nous faudra modifier l'envoi et la réception au niveau µc

En fait le µc réceptionne octet par octet donc
si je prend par exemple 400, les 4 octets envoyés son 0 0 c8 43, d'ou le &h0c843
mon soucis comment passer de 400 à &h0c843 de manière simple
En lisant la doc , je suis tombé sur les histoire de pointeur mais , honnêtement
j'arrive pas a me servir des exemples et à les comprendres :pale: :oops:

Aurais tu une idée :?:

merci de ta réponse
Flachy Joe#8 Posté le 20/1/2013 à 19:37:02
Iguane : Il Gambas Uniquement pour Activer ses NEuronesJe vois pas trop comment tu passes de 400 à &h0c843 car C843(base 16) = 51267(base 10) et 400(base 10) = 190(base 16).
Tu as peut être une liste de commandes numérotées avec une correspondance avec le code à envoyer ?

Sinon que tu fournisse à Gambas le nombre en hexa ou en décimal ne change rien...
;) Flachy Joe ;)
Flachy Joe#9 Posté le 20/1/2013 à 19:46:04
Iguane : Il Gambas Uniquement pour Activer ses NEuronesJe réalise en te relisant, en fait le &hc843 est le retour de ton µC, c'est bien 400 que tu lui envoi !

donc il te faut un Read quelque part pour recupérer le code de retour, et là tu pourra l'analyser et tu trouveras sans doute ton &hc843...
;) Flachy Joe ;)
Totof#10 Posté le 20/1/2013 à 20:01:25
Ce qui est pris n'est plus a prendreRe-bonsoir

Non c'est bien la commande envoyée au µc, en fait c'est une routine en C que j'ai posté plus haut
et c'est la lecture des 4 adresses du float en C

Mais, on a refait une routine qui réceptionne et renvoie une trame texte , pour contourner le soucis
je la testerai ce soir , j'attends la réception du programme et fichier .hex modifié pour charger dans le µc

Donc le nombre 400 est transformé par le programme en C en adrss = 0 adrss+1 = 0 adrss+2 = c8 adrss+3 = 43

Si on pouvait faire cela directement sous Gambas cela soulagerait le programme dans le µc :oops:

To be continued

Bon appétit
Totof#11 Posté le 20/1/2013 à 20:06:16
Ce qui est pris n'est plus a prendreOups

En relisant la doc de Gambas sur les integer
on y trouve pour un entier positif une écriture 0000c000
Je pense que c'est la même représentation , mais j'arrive pas non plus a passer de
l'une a l'autre
mais essais précédents avec Hex$ etc mon aussi donné 51267 et 190
et pas le 0000c843 attendu :oops: :oops:

voir ici

A+
Flachy Joe#12 Posté le 20/1/2013 à 20:50:09
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSi tu te réfères à cette page : http://gambasdoc.org/help/lang/type/integer?fr&v3 la valeur hexa &hc000 n'est qu'un exemple.
Par contre ça met un autre truc en valeur : il faut terminer tes constantes hexa par un & sinon les octets hauts sont mis à F. Donc valeur = &hC843&

Est ce que tu peux me filer le code qui te renvoi le &hC843& ?
;) Flachy Joe ;)
Totof#13 Posté le 20/1/2013 à 20:57:31
Ce qui est pris n'est plus a prendreRe


oui, Après manger , j'y bais là
c'est sur mon PC et là je suis sur mon portable

A+
Totof#14 Posté le 20/1/2013 à 21:48:02
Ce qui est pris n'est plus a prendreBonsoir

Voici le bout de code en C qui édite les octets

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//-----------------------------------------------------------------------
//envoi d'une commande
//-----------------------------------------------------------------------
int envoi_cmde(int fd,int cmde,float v)
{
unsigned char rec;
unsigned char *addr;

//pour avoir une copie des octets envoyés

addr=(unsigned char*)&v;
fprintf(flog,"commande %d valeur %f [%x] [%x %x %x %x]\n",cmde,v,cmde,*addr,*(addr+1),*(addr+2),*(addr+3));

IF (1==2)
{
printf("\ncommande %d valeur %f\n",cmde,v);
printf("codage de la commande (en hex) %x\n",cmde);
printf("codage de la valeur (en hex) %x %x %x %x\n",*addr,*(addr+1),*(addr+2),*(addr+3));

//getchar();
}

//printf("envoi de la commande %d\n",cmde);

//envoi du numero de commande
rs232_tx_8(fd,cmde);

//envoi du float associe
rs232_tx_32(fd,v);

//recup du code retour
rs232_rx_8(fd,&rec);

fprintf(flog,"retour du µC %d [%x]\n"rec,rec);

//printf("code retour %d\n",rec);


RETURN rec;
}


Si ça peut aider

Bonne soirée
Reivillo#15 Posté le 21/1/2013 à 19:46:11
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Bonsoir Totof.

Si c'est la conversion,
Décimal > Hexadécimal

1
2
3
DIM deci AS INTEGER = 51267
DIM hexa AS STRING = Hex$(deci, 8)
PRINT "deci: " & deci;; "hexa: " & hexa


Reivillo.

Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
12