Port série C ++ ne répondant qu'une fois en utilisant Write ()
-
05-07-2019 - |
Question
Tout le code ci-dessous fonctionne. Mon appareil répond, C, 7 est une réinitialisation. Quand je lance ceci la deuxième fois, il ne répond pas. Si j'éteins et rallume manuellement mon appareil, exécutez à nouveau ce script, cela fonctionne. Mais pas si j'appuie sur le bouton pour exécuter le script une deuxième fois.
RS232: 57600,8, N, 1
Des idées? Y a-t-il d'autres informations nécessaires pour résoudre ce problème?
* Aussi, quand je fonctionnerai, je devrai utiliser la fonction read () pour obtenir les réponses des périphériques. Est-ce que quelqu'un connaît le format correct que je dois utiliser, basé sur le code ci-dessous? Désolé, je suis nouveau en C ++ ... Je suis plutôt un gars de PHP.
* Je ne sais pas non plus si 1024 est correct, mais cela semble fonctionner alors hein ...
#include <termios.h>
int fd;
struct termios options;
fd=open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
tcgetattr(fd,&options);
options.c_ispeed=57600;
options.c_ospeed=57600;
options.c_cflag |= (CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~ECHO;
options.c_oflag &= ~ECHO;
options.c_oflag &= ~OPOST;
options.c_cflag |= CS8;
options.c_cflag |= CRTSCTS;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] =10;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&options);
write(fd, "C,7\r\n", 1024);
close(fd);
La solution
Le 1024 est peut-être votre problème. Le troisième paramètre de la fonction write ()
indique le nombre d'octets à écrire:
ssize_t write(int fildes, const void *buf, size_t nbyte);
Consultez la page de manuel de write () pour plus de détails.
Dans votre cas, le nombre doit être 5, car vous envoyez 5 caractères ('C' ',' '7' '\ r' et '\ n').
En fournissant une valeur de 1024, vous envoyez en fait 1019 caractères supplémentaires sur le canal série.
mise à jour:
La fonction read ()
a presque les mêmes arguments:
ssize_t read(int fildes, void *buf, size_t nbyte);
Notez que vous devez fournir un tampon en écriture en tant que second paramètre. Par exemple, pour lire 12 octets, vous utiliseriez:
char someData[12];
read(fd, someData, 12);
Je ne sais pas trop comment déterminer le nombre de caractères à lire, mais le nombre ssize_t
renvoyé par la fonction vous indiquera le nombre réellement lu.