communication rs232 sur macOSX

communication rs232 sur macOSX - C - Programmation

Marsh Posté le 02-06-2005 à 12:00:16    

bonjour,
 
je souhaite envoyer une valeur binaire sur 1 octet (10101010 par ex) sur un port rs232 (émulé) sur macOSX
 
j'ai trouvé des sources pour linux qui fonctionnent mais qui ne m'envoient pas les données correctement à priori...
 
voici le source que j'ai modifié afin de passer la valeur à envoyer lors de l'appel (je lance mon appli par la console en faisant : /mon_chemin/vers/RSConnexTX 10101010)
 

Code :
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <termios.h>
  7. #include <string.h>
  8. #include <errno.h>
  9. #include "adrport.h"
  10. static int fd = 0;
  11. // opens the serial port
  12. // return code:
  13. //   > 0 = fd for the port
  14. //   -1 = open failed
  15. int OpenAdrPort(char* sPortNumber)
  16. {
  17.     char sPortName[64];
  18.     printf("in OpenAdrPort port#=%s\n", sPortNumber);
  19. sprintf(sPortName, "/dev/tty.usbserial-191" );
  20.     printf("ouverture de : %s\n", sPortName);
  21.     // make sure port is closed
  22.     CloseAdrPort(fd);
  23.     fd = open(sPortName, O_RDWR | O_NDELAY);
  24.     if (fd < 0)
  25.     {
  26.         printf("open error %d %s\n", errno, strerror(errno));
  27.     }
  28.     else
  29.     {
  30.         struct termios my_termios;
  31.         printf("fd is %d\n", fd);
  32.         tcgetattr(fd, &my_termios);
  33.         tcflush(fd, TCIFLUSH);
  34.  /*
  35.  * Set the baud rates to 9600...
  36.  */
  37.  cfsetospeed(&my_termios, B9600);
  38.  /*
  39.  * Enable the receiver and set local mode...
  40.  */
  41.  my_termios.c_cflag |= ( B9600 | CS8 | CLOCAL );
  42.  /*
  43.  * Set the new options for the port...
  44.  */
  45.  tcsetattr(fd, TCSANOW, &my_termios);
  46.         cfsetospeed(&my_termios, B9600);     
  47.     } // end if
  48.     return fd;
  49. } // end OpenAdrPort
  50. // writes zero terminated string to the serial port
  51. // return code:
  52. //   >= 0 = number of characters written
  53. //   -1 = write failed
  54. int WriteAdrPort(char* psOutput)
  55. {
  56.     int iOut;
  57.     if (fd < 1)
  58.     {
  59.         printf(" port is not open\n" );     
  60.  return -1;
  61.     } // end if
  62.     iOut = write(fd, psOutput, strlen(psOutput));
  63. //printf("read %d chars: %s\n", iOut, psOutput);
  64.     if (iOut < 0)
  65.     {
  66.         printf("write error %d %s\n", errno, strerror(errno));
  67.     }
  68.     else
  69.     {
  70.         printf("wrote %d chars: %s\n", iOut, psOutput);
  71.     } // end if
  72.     return iOut;
  73. } // end WriteAdrPort
  74. // closes the serial port
  75. void CloseAdrPort()
  76. {
  77.         // you may want to restore the saved port attributes
  78.     if (fd > 0)
  79.     {
  80.         close(fd);
  81.     } // end if
  82. } // end CloseAdrPort


 
L'ouverture du port se passe sans erreur, l'envoi des données se passe sans erreurs, la fermeture du port également.  
Tout semble ok, ce qui ne marche pas correctement c'est que le write n'envoi pas ce que je lui demande, lorsque j'envoi 01010101 je souhaite voir mes led s'allumer de la même manière.
lorsque je lance mon appli avec les paramètre, les leds s'allument correctement, mais pas du tout dans le bon ordre. Quel que soit le binaire envoyé, le résultat est le même : une série de leds s'allume mais sans pouvoir maitriser pourquoi qui comment..
 
le montage electronique est basé sur un ft245am et fonctionne correctement sous windows.
 
je pense que le problème se situe au niveau de la déclaration de la variable que j'envoie, ou du bit de parité, et des différents paramètres associé. Mes connaissances en c sont réduites (et anciennes) et les différents tests que j'ai effectués ne m'ont pas fait avancés.
 
J'ai trouvé de nombreux codes sources (unix) compatibles osX, mais TOUS me causent le même problème : j'ouvre la connexion sans problème, j'écris et je ferme....mais je ne maitrise pas les données envoyées à mon modules.  
 
si vous avez des idées
 

Reply

Marsh Posté le 02-06-2005 à 12:00:16   

Reply

Marsh Posté le 03-06-2005 à 11:00:36    

je rajoute ce lien qui m'a beaucoup servi : le howto linux rs232. tout y est limpide et simple.... mais mon problème persiste....
 
http://www.scs.carleton.ca/~barbea [...] serial.txt

Reply

Sujets relatifs:

Leave a Replay

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