wtorek, 13 kwietnia 2021 o 17:32:59 UTC+2 Claudio H napisał(a):
Ariel
Estas trabajando con xHB comercial o free?
En caso del comercial, estas usando xHBcomm.lib o xHBCommDLL.lib?
En caso del free que lib estas usando?
Saludos
Claudio H
Hi!
I'm using Harbour. Maybe it will work with xHarbour.
Here is piece of my code for communication with registering cashes:
#include "hbsocket.ch"
#include "hbclass.ch"
#define ECR_TIMEOUT 3000 // 3 seconds
#define ECR_PobranieDanych "0"
#define ECR_WyslanieDanych "1"
#define ECR_PobranieZerowanieDanych "2"
declare window OknoStatusTransmisji
declare window OknoProgramowanieKasy
declare window OknoOdbiorSprzedazy
CLASS KF_KOMUNIKATOR
DATA lTcpIP INIT .F.
DATA oPort INIT NIL
//
DATA cIpAdress INIT ""
DATA nIpPort INIT 0
DATA nTimeOut INIT 5000 // 3 sekundy
// dalej obsługa przez serial
DATA cKFPortName INIT "" // nazwa portu COM
DATA nPredkosc INIT 9600
DATA nParzystosc INIT NOPARITY
DATA nBitow INIT 8
DATA nBitowStopu INIT ONESTOPBIT
// stan portu
DATA Open INIT .F.
METHOD INIT SETGET
METHOD WRITE SETGET
METHOD READ SETGET
METHOD CLOSE SETGET
ENDCLASS
*---------
METHOD Init(lTcpIp, cNazwaPortu, nPort, nPredkosc, nParzystosc, nBitow, nBitowStopu, nTimeout) CLASS KF_KOMUNIKATOR
::lTcpIp := lTcpIp
if ::lTcpIp
if HB_PING(cNazwaPortu)<>0
MsgStop("Kasa fiskalna nie odpowiada na adresie: "+cNazwaPortu)
return NIL
endif
if Empty( ::oPort := hb_socketOpen( HB_SOCKET_AF_INET, HB_SOCKET_PT_STREAM)) //, HB_SOCKET_IPPROTO_UDP ) )
//MsgStop( "socket create error " + hb_ntos( hb_socketGetError() ) )
MsgStop( "Błąd przy zestawieniu połączenia", "Komunikacja z kasą fiskalną")
return NIL
endif
if ! hb_socketConnect( ::oPort, { HB_SOCKET_AF_INET, cNazwaPortu, nPort } )
//MsgStop( "socket connect error " + hb_ntos( hb_socketGetError() ) )
MsgStop( "Błąd przy zestawieniu połączenia (socket connect error #"+ hb_ntos( hb_socketGetError() )+")", "Komunikacja z kasą fiskalną")
return NIL
endif
::cIpAdress := cNazwaPortu
::nIpPort := nPort
::Open := .t.
else
::cKFPortName := cNazwaPortu
::nPredkosc := nPredkosc
::nParzystosc := nParzystosc
::nBitow := nBitow
::nBitowStopu := nBitowStopu
::oPort := win_com():Init(cNazwaPortu, nPredkosc, nParzystosc, nBitow, nBitowStopu)
if !::oPort:Open
MsgBox("Błąd otwarcia portu komunikacyjnego - BRAK POŁĄCZENIA Z KASĄ FISKALNĄ!", "Komunikacja z kasą fiskalną" )
::oPort := NIL
return NIL
else
// Otwarto z powodzeniem
DoRejestruTransmisji("Otwarto port komunikacyjny "+cPortName)
::oPort:QueueSize( 1000, 1000 )
::oPort:Purge()
//TimeOuts( nInterval, nReadMultiplier, nReadConstant, nWriteMultiplier, nWriteConstant )
::oPort:Timeouts(1500,1000,20000,1000,20000)
::oPort:RTSFlow(.t.)
::oPort:DTRFlow(.t.)
::oPort:XonXoffFlow(.t.)
::oPort:SetDTR(.t.)
::oPort:SetDTR(.t.)
::oPort:SetRTS(.t.)
endif
endif
::nTimeOut := nTimeout
::Open := .t.
return SELF
*---------
METHOD Write(cDaneDoWyslania) CLASS KF_KOMUNIKATOR
local nWyslano := 0
if ::lTcpIp
hb_socketSend( ::oPort, cDaneDoWyslania )
nWyslano := len(cDaneDoWyslania)
else
nWyslano := ::oPort:Write(cDaneDoWyslania)
//if !(nWyslano == len(cDaneDoWyslania))
// MsgStop("Operacja zakończona niepowodzeniem", "WYDRUK FISKALNY" )
// return .f.
//endif
endif
return nWyslano
*---------
METHOD Read(cOdpowiedz, n) CLASS KF_KOMUNIKATOR
hb_default(@n,1)
cOdpowiedz := space(n)
if ::lTcpIp
n := hb_socketRecv( ::oPort, @cOdpowiedz,,, ::nTimeOut )
else
::oPort:Read(@cOdpowiedz, n)
endif
return cOdpowiedz
*---------
METHOD Close CLASS KF_KOMUNIKATOR
local nCount := 0
local cOdpowiedz := ""
if ::lTcpIp
hb_socketShutdown( ::oPort )
hb_socketClose( ::oPort )
else
::oPort:QueueStatus( , , , , , @nCount, )
::oPort:Read(@cOdpowiedz, nCount)
::oPort:Purge()
::oPort:RTSFlow(.f.)
::oPort:DTRFlow(.f.)
::oPort:XonXoffFlow(.f.)
::oPort:SetDTR(.f.)
::oPort:SetDTR(.f.)
::oPort:SetRTS(.f.)
::oPort:Close()
endif
DoRejestruTransmisji("Zamknięto port komunikacyjny")
::oPort := NIL
return
*---------
METHOD Purge CLASS KF_KOMUNIKATOR
if ::lTcpIp
else
::oPort:Purge()
endif
return
*-------------------------
FUNCTION ECR_InitTango
param nNumerKasy, lTcpIp, cPortName, nPredkosc, cAdresTcpIp, nPortTcpIp
local lRet := .t., cOdpowiedz := space(1000)
local nNumerKasyPodlaczonej
ECR_LastErrorNR := 0
ECR_LastErrorTXT := ""
if type("nNumerKasy") <>"N"
nNumerKasy := val(nNumerKasy)
endif
if type("cPortName") == "N"
cPortName := "COM"+alltrim(str(cPortName))
endif
oWinPort := KF_Komunikator():Init(lTcpIp,;
if(lTcpIp,cAdresTcpIp,cPortName),;
nPortTcpIp,;
nPredkosc,;
NOPARITY, 8, ONESTOPBIT,;
ECR_TIMEOUT)
if oWinPort = NIL
lRet := .f.
//walert("Błąd otwarcia portu komunikacyjnego",,"" )
MsgStop("Błąd otwarcia portu komunikacyjnego "+if(lTcpIP, cPortName+":"+hb_ntos(nPredkosc),cAdresTcpIp+":"+hb_ntos(nPortTcpIp)),,"" )
DoRejestruTransmisji("Błąd otwarcia portu komunikacyjnego "+if(lTcpIP, cPortName+":"+hb_ntos(nPredkosc),cAdresTcpIp+":"+hb_ntos(nPortTcpIp)), )
SetProperty(ThisWindow.Name,"T_TypOperacji","Value","Błąd otwarcia portu komunikacyjnego "+if(lTcpIP, cPortName+":"+hb_ntos(nPredkosc),cAdresTcpIp+":"+hb_ntos(nPortTcpIp)))
SetProperty(ThisWindow.Name,"T_TypOperacji","FontColor", {255,0,0} )
return lRet
endif
// sprawdź numer kasy
nNumerKasyPodlaczonej := ECR_OdczytajNumerKasy()
if nNumerKasyPodlaczonej < 0
ECR_COMClose()
lRet := .f.
else
if nNumerKasy <> nNumerKasyPodlaczonej .and. nNumerKasy > 0
cTXTError := "Próba połączenia z kasą o innym numerze"
WAlert("Próba połączenia z kasą o innym numerze!")
DoRejestruTransmisji("Próba połączenia z kasą o innym numerze!")
SetProperty(ThisWindow.Name,"T_TypOperacji","Value", "Próba połączenia z kasą o innym numerze!")
SetProperty(ThisWindow.Name,"T_TypOperacji","FontColor", {255,0,0} )
ECR_COMClose()
lRet := .f.
else
DoRejestruTransmisji("Połączono z kasą #"+alltrim(str(nNumerKasyPodlaczonej)))
//oWinPort:Purge()
endif
endif
RETURN lRet
*-------------------
function ECR_ComClose
if oWinPort <> NIL
oWinPort:Close()
endif
oWinPort := NIL
return .t.
*-------------------
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)