📄 wanterhub.c
字号:
*pnt++=SaleCount;
checksum+=SaleCount;
pnt=&SaleBuf;
pnt+=(3+SaleCount*17);
checksum+=list;
*pnt++=list++;
*pnt++=checksum;
FmSaleCount=SaleCount;
FmList=list;
f_sal=1;
}
else
{
f_sal=0;
}
SALEEND_H=SaleEnd/0x100;
SALEEND_L=SaleEnd%0x100;
SALEEND_H1=SaleEnd/0x100;
SALEEND_L1=SaleEnd%0x100;
SALEEND_H2=SaleEnd/0x100;
SALEEND_L2=SaleEnd%0x100;
fm_cs=1;
}
}
/********************************************************/
/*Function: 定时器0中断处理函数 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void Time0() interrupt 1 using 1
{
TH0=-(30000/256);
TL0=-(30000%256);
if (pci_count)
{
pci_count--;
}
}
/********************************************************/
/*Function: 串口1中断处理函数--和POS通讯 */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
//void serial1() interrupt 7 using 2
/********************************************************/
/*Function: 串口0中断处理函数 --与PCI卡通讯-- */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void serial0() interrupt 4 using 3
{
static uchar rmod;
static uchar pf;
static uchar lengh;
static uchar xdata *pnt;
uchar data c;
/*-----------------------接收--------------------------*/
if (RI)
{
NOP5(); //no88
RI=0;
c=SBUF;
switch (rmod)
{
case 0:
if (c==address ) //接收地址帧
{
SM2=0;
rmod++;
}
break;
case 1: //接收帧数据长度
lengh=c;
if (lengh>124)
lengh=124;
pf=lengh;
pnt=Ri0Buf;
lengh=lengh-2;
rmod++;
break;
case 2: //接收帧命令和数据
*pnt++=c;
pf+=c;
if (lengh--==1)
rmod++;
break;
case 3:
if (pf==c) //比较校验和
{
pci_count=200; //计数值重载
switch (Ri0Buf[0])
{
case 1: //功能号1:PCI卡轮寻POs
if(f_zhstate==1)
{
uchar idata i;
uchar idata j;
uchar idata pf;
uchar idata checksum;
uchar idata count;
uchar xdata *pnt1=AccountBuf;
uchar xdata *pnt2=Ti0Buf;
pnt2+=4;
checksum=0;
count=0;
for(j=0;j<32;j++)
{
if(count==10)
break;
if(*pnt1!=0xff)
{
pf=0;
for(i=0;i<6;i++)
{
pf+=*pnt1;
*pnt2++=*pnt1++;
}
if(pf!=*pnt1++)
{
pnt2-=6;
}
else
{
*pnt2++=pf;
checksum+=pf+pf;
count++;
}
*(pnt1-7)=0xff;
}
else
pnt1+=7;
}
if(count!=0)
{
Serial0SendNum=count*7+5;
checksum+=Serial0SendNum;
checksum+=0x2;
checksum+=address;
checksum+=count;
*pnt2++=checksum;
pnt2=Ti0Buf;
*pnt2++=Serial0SendNum; //数据总长度
*pnt2++=0x2; //功能号
*pnt2++=address; //HUB号
*pnt2++=count; //包数 dai ding
f_zh=1;
TI=1;
}
}
//如果有消费发送标志,则发送消费纪录;第2优先级
else if (f_sal==1)
{
uchar data i;
uchar idata pf;
uchar xdata *pnt=Ti0Buf;
uchar xdata *pnt1=&SaleBuf;
if (SaleCount!=0)
{
fm_cs=0;
_nop_();
pf=0;
for (i=0;i<17*SaleCount+4;i++) // 5? 4?
{
*pnt++=*pnt1;
pf+=*pnt1++;
}
if(pf==*pnt1)
{
*pnt=pf; //数据帧校验和
Serial0SendNum=5+SaleCount*17;
fm_cs=1;
TI=1;
}
else
{ f_sal=0;
f_over=0;
SaleCount=0;
FmSaleCount=0;
fm_cs=1;
}
}
else
{
f_sal=0;
f_over=0;
SaleCount=0;
FmSaleCount=0;
fm_cs=1;
}
}
//空闲应答
else
{
uchar data i;
uchar idata pf;
uchar xdata *pnt=Ti0Buf;
*pnt++=12; //数据帧长度
*pnt++=0x1;pf=13; //功能号
*pnt++=address;pf+=address;//HUB地址
for (i=0;i<8;i++)
{
*pnt=InOrOff[i];
pf+=*pnt++;
} //8字节POS状态
*pnt++=pf; //数据帧校验和
Serial0SendNum=12;
TI=1;
}
break;
case 2: //功能号2:接收卡发送的卡信息
{
f_zh=0;
f_zhdown=1;
}
break;
case 3: //功能号3:接收卡更新时间信息
{}
break;
case 4: //功能号4:接收卡发送的消费应答信息
{
if (Ri0Buf[1]==0x55)
{
f_sal=0; //复位请求发送消费数据标志
f_over=0;
fm_cs=0;
_nop_();
FmSaleCount=0;
fm_cs=1;
}
}
break;
default:
break;
}
}
lengh=0;pf=0;
rmod=0;SM2=1;
break;
default:
{ lengh=0;
pf=0;
rmod=0;
SM2=1;
}
break;
}
}
/*-------------------发送数据-------------------------------------*/
if (TI)
{
TI=0;re184_up=1;
if (Serial0SendNum!=0) //判断数据是否发送完毕
{
SBUF=*Serial0SendPoint;
Serial0SendPoint++;
Serial0SendNum--;
}
else //数据发送完毕
{
Serial0SendPoint=Ti0Buf; //
re184_up=0;
NOP5();
}
}
}
/********************************************************/
/*Function: 延时 X ms */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void DelayMs(uint count)
{
uchar i;
while ((count--)!=0)
{
for (i=0;i<125;i++)
{;}
}
}
/********************************************************/
/*Function: beep X ms */
/*Input: Nun. */
/*Output: Nun. */
/*Description: */
/********************************************************/
void beepp(uint times)
{
beep=0;
DelayMs(times);
beep=1;
}
/*-------MAIN------*/
void main(void)
{// uchar i;
re184_dn=0;
re184_up=0;
batter=0;
PMR=0x41;
watchdog=~watchdog;
DelayMs(500);
watchdog=~watchdog;
batter=1;
DelayMs(500);
//batter=0;
watchdog=~watchdog;
ClearXram(); //清除片RAM
DelayMs(500);
InialSerial(); //初始化串口
beepp(400); //蜂鸣器叫 800ms
address=ReadAddress(); //读取HUB地址
ReckonFinger(); //计算指针是否正确 no97
ReadSys(); //读取系统信息
InialTime0(); //初始化时间
//line_led=0; //点两LED
PosName=0x00;
PS=1;
ES=1;
EA=1;
f_1500ms=0;
f_sal=0;
f_zhdown=0;
if(test_xram())
{
while(1);
}
while(1)
{
watchdog=~watchdog;
if (pci_count) //等待PCI卡的轮循
LookForPos(); /*look for pos */
// DelayMs(500);
/*-----------------等待帐户应答-------------------------------*/
/*----------------下发帐户信息--------------------------------*/
if (f_zhdown)
{
uchar xdata *pnt=Ri0Buf;
uchar xdata *pnt1;
uchar idata count;
uchar data i,j,pf;
pnt++;
count=*pnt++;
f_zhdown=0;
ES1=0;
for(i=0;i<count;i++)
{
pnt1=AccountBuf;
pnt1+=*pnt*7; //申请到帐户信息,该pos帐户区清空
*pnt1=0xff;
TB8_1=1;
SendByte(*pnt++); //机号
TB8_1=0;
SendByte(13); //长度
TB8_1=0;
SendByte(02); //功能号
pf=15; //校验和(不包括机号)
for(j=0;j<10;j++) //帐户信息 10B
{
TB8_1=0;
pf+=*pnt;
SendByte(*pnt++);
}
TB8_1=0;
SendByte(pf); //校验和
NOP5();
NOP5();
}
ES1=1;
/*-----------判断帐户申请区是否为空----------*/
pnt1=AccountBuf;
for(j=0;j<32;j++)
{
pnt1+=7;
if(*pnt1!=0xff)
{f_zhstate=1; break;}
else
f_zhstate=0;
}
}
/*---------------------判断有无消费数据---------------------------------*/
if (!f_sal)
{
SendSaleRecord();
}
if(f_err)
{
f_err=0;
ReckonFinger1();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -