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);
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top