Domanda

Tutto il codice qui sotto funziona. Il mio dispositivo risponde, C, 7 è un reset. Quando lo eseguo la seconda volta, non risponde. Se spengo e accendo manualmente il mio dispositivo, quindi eseguo di nuovo questo script funziona. Ma non se premo il pulsante per eseguire lo script la seconda volta.

RS232: 57600,8, N, 1

Qualche idea ?? Sono necessarie ulteriori informazioni per risolverlo?

* Anche quando avrò funzionato dovrò usare la funzione read () per ottenere le risposte dei dispositivi. Qualcuno sa il formato corretto che devo usare, in base al codice qui sotto? Mi dispiace, sono nuovo in C ++ ... Sono più un tipo PHP.

* Inoltre non so se 1024 ha ragione, ma sembra funzionare così eh ...

#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);
È stato utile?

Soluzione

Il 1024 potrebbe in effetti essere il tuo problema. Il terzo parametro della funzione write () indica il numero di byte da scrivere:

ssize_t write(int fildes, const void *buf, size_t nbyte);

Vedi la pagina man per write () per i dettagli.

Nel tuo caso, il numero dovrebbe essere 5, poiché stai inviando 5 caratteri ('C' ',' '7' '\ r' e '\ n').

Fornendo un valore di 1024, in realtà stai inviando altri 1019 caratteri di immondizia sul canale seriale.

Aggiornamento:

La funzione read () ha quasi gli stessi argomenti:

ssize_t read(int fildes, void *buf, size_t nbyte);

Nota che devi fornire un buffer scrivibile come secondo parametro. Ad esempio, per leggere 12 byte devi usare:

char someData[12];
read(fd, someData, 12);

Non sono del tutto sicuro di come determinare il numero di caratteri che devi leggere, ma il numero ssize_t restituito dalla funzione ti dirà quanti sono stati effettivamente letti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top