Communication entre un microcontroleur et un port RS232

Communication entre un microcontroleur et un port RS232 - C - Programmation

Marsh Posté le 18-03-2011 à 14:24:37    

Bonjour à tous
 
Je voudrais communiquer avec un programme en C sous linux avec un micro-controleur. J'ai des trames en Hexa à lui envoyer sur le port RS232 et le micro-controleur doit me répondre après. Je veux donc ouvrir le port série, envoyer des trames en hexa, en recevoir après en hexa et refermer le port.
 
J'ai jamais interrogé un port RS232 en C. J'ai regaré comment faire et il semble possible de le faire avec fopen(), fprintf() etc... mais j'ai également trouvé une librairie RS-232 for Linux and WIN32. Vous me conseilliez de partir sur une librairie ou d'utiliser fopen(), fprintf() etc...?

Reply

Marsh Posté le 18-03-2011 à 14:24:37   

Reply

Marsh Posté le 18-03-2011 à 17:28:45    

C'est quoi pour un micro?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 18-03-2011 à 19:37:27    

Comment ça c'est quoi pour un mirco?
 
Je viens de faire des tests avec ce bout de programme :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <termios.h>
  7. int main(void)
  8. {
  9. int port_serie;
  10. struct termios options;
  11. int donnee = 0;
  12. int *pointeur = &donnee;
  13. port_serie = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
  14. if(port_serie < 0)
  15. {
  16.  perror("Port serie ouvert" );
  17.  exit(-1);
  18. }
  19. else
  20. {
  21.  printf("Port serie bien ouvert. \n" );
  22.  fcntl(port_serie,F_SETFL,0);
  23.  tcgetattr(port_serie, &options);
  24.  cfsetospeed(&options, B9600);
  25.  options.c_cflag |= (CLOCAL | CREAD);
  26.  options.c_cflag &= ~PARENB;
  27.  options.c_cflag &= ~CSTOPB;
  28.  options.c_cflag &= ~CSIZE;
  29.  options.c_cflag |= CS8;
  30.  tcsetattr(port_serie, TCSANOW, &options);
  31.  printf("Configuration OK !. \n" );
  32.  printf("Envoie de donnee en cours ... \n" );
  33.  if (write(port_serie, "salut", 5) < 0){perror("write:" );}
  34.  //if(read(port_serie, pointeur, 100) < 0) {perror("read" );}
  35.  printf("Envoie termine. \n" );
  36. }
  37. close(port_serie);
  38. }


 
Pour faire mes tests j'ai connecté un PC linux avec un pc xp où j'ai lancé l'hyperterminal. Je reçois bien dans l'hyperteminal "salut" mais je n'arrive pas à recevoir de donné quand je commente la ligne "write" et décommente la ligne "read". Avez vous une idée? Merci

Reply

Marsh Posté le 23-03-2011 à 15:55:24    

Citation :

O_NONBLOCK ou O_NDELAY
              Le fichier est ouvert en mode "non-bloquant". Ni la
              fonction open ni aucune autre opération  ultérieure
              sur ce fichier ne laissera le processus appelant en
              attente.


 
Ta lecture est non bloquante. Si tu recois les données avant d'avoir ouvert le port ou après avoir fait l'appel à read, tu ne recevras rien.

Reply

Sujets relatifs:

Leave a Replay

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