Последовательный порт C ++ отвечает только один раз, используя Write ()
-
05-07-2019 - |
Вопрос
Весь код ниже работает. Мое устройство отвечает, 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);
Решение
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
, возвращаемое функцией, скажет вам, сколько фактически было прочитано.