LINUX.ORG.RU

Блокировка вывода в последовательный порт


0

0

Здравствуйте, люди добрые! Поможите, пожалуйста.

Такая, значит, проблема.

Есть принтер (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.

Кто знает, как с этим бороться, напишите, плз.

Алексей Боленок.

Дык, наверна, и не должен. Взвинченный CTS -- это личная драма
твоего принтера. А этот самый poll(2) вернет лишь то, что ось думает
об готовности порта, понимаешь? Попробуй после poll'а и
и перед write'ом руками проверять состояние CTS.
P.S.: Ну, мне так кажется 8)))) (Regards, vav)

anonymous
()

Точнее, не порта, а файл дескриптора. (Regards, vav)

anonymous
()

попробуй open (...., O_SYNC ) и убери canon mode на порту

Z0termaNN
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.