Последовательный порт C ++ отвечает только один раз, используя Write () - PullRequest
1 голос
/ 22 октября 2009

Весь код ниже работает. Мое устройство отвечает, C, 7 - это сброс. Когда я запускаю это во второй раз, он не отвечает. Если я вручную выключаю и включаю свое устройство, то снова запускаю этот скрипт, он работает. Но нет, если я нажму кнопку, чтобы запустить скрипт во второй раз.

RS232: 57600,8, N, 1

Есть идеи? Нужна ли еще информация для решения этой проблемы?

* Также, когда я получу эту работу, мне придется использовать функцию read (), чтобы получить ответы устройств. Кто-нибудь знает правильный формат, который мне нужно использовать, основываясь на приведенном ниже коде? Извините, я новичок в C ++ ... Я больше похож на PHP.

* Я также не знаю, правильно ли 1024, но, похоже, работает так, эх ...

#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);

1 Ответ

3 голосов
/ 22 октября 2009

1024 может быть вашей проблемой. Третий параметр функции write() указывает количество записываемых байтов:

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

Подробнее см. Справочную страницу для write () .

В вашем случае число должно быть 5, так как вы отправляете 5 символов ('C' ',' '7' '\ r' и '\ n').

Предоставляя значение 1024, вы фактически отправляете еще 1019 мусорных символов по последовательному каналу.

Обновление:

Функция read() имеет почти те же аргументы:

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

Обратите внимание, что вы должны предоставить доступный для записи буфер в качестве второго параметра. Например, чтобы прочитать 12 байтов, вы должны использовать:

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

Я не совсем уверен, как определить количество символов, которые вам нужно прочитать, но число ssize_t, возвращаемое функцией, скажет вам, сколько фактически было прочитано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...