📄 wanterhub.c
字号:
TMOD=0x21;
TH1=0xfe;
TL1=0xfe;
// WDCON=0x80; //将串口1波特率翻倍
TH2=0xff;
TL2=0xf4;//0xfa;//; //ff:fd ff:fa ff:f7 ff:f4 ff:ee ff:dc
RCAP2H=0xff; //115200 57600 38400 28800 19200 9600
RCAP2L=0xf4;//0xfa;
T2CON=0x34; //tf2 exf2 rclk tclk exen2 tr2 c/t2 cp/rl2
//PCON=0x80; /*smod * * * gf1 gf0 pf idl smod=1 baud double 57600bps*/
TR1=1;
ES1=1;
ES=0;
}
/********************************************************/
/*Function: 串口1发送一字节 */
/*Input: uchar data1 */
/*Output: Nun. */
/*Description: */
/********************************************************/
void SendByte(uchar data1)
{
re184_dn=1;
NOP5();
SBUF1=data1;
while(!TI_1);TI_1=0;
NOP5();
re184_dn=0;
NOP5();
}
/********************************************************/
/*Function: 串口1接收1字节 */
/*Input: Nun. */
/*Output: uchar data1 */
/*Description: */
/********************************************************/
uchar ReceiveByte(void)
{
uchar data data1;
uint data count;
s_err=1;
for (count=0;count<800;count++) /*delay 5.5ms */
{
if (RI_1)
{
s_err=0;
RI_1=0;
}
if (!s_err)
break;
watchdog=~watchdog;
}
data1=SBUF1;
return (data1);
}
/********************************************************/
/*Function: 串口1接收一帧数据 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void ReceiveData(void)
{
uchar data i;
uchar data pf;
uchar data length;
uchar idata *pnt=Ri1Buf;
f_ri1=0;
*pnt=ReceiveByte(); //接收帧数据长度
if (!s_err)
{
pf=*pnt;
length=(*pnt-2);
if (length>19)
length=18;
for (i=0;i<length;i++)
{
*pnt=ReceiveByte();
if (!s_err)
{
pf+=*pnt++;
}
else
break;
} //接收帧命令和帧数据
if (!s_err)
{
*pnt=ReceiveByte(); //接收校验和
if (s_err==0&&*pnt==pf)
{
f_ri1=1; //正确接收到一帧数据
}
else
f_ri1=0; //帧数据错误
}
else
f_ri1=0;
}
}
/********************************************************/
/*Function: HUB轮寻POS */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void LookForPos(void)
{
uchar data pf;
uchar data i,j;
uchar idata pos_status;
ES1=0;
if (PosName<32)
{
TB8_1=1;
SendByte(PosName); //发送POS地址
TB8_1=0;
SendByte(0x5); //发送数据帧长度
TB8_1=0;
SendByte(0x1); //发送帧命令
pf=0x6;
TB8_1=0;
SendByte(status); //发送POS功能状态
pf+=status;
TB8_1=0;
SendByte(address); //发送HUB地址
pf+=address;
TB8_1=0;
SendByte(pf); //发送校验和
ReceiveData(); //接收POS应答信息
//脱机联机状态标志判别
i=PosName/4;
j=PosName%4;
if (f_ri1)
{
uchar idata *pnt=Ri1Buf;
switch(*pnt)
{
case 1: //轮寻空闲应答
if(*(pnt+2)==0x00)
switch(j)
{
case 0:
pos_status=InOrOff[i];
pos_status=pos_status&0xfc;
InOrOff[i]=pos_status|0x01;
break;
case 1:
pos_status=InOrOff[i];
pos_status=pos_status&0xf3;
InOrOff[i]=pos_status|0x04;
break;
case 2:
pos_status=InOrOff[i];
pos_status=pos_status&0xcf;
InOrOff[i]=pos_status|0x10;
break;
default:
pos_status=InOrOff[i];
pos_status=pos_status&0x3f;
InOrOff[i]=pos_status|0x40;
break;
}
else if(*(pnt+2)==0xfe)
switch(j)
{
case 0:
pos_status=InOrOff[i];
pos_status=pos_status&0xfc;
InOrOff[i]=pos_status|0x02;
break;
case 1:
pos_status=InOrOff[i];
pos_status=pos_status&0xf3;
InOrOff[i]=pos_status|0x08;
break;
case 2:
pos_status=InOrOff[i];
pos_status=pos_status&0xcf;
InOrOff[i]=pos_status|0x20;
break;
default:
pos_status=InOrOff[i];
pos_status=pos_status&0x3f;
InOrOff[i]=pos_status|0x80;
break;
}
else
switch(j)
{
case 0:
pos_status=InOrOff[i];
pos_status=pos_status&0xfc;
InOrOff[i]=pos_status|0x03;
break;
case 1:
pos_status=InOrOff[i];
pos_status=pos_status&0xf3;
InOrOff[i]=pos_status|0x0c;
break;
case 2:
pos_status=InOrOff[i];
pos_status=pos_status&0xcf;
InOrOff[i]=pos_status|0x30;
break;
default:
pos_status=InOrOff[i];
pos_status=pos_status&0x3f;
InOrOff[i]=pos_status|0xc0;
break;
}
break;
case 2:
poszhGet();
break;
case 3:
{
uchar data i;
uchar data pf;
pf=0;
if(f_over==0)
{
if ((ListCode[Ri1Buf[2]]!=Ri1Buf[14])&&((Ri1Buf[12]<0xc3)&&(Ri1Buf[11]==0)))//判断本次消费流水和上次消费流水是否一致
{
ListCode[Ri1Buf[2]]=Ri1Buf[14]; //更新消费流水号
SalePoint=0x1000;
SalePoint+=SaleBeg*(SaleLength+1);//计算地址
pnt++;
fm_cs=0;
for (i=0;i<SaleLength;i++)
{
*SalePoint++=*pnt;
pf+=*pnt++;
}
*SalePoint++=pf;
i=(SALEBEG_H-SALEBEG_H1)|(SALEBEG_H-SALEBEG_H2);
pf=(SALEBEG_L-SALEBEG_L2)|(SALEBEG_L-SALEBEG_L2);
if(i||pf)
f_err=1;
else
{
SaleBeg+=1;
SaleBeg=SaleBeg%2000;
SALEBEG_H=SaleBeg/0x100;
SALEBEG_L=SaleBeg%0x100;
SALEBEG_H1=SaleBeg/0x100;
SALEBEG_L1=SaleBeg%0x100;
SALEBEG_H2=SaleBeg/0x100;
SALEBEG_L2=SaleBeg%0x100;
}
fm_cs=1; //更新表头
if ( (SaleBeg+1)==SaleEnd)
{
f_over=1; //判断消费存储区域有无满
beepp(400);
}
else
f_over=0;
}
else
_nop_();
// ES1=0;
TB8_1=1;
SendByte(PosName); //发送POS地址
TB8_1=0;
SendByte(0x4); //长度
TB8_1=0;
SendByte(0x4); //功能号
TB8_1=0;
SendByte(0x55); //应答
TB8_1=0;
SendByte(0x5d); //pf
// ES1=1;
}
}
break;
default:
break;
}
}
else //对应(if ri1)
{
InOrOff[i]=(InOrOff[i]&(~(3<<(j*2))));//保存离线标志
}
PosName++;
}
else //对应posname<32
{
PosName=0x00;
}
ES1=1;
}
/*********************************************************/
/*Function: HUB收到POS申请帐号的处理 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: 一个PCI轮寻周期里面每POS就允许申请一次帐号*/
/*********************************************************/
void poszhGet(void)
{
uchar data i,pf;
uchar idata *pnt=Ri1Buf;
uchar xdata *pnt1=AccountBuf;
pnt1+=Ri1Buf[1]*7;
pf=0;
for(i=1;i<7;i++)
{
*pnt1++=Ri1Buf[i];
pf+=Ri1Buf[i];
}
*pnt1=pf;
f_zhstate=1; //帐户申请区非空
}
/********************************************************/
/*Function: 比较发送消费信息 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void SendSaleRecord(void)
{
uchar data i,j;
uchar xdata Buf[14];
uchar xdata *pnt=&SaleBuf;
uchar xdata *pnt2=&Buf;
uchar data pf,checksum;
fm_cs=0;
i=(SALEEND_H-SALEEND_H1)|(SALEEND_H-SALEEND_H2);
j=(SALEEND_L-SALEEND_L1)|(SALEEND_L-SALEEND_L2);
fm_cs=1;
if(i||j)
f_err=1;
if((!f_err)&&(!f_sal)&&(SaleBeg!=SaleEnd))
{
SaleCount=0;
pf=0;
checksum=0;
SalePoint=0x1000;
SalePoint+=SaleEnd*(SaleLength+1);
pnt+=3;
while((SaleCount<10)&&(SaleBeg!=SaleEnd))
{
pf=0;
pnt2=&Buf;
if (SalePoint>=0x7D60)
{
SalePoint=SalePoint-0x7D60+0x1000;
}
fm_cs=0;
for (i=0;i<SaleLength;i++)
{
pf+=*SalePoint;
*pnt2++=*SalePoint++;
}
*pnt2=*SalePoint++;
pnt2=&Buf;
if((*pnt2!=0xc1)&&(*pnt2!=0x41))
{
SaleEnd=(SaleEnd+1)%2000;
*(SalePoint-14)=0xff;
}
else if(pf!=Buf[13])
{
SaleEnd=(SaleEnd+1)%2000;
*(SalePoint-14)=0xff;
}
else
{
*pnt++=17; //单包数据长度
*pnt++=0x3; //功能号
*pnt++=address; //管理机地址
pf=20+address;
for (i=0;i<SaleLength;i++)
{
pf+=*pnt2;
*pnt++=*pnt2++;
}
*pnt++=pf;
checksum+=2*pf;
SaleEnd=(SaleEnd+1)%2000;
SaleCount++;
*(SalePoint-14)=0xff;
}
}
if(SaleCount!=0)
{
pnt=&SaleBuf;
Serial0SendNum=5+SaleCount*17;
*pnt++=Serial0SendNum;
checksum+=(5+SaleCount*17);
*pnt++=0x3;
checksum+=0x3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -