envoie d'un octet / chiffre sur bus rs232

envoie d'un octet / chiffre sur bus rs232 - C - Programmation

Marsh Posté le 23-04-2005 à 10:32:34    

Bonjour,
 
       Je programme en c et j'ai un doute, je programme un microcontrolleur pic, et j'aimerai qu'il envoie ou qu'il recoive sur la liaison serie des nombres... par exemple 12 etc... ou bien carement des octets sous forme hexa...
QUel instruction utiliser? putc? puts? je ne vois pas comment envoyer le chiffre 2510 par exemple....
merci pour vos reponses...


---------------
"Il faudrait construire des asiles de cons, mais vous imaginez la taille des batiments.." - André Dussolier, (Tais-Toi !!!)
Reply

Marsh Posté le 23-04-2005 à 10:32:34   

Reply

Marsh Posté le 23-04-2005 à 10:55:49    

aceditnanar a écrit :

ou bien carement des octets sous forme hexa...


Un octet c'est un octet; c'est à dire un nombre pouvant aller de 0 à 255. Il ne prend sa forme "hexa" qu'au moment où tu l'affiches à l'écran quand tu mets "%x" dans "printf".
 

aceditnanar a écrit :

putc? puts? je ne vois pas comment envoyer le chiffre 2510 par exemple....


Les fonctions "put" ont pour but d'aller écrire des choses à l'écran. Ces choses peuvent être
- un caractère codé sur un octet => putc(65) => La fonction récupère la valeur "65" et l'affiche à l'écran le caractère ascii correspondant; à savoir 'A'. Mais tu auras le même résultat si tu écris "putc(0x41)" ou, plus simplement "putc('A')"
- une chaîne de caractères, chaque caractère codé sur un octet mais dont le dernier vaut 0 (pas le caractère '0' mais la valeur 0; représentée aussi sous la forme '\0') => puts(122) => La fonction récupère la valeur "122", va voir à l'adresse "122" le caractère qui s'y trouve, si sa valeur ne vaut pas 0 l'affiche, passe à l'adresse 123, vérifie la valeur du caractère, l'affiche, passe à l'adresse 124, etc. Cela signifie que l'adresse "122" correspond bien à l'adresse d'une chaîne de caractères et c'est à toi de t'en assurer.
Ces deux fonctions écrivent à l'écran, pas sur un port série.
 

aceditnanar a écrit :

je ne vois pas comment envoyer le chiffre 2510 par exemple....


Pour un périphérique comme un port série, à mon avis tu dois utiliser "write" et "read"
Par exemple pour envoyer 2150

int i=2150;
write(x, &i, sizeof(i));


 
Et pour lire de l'autre coté la valeur 2150:

int i;
read(y, &i, sizeof(i));


 
Les valeurs "x" et "y" représentant le port série de ton système. Toute la difficulté sera, en fait, de trouver les bonnes valeurs correspondantes à "x" et "y"


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-04-2005 à 11:22:31    

Sve@r a écrit :

Les valeurs "x" et "y" représentant le port série de ton système. Toute la difficulté sera, en fait, de trouver les bonnes valeurs correspondantes à "x" et "y"


 
Ben ouvrir avec fopen, obtenir un pointeur sur un FILE, et récupérer le descripteur. Ou mieux, utiliser fread et fwrite au lieu des fonctions non standard au C que sont read et write.
 
je part du postulat que sous UNIX, tout est fichier :)
Si c'est sous un autre système, je passe ...

Reply

Marsh Posté le 23-04-2005 à 11:59:44    

je suis sous CCS pour programmer des pic 16f777... il existe que quelques instructions qui sont :  
RS232 I/O:
 
getc()
putc()  
gets()  
puts()  
printf()  
kbhit()  
set_uart_speed()  
 
Donc avec ca... je pensais faire un espece de puts(2510) mais je ne sais pas si il m'envoie le chiffre 2510...
mais dc si je vous suis bien, si je doit envyer un chiffre entre 0 et 255 je peut utiliser getc.
faut savoir que printf,getc etc... balancent l'info sur le port serie du µC et non a l'ecran (sortie par defaut du materiel)
merci pour vos explications.


---------------
"Il faudrait construire des asiles de cons, mais vous imaginez la taille des batiments.." - André Dussolier, (Tais-Toi !!!)
Reply

Marsh Posté le 23-04-2005 à 12:23:29    

aceditnanar a écrit :

