j4k | 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 :
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <termios.h>
- #include <string.h>
- #include <errno.h>
- #include "adrport.h"
- static int fd = 0;
- // opens the serial port
- // return code:
- // > 0 = fd for the port
- // -1 = open failed
- int OpenAdrPort(char* sPortNumber)
- {
- char sPortName[64];
- printf("in OpenAdrPort port#=%s\n", sPortNumber);
- sprintf(sPortName, "/dev/tty.usbserial-191" );
- printf("ouverture de : %s\n", sPortName);
- // make sure port is closed
- CloseAdrPort(fd);
- fd = open(sPortName, O_RDWR | O_NDELAY);
- if (fd < 0)
- {
- printf("open error %d %s\n", errno, strerror(errno));
- }
- else
- {
- struct termios my_termios;
- printf("fd is %d\n", fd);
- tcgetattr(fd, &my_termios);
- tcflush(fd, TCIFLUSH);
- /*
- * Set the baud rates to 9600...
- */
- cfsetospeed(&my_termios, B9600);
- /*
- * Enable the receiver and set local mode...
- */
- my_termios.c_cflag |= ( B9600 | CS8 | CLOCAL );
- /*
- * Set the new options for the port...
- */
- tcsetattr(fd, TCSANOW, &my_termios);
- cfsetospeed(&my_termios, B9600);
- } // end if
- return fd;
- } // end OpenAdrPort
- // writes zero terminated string to the serial port
- // return code:
- // >= 0 = number of characters written
- // -1 = write failed
- int WriteAdrPort(char* psOutput)
- {
- int iOut;
- if (fd < 1)
- {
- printf(" port is not open\n" );
- return -1;
- } // end if
- iOut = write(fd, psOutput, strlen(psOutput));
- //printf("read %d chars: %s\n", iOut, psOutput);
- if (iOut < 0)
- {
- printf("write error %d %s\n", errno, strerror(errno));
- }
- else
- {
- printf("wrote %d chars: %s\n", iOut, psOutput);
- } // end if
- return iOut;
- } // end WriteAdrPort
- // closes the serial port
- void CloseAdrPort()
- {
- // you may want to restore the saved port attributes
- if (fd > 0)
- {
- close(fd);
- } // end if
- } // 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
|