Здравствуйте, люди добрые! Поможите, пожалуйста.
Такая, значит, проблема.
Есть принтер (STAR TSP2000), работающий через RS-232. Когда в нем всё нормально работает (т.е. он включен, есть бумага, буфер не переполнен и т.п.), то он выставляет сигналы CTS и DSR. Если что-то не так, то они, соответственно, убираются.
Мне надо написать функцию, которая бы писала в этот принтер данные, а если не получается в течение секунды - то выдавала бы ошибку. Пытаемся использовать функцию poll(2). Пишем:
#define RES_OK 0
#define RES_ERROR 1
#define RES_TIMEOUT 2
...
int fd, res;
struct pollfd pfd;
...
fd = open("/dev/ttyS0", O_CREAT | O_WRONLY | O_NOCTTY);
if (fd == -1)
return RES_ERROR;
tios.c_iflag = 0;
tios.c_oflag = 0;
tios.c_cflag = B9600 | CS8 | CLOCAL | CRTSCTS;
tios.c_lflag = 0;
tcsetattr(fd, TCSANOW, &tios);
...
memset(&pfd, 0, sizeof(struct pollfd));
pfd.fd = fd;
pfd.events = POLLOUT;
res = poll(&pfd, 1, 1000);
printf("Poll returned %d", res);
if (res > 0) {
res = write(fd, buffer, buflen);
return (res > 0) ? RES_OK : RES_ERROR;
}
if (!res)
return RES_TIMEOUT;
if (res < 0)
return RES_ERROR;
Компилируем, запускаем. И тут возникает такой эффект: poll(2) возвращает единицу (т.е. "всё нормально, можно писать в порт") сразу, независимо от состояния принтера. А вот функция write(2) блокируется, если CTS не выставлен. Т.е., poll(2) не "ловит" CTS.
Кто знает, как с этим бороться, напишите, плз.
Алексей Боленок.