Page 1 of 2
Serial Port connection check
Posted: Wed Jul 06, 2016 4:07 am
by ampandya
Hi
Is there any way to keep checking if the serial printer is on and connected, as the program we have here freezes if the printer is off or not connected and then the program needs to be end tasked?
Also, Can you help me to set up the USB thermal printer for the receipt?
Many Thanks for your help in advance.
Ankit
Re: Serial Port connection check
Posted: Thu Jul 07, 2016 6:46 am
by rdonnay
Why are you using a serial printer?
To use a USB printer:
oPrinter := XbpPrinter():new()
oPrinter:create(<Printer Name>)
SET PRINTER TO oPrinter
Re: Serial Port connection check
Posted: Thu Jul 07, 2016 9:19 am
by ampandya
Thanks Roger,
It is a POS system and POS thermal printer that is why i have to use serial printer.
Can we check if the printer is connected before it prints or opening cash drawer?
Thanks
Re: Serial Port connection check
Posted: Thu Jul 07, 2016 10:12 am
by Wolfgang Ciriack
Perhaps you can use the COM_ functions of the XBase Tools, f.e.
COM_OPEN and COM_LSR for the Line Status Register.
Re: Serial Port connection check
Posted: Thu Jul 07, 2016 11:28 am
by rdonnay
Try using IsPrinter(). This is from the Xbase++ documentation:
Syntax
IsPrinter( [<cLPT>] ) --> lReady
Parameters
<cLPT>
<cLPT> is a character string specifying the print channel whose readiness is determined. By default LPT1 is tested.
Return
The return value of IsPrinter() is .T. (true) if the printer (the device) on the specified print channel is ready, otherwise .F. (false) is returned.
Description
The environment function IsPrinter() tests the readiness of an output device connected to a print or output channel. The function tests LPT1 to LPT<n> or COM1 to COM<n>. When no argument is specified, the readiness of LPT1 is tested.
Caution
When print output occurs using the spooler or print queue, IsPrinter() reports the readiness of the spooler and not of the physical printer. In this situation the function generally returns the value .T. (true). If the actual output device is not ready, the condition is reported by the operating system.
Example
// IsPrinter()
// In the example, a text file is output to the
// printer. Using IsPrinter(), the readiness of the printer
// is tested during the print output. If it is not ready,
// a message is output using Alert() and the user
// decides how to continue.
//
PROCEDURE Main
LOCAL nLineLen := 55
LOCAL nPageLen := 65
LOCAL nPageNum := 1
LOCAL nPos
cString = MemoRead("TEXTFILE.TXT")
SET MARGIN TO 8
DO WHILE Len( cString ) > 0
SET PRINTER OFF
SET CONSOLE ON
DO WHILE .NOT. IsPrinter()
IF Alert( "Printer is not ready", ;
{"Retry","Cancel"} ) == 2
cString := ""
EXIT
ENDIF
ENDDO
IF .NOT. Empty( cString )
@ 0,0 SAY "Print page number:"
?? nPageNum
SET PRINTER ON
SET CONSOLE OFF
? PadL( "Page: "+Str(nPageNum,8), nLineLen )
? PadL( "Date: "+DtoC(Date()) , nLineLen )
? PadL( "Time: "+Time() , nLineLen )
nPos := MlPos( cString, nLineLen, nPageLen )
? SubStr( cString, 1, nPos - 1 )
cString := SubStr( cString, nPos )
nPageNum ++
EJECT
ELSE
EXIT
ENDIF
ENDDO
SET MARGIN TO
SET PRINTER OFF
SET CONSOLE ON
RETURN
Re: Serial Port connection check
Posted: Mon Jul 11, 2016 4:50 am
by ampandya
Thanks Roger,
the isprinter() only check the printer status when the program is starting,
once the program is on and the printer is offline it doesnt check the COM port status? any suggestion?
Thanks
Re: Serial Port connection check
Posted: Mon Jul 11, 2016 5:25 am
by rdonnay
I don't understand.
Are you saying that you want to continuously test the printer status, even when not in a print job?
You can start a thread to do this.
Code: Select all
oThread := Thread():new()
oThread:start({||TestPrinter()})
FUNCTION TestPrinter()
DO WHILE .t.
If !IsPrinter('COM1')
Msgbox('Printer is offline')
ENDIF
Sleep(100)
ENDDO
RETURN nil
Re: Serial Port connection check
Posted: Mon Jul 11, 2016 7:36 am
by ampandya
Roger,
Thread works for the first form(screen), when i click on any button and it open another page it says "Printer is offline".
once the error starts about the printer then it keeps coming even after the printer is on and working.
The printer is connected to COM1 on my pc and when we use the software on the till it can be COM3 or COM4.
The program knows the port using the P_PORT_RECEIPT which is stored in the dbf.
There is a Drawer connected to this thermal printer, what happens at the moment is when the printer is offline the program freezes, either when opening the drawer or when printing a receipt for the customer.
that is the reason we need to keep checking the printer status!
Thank you
Re: Serial Port connection check
Posted: Tue Jul 12, 2016 9:07 am
by ampandya
Hi Roger,
regarding the query:
I have come to know that the previous developer has used WSC4XB and the text to the printer using
nCode = xsioPuts(nPort,@combuf,len(combuf))
Thanks
Re: Serial Port connection check
Posted: Wed Jul 13, 2016 12:01 am
by c-tec
Hello,
your sampel shows direct serial printing via RS232 and not with a installed printer driver that eXpress++ use. This is a big difference, here you send text and control characters directly.
If you want to print this way you should look as Wolfgang wrote to the COM funktinons in the tools. I can help you if needed to convert from MarshallSoft to XBTOOLS.
regards
Rudolf