Je programme en c et j'ai un doute, je programme un microcontrolleur PIC, et j'aimerai qu'il envoie ou qu'il recoive sur la liaison serie des nombres... par exemple 12 etc... ou bien carement des octets sous forme hexa...
Quel instruction utiliser? putc? puts? je ne vois pas comment envoyer le chiffre 2510 par exemple....


Hum, c'est un nombre...
 
[rien à voir avec le langage C...]
 
Un port série asynchrone transporte des caractères d'une largeur de 5 à 8 bits selon la configuration. En admettant que ton port est reglé en 8 bits, un problème se pose pour transporter des données dont la valeur est > 255.
 
Il y a plusieurs solutions qui dépendent des performances et du degré de portablilité requis...

  • image binaire : direct, efficace, non portable, peu recommandé
  • format binaire standard (BER, XDR) : compliqué, efficace, portable. Indispensable si le protocole l'exige (RPC, SNMP etc.)
  • format texte : simple, pas très efficace, recommandé pour les applications simples.

Plus la base utilisée est élevée (10, 16, voire 64), meilleure est l'efficacité.
 
Pour en revenir au C, si ton port série est relié à stdout (ce qui est probable), il suffit d'utiliser les fontions fputc() (caractère), fputs()/fprintf() (texte) ou fwrite() (binaire) qui vont bien...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-04-2005 à 13:17:13    

par exemple, si je doit envoyer a l'ordinateur la valeur 1023 qui est le resultat de la valeur sur un de mes ports ADC du pic... puis-je ecrire  
i=1023;
printf("%d",i);
il va m'envoyer 4 octets representant 1, 0 ,2, et 3
ou vas t-il faire autrement???


---------------
"Il faudrait construire des asiles de cons, mais vous imaginez la taille des batiments.." - André Dussolier, (Tais-Toi !!!)
Reply

Marsh Posté le 23-04-2005 à 13:30:49    

aceditnanar a écrit :

par exemple, si je doit envoyer a l'ordinateur la valeur 1023 qui est le resultat de la valeur sur un de mes ports ADC du pic... puis-je ecrire  
i=1023;
printf("%d",i);
il va m'envoyer 4 octets representant 1, 0 ,2, et 3


Exactement !
Il va envoyer sur la sortie de "printf" les 4 valeurs suivantes: 49, 48, 50 et 51 qui se traduisent généralement à l'écran par les caractères ascii '1', '0', '2' et '3'


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-04-2005 à 13:36:27    

aceditnanar a écrit :

par exemple, si je doit envoyer a l'ordinateur la valeur 1023 qui est le resultat de la valeur sur un de mes ports ADC du pic... puis-je ecrire  
i=1023;
printf("%d",i);
il va m'envoyer 4 octets representant 1, 0 ,2, et 3
ou vas t-il faire autrement???


Il va sortir les caractères '1', '0', '2' et '3' c'est à dire les octets 0x31, 0x30, 0x32 et 0x33 (en supposant que le codage des caractères est conforme à l'ASCII) dans ce ordre.
 
Si tu avais fait

printf("%X",i);


il aurait sorti les caractères '3','F' et 'F', soit les octets 0x33, 0x46 et 0x46 dans ce ordre.
 
Enfin si tu avais fait  

fwrite (&i, sizeof i, 1, stdout);


selon le machine, il aurait sorti au choix :  


0x03 0xFF
0xFF 0x03  
0x00 0x00 0x03 0xFF
0xFF 0x03 0x00 0x00
etc.


Comme je l'ai expliqué, c'est simple mais pas portable...


Message édité par Emmanuel Delahaye le 23-04-2005 à 13:38:36

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-04-2005 à 16:07:12    

j'ai pas la fonction fwrite.. dc la question ne se pose pas...
je pense apres pour traduire le chiffre transmit, faire une instruction ascii to int.  ... et j'aurais ss doute mon nombre...
merci a vous...


---------------
"Il faudrait construire des asiles de cons, mais vous imaginez la taille des batiments.." - André Dussolier, (Tais-Toi !!!)
Reply

Marsh Posté le 23-04-2005 à 18:35:43    

voila un petit script qi resume se que je vais faire... si c'a peut en aider certain dans un futur proche sur le forum...
#include <stdio.h>
#include <string.h>
 
 
 
main()
{
 char chiffre[10];
 int x;
 
 
 strcpy(chiffre,"1023" );   /// met les 4 caracteres ascii dans la chaine (ceux recu sur le pic)
 
 x=atol(chiffre); // conv 16bit en chiffre
 x+=x;           // operation math pour verifier
 printf("%d",x);  // on verifie si conversion ok
 getch();          
}
 
