Последовательные принтера редко используются с lpd.
Lpd обеспечивает пять атрибутов, которые вы можете установить в
/etc/printcap для контроля всех установок принтера на
последовательном порту. Читайте справочную страницу
printcap
и отметьте значение атрибутов br#, fc#,
xc#, fs# and xs#. Последние четыре из
этих атрибутов являются битовыми картами показывающими установки
для использования портом. Атрибут br# это просто скорость
передачи в бодах, например `br#9600
'.
Очень легко переводить из установок stty в установки флагов printcap. Если вам необходимо, то смотрите справочную страницу stty.
Используйте stty для настройки порта принтера, так что вы сможете выполнить копирование файла на него и получить правильно напечатанный файл. Здесь приводятся данные того, что `stty -a' показывает для моего принтерного порта.
dina:/usr/users/andy/work/lpd/lpd# stty -a < /dev/ttyS2
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0
bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase
-tostop -echoprt -echoctl -echoke
Разница между этим и тем способом которым порт инициализируется
при загрузке во флагах -clocal
, -crtscts
, and
ixon
. Настройки вашего порта могут отличаться в зависимости от
того как ваш принтер делает контроль потока.
В действительности вы используете stty странным способом. Так
stty работает с терминалами, подключенными к его стандартному
вводу, вы используете его для манипуляций с заданным
последовательным портом используя символ `<
' как показано
выше.
После того как вы правильно установили настройки stty, так что `cat file > /dev/ttyS2' (в моем случае) посылает файл на принтер, посмотрите в файл /usr/src/linux/include/asm-i386/termbits.h. Этот файл содержит некоторое количество #defines и несколько структур (вы можете захотеть напечатать этот файл на принтере (он у вас работает, не так ли?) и использовать его как черновик). Перейдите в раздел который начинается с:
/* c_cflag bit meaning */
#define CBAUD 0000017
Этот раздел перечисляет значение битов fc# и fs#. Вы будете уведомлены, что имена здесь (после скорости передачи) соответствуют одной из строк вывода stty. Не я ли сказал что все будет легко?
Заметим какая из этих настроек начинается с a
-- в
вашем выводе stty. Просуммируем все эти числа (они в восьмеричном
представлении). Это представляет собой биты которые вы хотите
очистить, так что результатом будет ваше свойство
fc#. Конечно помните что вы будете устанавливать биты
прямо после очистки, так что вы можете просто использовать
`fc#0177777
' (я так делаю).
Теперь сделаем это для тех установок (перечисленных в этом
разделе) которые не имеют a
в начале -- в вашем выводе
stty. В моем примере самые важные это CS8 (0000060), HUPCL
(0002000), и CREAD (0000200). также заметим флаги для вашей
скорости передачи (мои равны 0000015). Сложим их все, и в моем
примере получим 0002275. Это идет как ваше свойство fs#
(`fs#02275
' великолепно работает в моем примере).
Сделайте тоже самое с установкой и очисткой для следующего
раздела включаемого файла, "c_lflag bits". В моем случае я не
устанавливал ничего, так что я просто использовал
`xc#0157777
' и `xs#0
'.
Jon Luckey указал, что некоторые старые последовательные
принтера с десятицентовым последовательным интерфейсом и маленькими
буферами действительно останавливаются когда используется
контроль потока. Он нашел, что запрещение FIFO для
последовательного порта 16550 его Linux-машины с помощью
setserial
исправило проблему потерянных символов (вы по всей видимости можете
просто указать тип uart как 8250 чтобы сделать это).