Блокировка вывода в последовательный порт
Форум — Development
Здравствуйте, люди добрые! Поможите, пожалуйста. Такая, значит, проблема. Есть принтер (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. Кто знает, как с этим бороться, напишите, плз. Алексей Боленок.