Bonjour à tous! Voilà, je viens vous voir car j'ai un petit soucis qui commence à être franchement agaçant à la longue. J'essaie de faire un petit programme pour envoyer et recevoir des données sur un port série (j'utilise un adaptateur USB-Série à base de PL2303) afin de communiquer avec une carte électronique que je réalise.
J'ai trouvé un exemple de code en C sur internet qui montre comment ouvrir un port série, lire et envoyer des données puis le fermer donc je l'ai récupéré, j'ai fait des petites modifs pour que ça fasse ce dont j'ai envie et jusque là ça va. J'arrive à lire des données sans problèmes, j'arrive à en envoyer aussi mais très souvent, quand c'est pour de l'envoi, le programme n'arrive pas à fermer le port et il devient donc inutilisable. J'ai beau débrancher puis rebrancher l'adaptateur, rien n'y change. Et même une fois déconnecté, si je fais dans le terminal "ls /dev/tty.*" ou "ls /dev/cu.*" il est encore présent et la seule solution que j'ai trouvé c'est de redémarrer le Mac... (et même la plupart du temps mon macbook n'arrive pas à s'éteindre et je suis obligé de le forcer en restant appuyer sur le bouton power).
Je sais pas si c'est mon code qui est foireux ou si ya une technique pour débloquer le port après un bug donc je vous met le code et si quelque chose vous parait douteux signalez le moi. Juste pour finir, je me débrouille plutôt bien en C mais je n'y connais vraiment pas grand chose à la gestion des ports série.
p.s : je me sert du caractère '$' pour signaler à ma carte électronique que la chaine reçue est fini et qu'il faut l'afficher donc ne vous en souciez pas
J'ai trouvé un exemple de code en C sur internet qui montre comment ouvrir un port série, lire et envoyer des données puis le fermer donc je l'ai récupéré, j'ai fait des petites modifs pour que ça fasse ce dont j'ai envie et jusque là ça va. J'arrive à lire des données sans problèmes, j'arrive à en envoyer aussi mais très souvent, quand c'est pour de l'envoi, le programme n'arrive pas à fermer le port et il devient donc inutilisable. J'ai beau débrancher puis rebrancher l'adaptateur, rien n'y change. Et même une fois déconnecté, si je fais dans le terminal "ls /dev/tty.*" ou "ls /dev/cu.*" il est encore présent et la seule solution que j'ai trouvé c'est de redémarrer le Mac... (et même la plupart du temps mon macbook n'arrive pas à s'éteindre et je suis obligé de le forcer en restant appuyer sur le bouton power).
Je sais pas si c'est mon code qui est foireux ou si ya une technique pour débloquer le port après un bug donc je vous met le code et si quelque chose vous parait douteux signalez le moi. Juste pour finir, je me débrouille plutôt bien en C mais je n'y connais vraiment pas grand chose à la gestion des ports série.
Bloc de code:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
int main(int argc,char** argv) {
struct termios tio;
struct termios stdio;
int tty_fd;
char aff[]="SALUT salut$";
char device[]="/dev/tty.usbserial";
printf("Ouverture de %s\n",device);
tty_fd=open(device, O_RDWR | O_NONBLOCK | O_NOCTTY);
if(tty_fd<0) {
printf("Problème d'ouverture du port : code %d\n",tty_fd);
return 0;
}
else printf("Port ouvert\n");
memset(&stdio,0,sizeof(stdio));
stdio.c_iflag=0;
stdio.c_oflag=0;
stdio.c_cflag=0;
stdio.c_lflag=0;
stdio.c_cc[VMIN]=1;
stdio.c_cc[VTIME]=0;
tcsetattr(STDOUT_FILENO,TCSANOW,&stdio);
tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio);
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); // make the reads non-blocking
memset(&tio,0,sizeof(tio));
tio.c_iflag=0;
tio.c_oflag=0;
tio.c_cflag=CS8|CREAD|CLOCAL; // 8n1, see termios.h for more information
tio.c_lflag=0;
tio.c_cc[VMIN]=1;
tio.c_cc[VTIME]=5;
cfsetospeed(&tio,B9600); // 9600 baud
cfsetispeed(&tio,B9600); // 9600 baud
tcsetattr(tty_fd,TCSANOW,&tio);
printf("Ecriture...\n");
write(tty_fd, aff, 12);
printf("Fermeture...\n");
close(tty_fd);
printf("Port fermé\n");
return 0;
}
p.s : je me sert du caractère '$' pour signaler à ma carte électronique que la chaine reçue est fini et qu'il faut l'afficher donc ne vous en souciez pas