Frage

All Code unten funktioniert. Mein Gerät reagiert, C, 7 ist ein Reset. Als ich zum zweiten Mal ausführen reagiert er nicht. Wenn ich manuell mein Gerät aus- und wieder einschalten, dann dieses Skript ausführen es wieder funktioniert. Aber nicht, wenn ich die Taste, um das Skript zum zweiten Mal ausgeführt wird.

RS232: 57600,8, N, 1

Irgendwelche Ideen ?? Gibt es noch mehr Informationen benötigt, um dies zu lösen?

* Auch wenn ich diese Arbeit werde ich die read () Funktion haben, verwenden, um die Geräte Antworten. Kennt jemand das richtige Format, das ich verwenden müssen, basierend auf dem folgenden Code? Sorry, ich bin neu in C ++ ... Ich bin eher ein PHP Kerl.

* Ich weiß auch nicht, ob 1024 richtig ist, aber es scheint so zu arbeiten, 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);
War es hilfreich?

Lösung

Die 1024 in der Tat kann das Problem sein. Die dritte Paramter auf die write() Funktion gibt die Anzahl der Bytes geschrieben werden:

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

Sehen Sie die Manpage für Schreib rel="nofollow () .

In Ihrem Fall soll die Nummer 5 sein, da Sie 5 Zeichen senden ( 'C' '' '7' '\ r' und '\ n').

Mit dem Wert von 1024 bereitstellt, sind Sie eigentlich zu senden weitere 1019 Garbage Collection-Zeichen über den seriellen Kanal.

Update:

Die read() Funktion hat fast die gleichen Argumente:

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

Beachten Sie, dass Sie einen beschreibbaren Puffer als zweiten Parameter bereitstellen muss. Zum Beispiel 12 Bytes zu lesen, verwenden Sie:

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

Ich bin mir nicht ganz sicher, wie die Anzahl der Zeichen zu bestimmen, die Sie lesen müssen, aber die ssize_t Zahl von der Funktion zurückgegeben werden Ihnen sagen, wie tatsächlich gelesen wurden viele.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top