Pregunta

Todo el código de abajo funciona. Mi dispositivo responde, C, 7 es un reinicio. Cuando ejecuto esto la segunda vez no responde. Si apago y enciendo mi dispositivo manualmente, luego ejecuto este script nuevamente, funciona. Pero no si presiono el botón para ejecutar el script por segunda vez.

RS232: 57600,8, N, 1

¿Alguna idea? ¿Se necesita más información para resolver esto?

* También cuando este trabajo funcione, tendré que usar la función read () para obtener las respuestas de los dispositivos. ¿Alguien sabe el formato correcto que necesito usar, basado en el siguiente código? Lo siento, soy nuevo en C ++ ... soy más un tipo PHP.

* Tampoco sé si 1024 es correcto, pero parece funcionar así que 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);
¿Fue útil?

Solución

El 1024 puede de hecho ser tu problema. El tercer parámetro de la función write () indica el número de bytes que se escribirán:

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

Consulte la página de manual de write () para obtener más información.

En su caso, el número debería ser 5, ya que está enviando 5 caracteres ('C' ',' '7' '\ r' y '\ n').

Al proporcionar un valor de 1024, en realidad está enviando otros 1019 caracteres basura a través del canal serie.

actualizacion :

La función read () tiene casi los mismos argumentos:

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

Tenga en cuenta que debe proporcionar un búfer de escritura como segundo parámetro. Por ejemplo, para leer 12 bytes usaría:

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

No estoy seguro de cómo determinar la cantidad de caracteres que necesita leer, pero el número ssize_t devuelto por la función le dirá cuántos realmente se leyeron.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top