Здравствуйте, люди добрые! Поможите, пожалуйста.
Такая, значит, проблема.
Есть принтер (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.
Кто знает, как с этим бороться, напишите, плз.
Алексей Боленок.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум pty и каноничный режим (2011)
- Форум Serial port programming (2008)
- Форум tcsetattr повторный вызов (2011)
- Форум программно настроить последовательный порт (2010)
- Форум [C] Com Port (2007)
- Форум Как узнать сколько байт пришло на /dev/ttyS0 ? (2003)
- Форум Проблема при использовании Com порта. (2007)
- Форум Как сконфигурировать псевдотерминал (posix_openpt()) что бы через него мог работать как через обычный последовательный порт? (2017)
- Форум Не получается читать с порта (2013)
- Форум [ttyUSB0] вызов read() (2010)