voila... merci a ceux qui m'on repondu...


---------------
"Il faudrait construire des asiles de cons, mais vous imaginez la taille des batiments.." - André Dussolier, (Tais-Toi !!!)
Reply

Marsh Posté le 23-04-2005 à 18:35:43   

Reply

Marsh Posté le 23-04-2005 à 20:32:22    

aceditnanar a écrit :

voila un petit script qi resume se que je vais faire... si c'a peut en aider certain dans un futur proche sur le forum...


En C, on ne dit pas 'script', mais '[code ]source' ou 'programme'...

Citation :



#include <stdio.h>
#include <string.h>
 
main()
{
 char chiffre[10];
 int x;
 
 strcpy(chiffre,"1023" );   /// met les 4 caracteres ascii dans la chaine (ceux recu sur le pic)
 
 x=atol(chiffre); // conv 16bit en chiffre
 x+=x;           // operation math pour verifier
 printf("%d",x);  // on verifie si conversion ok
 getch();          
}


voila... merci a ceux qui m'on repondu...


Il faut que tu apprennes à faire la différence entre un chiffre (caractère '0' à '9' en décimal) et un nombre qui est une valeur numérique formée d'au moins un chiffre...)
 
Sinon, je ne vois pas bien pourquoi additionner le nombre à lui même vérifie quoique ce soit, à part que les bits ne sont pas restés collés...)
 
getch() nest pas standard, et pour être sûr que les caractères sortent sur toutes les plateformes, il faut terminer sa chaine avec un '\n' ou forcer avec fflush(stdout).
 
Enfin, je rappelle qu'une chaine est un tableau de char terminé par un 0. Pour simuler ce que fait le PIC, il faut plutôt faire faire ça:


#include <stdio.h>
#include <string.h>
 
int main (void)
{
   char chaine[10];
   int x;
 
   /* Simulation de la reception par le port serie */
   chaine[0] = '1';
   chaine[1] = '0';
   chaine[2] = '2';
   chaine[3] = '3';
 
   /* "a la main" */
   chaine[4] = 0;
 
   /* conversion de la chaine en valeur */
   x = atoi (chaine);
 
/* on verifie si conversion ok */
   if (x == 1023)
   {
      printf ("recu %d : OK\n", x);
   }
 
   return 0;
}


Message édité par Emmanuel Delahaye le 23-04-2005 à 20:33:57

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-04-2005 à 22:43:34    

aceditnanar a écrit :


Code :
  1. x+=x;           // operation math pour verifier




 
Je présume que t'as voulu ici être certain que "x" contient bien un nombre
Ben, en C, toutes les variables ne contiennent que du nombre; comme on te l'a déjà dit plusieurs fois de différentes manières. Même une variable déclarée "char carac='A';" contient un nombre valant "code ascii de 'A'" ou "65"
 
T'as tout à fait le droit d'écrire "carac+=carac". Cette instruction mettra simplement la valeur "130" dans carac; sans se préoccuper de la façon dont tu utilises "carac"...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 24-04-2005 à 00:30:22    

je sais je sais...
x avait une valeur comme tu peux le voir ds le prog : x+=x vaut x=x+x, juste savoir si c'etait bien convertit (prg test vx bien dire se que ca veux dire)
en ce qui concerne le getch(), c'est pour eviter que ma console dos se ferme a la fin sans que je puisse voire le resultat... quand a l'addition du bit, c'est pour verifier que mon nombre etait bien traduit en valeur decimal tout simplement...
et le code je l'ai tapé en 30 secondes.. alors g pas forcement detaillé chaque valeur du tableau mais ca revenais au meme de tte facon... et je sais que un caractere est un type de donné codé sous 8bit; soit 255 en decimal ou alors ff en hexa... et que mon atol est different de atoi pour avoir justement une conversion sur une valeur superieur à 8bits (16bits)voila j'espere avoir ete plus clair... sur la soluce que j'ai trouvé... sans me compliquer la vie...
 
ps : j'ai dit script ar se que j'etait pressé et avais pas reflechi... c tout...


Message édité par aceditnanar le 24-04-2005 à 00:31:02

---------------
"Il faudrait construire des asiles de cons, mais vous imaginez la taille des batiments.." - André Dussolier, (Tais-Toi !!!)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed