ЗАО «ЗЭО»
Техническая поддержка пользователей => Тион, Тион-Про, Тион-Про v2, Сириус => Тема начата: MOHOMAX от 15 Мая, 2011, 14:40:49
-
Здравствуйте!
ОС linux, тион-про2.
Пишу программу для общения с датчиком по RS485. Заметил интересную особенность при записи в порт ttyAM2. Я отправляю 2 байта в порт, а осциллографом вижу, что эти 2 байта отправляются повторно каждые 10мс (см аттач) до тех пор, пока порт не закроется. А функция read возвращает ошибку (Resource temporarily unavailable). Осциллографом смотрел и на выходе RS-485 и на выходе TXD2. Но если я запускаю ту же самую программу для ttyAM1, то эти 2 байта отправляются один раз.
Код функции, которая отправляет данные:
int fd;
struct termios options;
unsigned char buf[50];
int res;
ssize_t sz;
fd = open(config->rs485_port, O_WRONLY | O_NOCTTY | O_NDELAY);
if (fd < 0)
{
return 1;
}
tcgetattr(fd, &options);
options.c_cflag |= (B19200 | CS8 | CLOCAL | CREAD);
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &options);
fsync(fd);
tcflush(fd, TCIFLUSH);
sz = write(fd, "DO", 2);
if(sz!=2)
{
Message("write sz=%d\n",sz);
close(fd);
return 3;
}
sleep(3); //wait for sensor data
sz = read(fd, buf, 50);
if (sz <= 0 || sz > 100)
{
Error(errno, "read. sz=%d",sz);
close(fd);
return 2;
}
close(fd);
Почему такое может происходить?
-
проблема решилась.
Я сбросил флаги управления линией
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
И проблема исчезла.