📄 cashdll.cpp
字号:
{
iLastError=ER_INVALID_CMD;
for(int i=0;i<iLen;i++)
{
pBuffer[i]=0;
iLen=0;
}
return iLastError;
}
State[0]=(Response.GetData())[3];
int iCmdLen=(Response.GetData()[2])-6;
if(iCmdLen>iLen)
{
iLen=-1;
return iLastError;
}
else iLen=iCmdLen;
for(int i=0;i<iCmdLen;i++)
{
pBuffer[i]=(Response.GetData())[i+4];
}
return RE_NONE;
}
else
{
return iLastError;
}
}
/*
[brief] The CmdEmptyDispenser function sends EMPTY DISPENSER command
The function sends EMPTY DISPENSER command only supported by Bill-To-Bill units
[return int] RE_NONE if the command was acknowledged
*/
_CASHCODEDLL_API int _stdcall CmdEmptyDispenser(BYTE Addr)
{
BYTE Data[256]={SYNC,0,6,EMPTY_DISPENSER,0,0};
CCommand cmd(Data,0);
CCommand Response=Transmit(cmd,Addr);
BYTE ack;
int iLastError;
if(!(iLastError=Response.GetCode()))
{
if((ack=Response.GetData()[3])!=ACK)
{
iLastError=(ack!=ST_INV_CMD)?ER_NAK:ER_INVALID_CMD;
return iLastError;
}
else return RE_NONE;
}
else
{
return iLastError;
}
}
_CASHCODEDLL_API int KNAPI BV_Init(int port, int bause)
{
if(!pCom)
{
pCom = new CCOMPort;
}
if(!pCom->OpenCOM(port))
{
return 1;
}
// char S_COM9600[]="9600,N,8,1";
char S_COM9600[11];
sprintf(S_COM9600,"%d",bause);
char para[6] = "N,8,1";
strcat(S_COM9600,para);
pCom->InitCOM(port,S_COM9600,300);
return 1;
}
_CASHCODEDLL_API int KNAPI BV_Identify(int timeout, int* money)
{
v1 = money;
int rt = ResetCMD(3);
if(rt != 0)
{
return 1000;
}
BYTE z1,z2;
rt = PollCMD(3,&z1,&z2);
if(rt != 0)
{
return 1000;
}
BYTE BillStatus[6];
// CString str;
rt = CmdStatus(3,BillStatus);
if(rt != 0)
{
return 1000;
}
char sPartNumber[20]="",sSerialNum[20]="";
rt = CmdIdentification(3,sPartNumber,sSerialNum);
if(rt != 0)
{
return 1000;
}
g_BillTable tab[24];
rt = GetBillTable(3,tab);
if(rt != 0)
{
return 1000;
}
rt = CmdSetSecurity(0,3);
if(rt != 0)
{
return 1000;
}
BYTE VAL = 0;
for (int i=0;i<7;i++)
{
switch(intValues[i])
{
case 100: VAL|=0x40;
break;
case 50: VAL|=0x20;
break;
case 20: VAL|=0x10;
break;
case 10: VAL|=0x08;
break;
case 5: VAL|=0x04;
break;
case 2: VAL|=0x02;
break;
case 1: VAL|=0x01;
break;
default:break;
}
}
int val = VAL;
rt = CmdBillType(val,0,3);
if (rt!=0)
{
return 1000;
}
ThreadPara *TPara = new ThreadPara;
TPara->pt = tab;
TPara->v = money;
HANDLE hThread = CreateThread(NULL,0,CheckThrd,TPara,0,NULL);
if (hThread == NULL)
{
return 1;
}
/* DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
dwEnd = GetTickCount()-dwStart;
while (dwEnd<(DWORD)timeout)
{
dwEnd = GetTickCount()-dwStart;
if (v1>0&&v1<=100)
{
*value = v1;
v1 = 0;
// return 0;
}
}
TerminateThread(hThread,NULL);*/
// if (v1>0&&v1<=100)
// {
// *value = v1;
// }
/* BYTE index = 24;
// BYTE z1,z2;
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
dwEnd = GetTickCount()-dwStart;
while (dwEnd<(DWORD)timeout)
{
dwEnd = GetTickCount()-dwStart;
Sleep(100);
PollCMD(3,&z1,&z2);
if (z1 == 0x81)
{
index = z2;
}
if(index != 24 )
{
for(int i = 0;i<24;i++)
{
if(index == i)
break;
}
*value = tab[i].iCashValue;
// return 0;
// *money = &value;
}
}
*/
return 1001;
}
DWORD WINAPI CheckThrd(LPVOID lParam)
{
ThreadPara *Thread = (ThreadPara*)lParam;
BYTE z1,z2;
BYTE index = 24;
while (1)
{
// Sleep(100);
PollCMD(3,&z1,&z2);
//Sleep(200);
if (z1 == 0x81)
{
index = z2;
}
if (index != 24)
{
for (int i=0;i<24;i++)
{
if (index == i)
{
break;
}
}
*v1 = Thread->pt[i].iCashValue;
}
Sleep(400);
index = 24;
*v1 = 0;
}
return 1;
}
_CASHCODEDLL_API int KNAPI BV_Close()
{
if(pCom !=NULL)
{
pCom->CloseCOM();
delete pCom;
pCom = NULL;
return 0;
}
else
return 1;
}
_CASHCODEDLL_API int KNAPI BV_SetBillList(char* bills)
{
strcpy(values,bills);
int val;
int i=0;
char seps[] = " ,";
char *token;
token = strtok(values,seps);
while (token != NULL)
{
val = atoi(token);
intValues[i] = val;
i++;
token = strtok(NULL,seps);
}
return 0;
}
_CASHCODEDLL_API int KNAPI BV_GetValue()
{
return *v1;
}
/*
[brief] The CmdIdentEx function sends EXTENDED IDENTIFICATION request
The function sends EXTENDED IDENTIFICATION request and stores device identification in the member CCCRSProtocol::Ident structure.
The request is supported by new Bill-To-Bill units only.
[param Addr] a parameter of type BYTE containing device address. Refer to \link Addr Device address list \endlink for the valid values
[return bool] true if the exchange was successfully completed and data received
*/
//////////////////////////////////////////////////////////////////////////
#define POLYNOMAIL 0x08408
unsigned int crc16_ccitt(unsigned char data, unsigned short crc)
{
register unsigned int d = crc, i;
d^= data;
for (i=0; i<8; i++)
{
if (d & 0x0001)
{
d>>= 1;
d^=POLYNOMAIL;
}
else d>>=1;
}
return d;
}
/*
[brief] Calculate value of CRC
[param pBuffer] a parameter of type unsigned point point to a Aarray
*/
WORD CalculateCRC(unsigned char *pBuffer)
{
WORD wCRC=0,Len=(pBuffer[2])?pBuffer[2]:
(((WORD)(pBuffer)[4])<<8)+(pBuffer)[5];
for (int i=0;i<Len-2;i++)
wCRC=crc16_ccitt(pBuffer[i],wCRC);
return wCRC;
}
int SendCommand(LPBYTE BufOut, LPBYTE BufIn)
{
int iRecievingError=RE_TIMEOUT;
int iBytesToRecieve;
for(int iErrCount=0;iErrCount<1;iErrCount++)
{
iBytesToRecieve=6;
PurgeComm(pCom->GetHandle(),PURGE_RXABORT|PURGE_TXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
if(!BufOut[2])
pCom->Send(BufOut,((WORD)BufOut[4]<<8)+BufOut[5]);
else
pCom->Send(BufOut,BufOut[2]);
if((BufOut[3]==ACK)||(BufOut[3]==NAK))
return iRecievingError=RE_NONE;
if(pCom->Recieve(BufIn,iBytesToRecieve))
{
if(BufIn[0]!=SYNC)
iRecievingError=RE_SYNC;
else
{
int iLen=((BufIn[2])?BufIn[2]:(BufIn[5]+((WORD)BufIn[4]<<8)))-iBytesToRecieve;
if(iLen>0)
{
if(pCom->Recieve((LPBYTE)BufIn+iBytesToRecieve,iLen))
{
iRecievingError=RE_NONE;
break;
}
else
{
iRecievingError=RE_DATA;
PurgeComm(pCom->GetHandle(),PURGE_RXABORT|PURGE_RXCLEAR);
}
}
else
{
iRecievingError=RE_NONE;
break;
}
}
}
}
return iRecievingError;
}
CCommand TransmitCMD(CCommand &Cmd,BYTE Addr)
{
BYTE tmpBuffer[256];
int i=(Cmd.GetData()[2])?(Cmd.GetData())[2]:
(((WORD)(Cmd.GetData())[4])<<8)+(Cmd.GetData())[5];
Cmd.SetByte(Addr,1);
WORD wCRC=CalculateCRC(Cmd.GetData());
Cmd.SetByte((BYTE)wCRC,i-2);
Cmd.SetByte(wCRC>>8,i-1);
cmdOut=Cmd;
int iErrCode=SendCommand(Cmd.GetData(),tmpBuffer);
if((!iErrCode)&&(Cmd.GetData()[3])&&(0xFF!=Cmd.GetData()[3]))
{
// wCRC=tmpBuffer[(tmpBuffer[2])?tmpBuffer[2]:(((WORD)(tmpBuffer[4]))<<8)+tmpBuffer[5]-2]+
// (tmpBuffer[(tmpBuffer[2])?tmpBuffer[2]:(((WORD)(tmpBuffer[4]))<<8)+tmpBuffer[5]-1]<<8);
// DWORD rt = CalculateCRC(tmpBuffer);
// if(rt!=wCRC) //CRC validate
// iErrCode=RE_CRC;
cmdIn=CCommand(tmpBuffer,iErrCode,(tmpBuffer[2])?(tmpBuffer)[2]:
(((WORD)(tmpBuffer)[4])<<8)+(tmpBuffer)[5]);
return cmdIn;
}
cmdIn=CCommand(tmpBuffer,iErrCode);
return cmdIn;
}
CCommand Transmit(CCommand CMD, BYTE Addr)
{
int iCmdDelay = 0;
CCommand cmdRes,cmdACK;
for(int i=0;i<3;i++)
{
cmdRes=TransmitCMD(CMD,Addr);
cmdACK.SetByte(SYNC,0);
cmdACK.SetByte(6,2);
cmdACK.SetByte(ACK,3);
if(cmdRes.GetCode()==RE_NONE)
{
if((ACK==cmdRes.GetData()[3])&&(cmdRes.GetData()[2]==6))
{
return cmdRes;
}
if((NAK==cmdRes.GetData()[3])&&(cmdRes.GetData()[2]==6))
{
if(iCmdDelay)Sleep(iCmdDelay);//5
}
else
{
cmdACK.SetByte(ACK,3);
TransmitCMD(cmdACK,Addr);
if(iCmdDelay)Sleep(iCmdDelay);//5
break;
}
}
else
{
if(cmdRes.GetCode()!=RE_TIMEOUT)
{
cmdACK.SetByte(NAK,3);
TransmitCMD(cmdACK,Addr);
if(iCmdDelay)Sleep(iCmdDelay);//5
}
}
}
return cmdRes;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -