ПК соединен с контроллером через переходник USB->serial. По определенному сигналу контроллер швыряет на последовательный порт около 200 байтов (но каждый раз разное количество). Пытаюсь их получить следующим образом:
/* ..здесь какой-то код... */
if (!portOpen()) return 0;
if ((count=portScan(points, maxlen)) <= 0) {
fprintf(stderr, "getData: Таймаут ожидания данных\n");
portClose();
return 0;
}
инициализация выглядит вот так:
#define DEVNAME "/dev/ttyUSB0"
static int _openPort(void)
{
int fd;
fd = open(DEVNAME, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
fprintf(stderr, "_openPort: can't open %s\n",DEVNAME);
}
else
fcntl(fd, F_SETFL,0);
return fd;
}
static struct termios _initPort(int fd)
{
struct termios options, oldopt;
tcgetattr(fd, &oldopt);
bzero(&options, sizeof(options));
options.c_cflag |= (CLOCAL | CREAD | B9600);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_iflag = 0;
options.c_lflag = 0;
options.c_oflag = 0;
options.c_cc[VTIME] = 10; /* 1 second */
options.c_cc[VMIN] = 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &options);
/* этот участок необходим по схемотехническим требованиям */
int rts = TIOCM_RTS;
int dtr = TIOCM_DTR;
ioctl(fd, TIOCMBIC, &rts);
ioctl(fd, TIOCMBIS, &dtr);
return oldopt;
}
static void _closePort(int fd)
{
close(fd);
}
static int serial;
static struct termios oldopt;
int portOpen(void)
{
if ((serial=_openPort())!=-1) {
oldopt = _initPort(serial);
return 1;
}
return 0;
}
void portClose(void)
{
if (serial != -1)
tcsetattr(serial,TCSANOW,&oldopt);
_closePort(serial);
}
int portScan(void *buf, int count)
{
if (serial == -1) {
fprintf(stderr, "portScan: port is not opened!\n");
return 0;
}
return read(serial, buf, count);
}
Проблема в том, что вызов portScan(points, maxlen) возвращает всегда только 4 байта. Сказать, первые ли это 4 байта, я не могу. Но если после обращения read(...) сразу же вызвать read еще раз, то успешно прочитываются еще 4 байта.
Подскажите пожалуйста, с чем это может быть связано? (Аппаратное/программное управление событиями не требуется)