Последовательный порт C ++ отвечает только один раз, используя Write ()

StackOverflow https://stackoverflow.com/questions/1609127

  •  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 , возвращаемое функцией, скажет вам, сколько фактически было прочитано.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top