tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Closing a serial device takes one second



Am 07.02.14 10:40, schrieb Michael van Elst:
> marc%msys.ch@localhost (Marc Balmer) writes:
> 
>> The other proposed "solution", namely to add a delay to open in case the
>> device is reopened, does not help either in the use cases where we run
>> into trouble:
> 
>> When talking to serial printers, we open a tty, send the data to the
>> printer and then close the tty again.  This is done several times in a
>> sequence, each time causing a one second delay.
> 
> I am quite sure that lpd does not open/close the device for sending a
> few characters every time. Instead it keeps it open for the whole
> printjob.
> 
> _Even here_ some printers recognize the hangup signal to denote the
> end of a print job, and a 1 second pause between print jobs is
> irrelevant. On the other hand, serial printers are mostly a thing
> of the past.

The delay of 1 second between two accesses to a serial printer can be a
huge problem in some applications (like the issue we just had at a large
site).  Consider that opening a cash drawer is often done by sending
some escape sequence to a printer.  so that's job 1.  Now the next thing
is to print a receipt, job nr 2.  That already gives a waiting time of
two seconds to close a sale, which is way to long.

Serial printers are in no way a thing of the past, they are heavily used
for stores, boarding passes, ticket printers etc.

setting softcar in /etc/ttys solved the problem for all printers we use.

> 
> 
>> Now adding softcar to the respective line /etc/ttys can fix the issue,
>> if the hardware does not rely on it (which we are currently testing).
> 
> I don't think /etc/ttys is the correct place to configure the port
> for print jobs. Instead you can use /etc/printcap (xc/xs attributes)
> to clear or set tty flags, in particular you can clear the HUPCL flag.
> 
> #define NOHANG 0x01000000      /* (no-op) was no SIGHUP on carrier drop */
> 
> if (ISSET(flags, NOHANG))
>                 CLR(cflag, HUPCL);
> 
> ->   xc=0x01000000   does what you need.

At least our applications don't use lpr/lpd at all.  They talk directly
to the printers.  So if we don't want to set stuff in /etc/ttys, we can
do it in the application itself.





Home | Main Index | Thread Index | Old Index