⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pc_comm.c

📁 单片机和上位机通讯源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    0xD5,0xFD,0xD4,0xDA,0xB2,0xE9,0xD5,0xD2,0xBA,0xDA,0xC3,0xFB,0xB5,0xA5,0x21,0x00};
  char code  s2[]={  //正在查找白名单!
    0xD5,0xFD,0xD4,0xDA,0xB2,0xE9,0xD5,0xD2,0xB0,0xD7,0xC3,0xFB,0xB5,0xA5,0x21,0x00};
  byte code s3[]={  //黑白名单未生效!
    0xBA,0xDA,0xB0,0xD7,0xC3,0xFB,0xB5,0xA5,0xCE,0xB4,0xC9,0xFA,0xD0,0xA7,0x21,0x00};
  byte code s4[]={  //黑白名单已截止!
    0xBA,0xDA,0xB0,0xD7,0xC3,0xFB,0xB5,0xA5,0xD2,0xD1,0xBD,0xD8,0xD6,0xB9,0x21,0x00};
  if (IcCardData.IcCardState==40)
  {					//需要查询黑白名单
    if (CheckBlackWhite==0)
    {					//还没有开始查询黑白名单
      if (PCOffLine==0)
      {
        TypeOfCheckBW=0;
        CheckBlackWhite=1;		//联机状态下设置正在查找黑白名单的标志
        if (IcCardData.IcCardType<0x0f)
          Key_Display_TS(s1);           //用户卡查找黑名单
        else
          Key_Display_TS(s2);           //非用户卡查找白名单
      }
      else
      {					//脱机状态则在本机查询黑/白名单
        CheckBlackWhite=2;		//不再检测黑名单
        TypeOfCheckBW=1;
        Load_BlackVerInfo();		//读入基础黑名单信息
        if ((IcCardData.IcCardType<0x10) && (BlackVerInfo.Ver[0]==0) && (BlackVerInfo.Ver[1]==0))
        {
          Key_Display_TS("黑名单无效!");//用户卡查找黑名单
          return;			//黑名单无效
        }
        Get_Clock(Buffer);		//获得当前时间
        for (i=0;i<4;i++)
        {
          if (Buffer[i]>BlackVerInfo.ValidDate[i])
            break;
          else if (Buffer[i]<BlackVerInfo.ValidDate[i])
          {				//当前日期还不到生效日期
            Key_Display_TS(s3);
            return;
          }
        }
        for (i=0;i<4;i++)
        {
          if (BlackVerInfo.StopDate[i]>Buffer[i])
            break;
          else if (BlackVerInfo.StopDate[i]<Buffer[i])
          {				//当前日期已过截止日期
            Key_Display_TS(s4);
            return;
          }
        }
        if (IcCardData.IcCardType<0x10)
        {				//用户卡查询黑名单
          j=(IcCardData.CardNumber[3]<<4)&0xf0;//省代码高4位
          j|=(IcCardData.CardNumber[4]>>4)&0x0f;//省代码低4位
//          if (BlackVerInfo.ValidRegion[0]!=j)
          if (StationVerInfo.Prov!=j)
          {
            Key_Display_TS("非本省用户卡!");//显示”非本省用户卡“
            return;
          }
          Key_Display_TS(s1);//用户卡查找黑名单
          //目前不判断此批名单生效时间
          Load_DelBlackVerInfo();	//读入新删黑名单信息
          i=DelBlackVerInfo.Number;	//获得新删黑名单数量
          if ((DelBlackVerInfo.Ver!=0) && (i!=0))
          {				//版本号有效且名单数量不为0
            if (Find_BlackWhite(DelBlackFS,i)==1)
            {
              IcCardData.BlackCardFlag=0;//在新删黑名单中
              return;
            }
          }
          Load_AddBlackVerInfo();	//读入新增黑名单信息
          i=AddBlackVerInfo.Number;	//获得新增黑名单数量
          if ((AddBlackVerInfo.Ver!=0) && (i!=0))
          {				//版本号有效且名单数量不为0
            if (Find_BlackWhite(AddBlackFS,i)==1)
            {
	      Save_BlackCard_Transaction();//查到是黑名单后生成交易
              return;			//在新增黑名单中
            }
          }
          i=BlackVerInfo.Number;	//获得基础黑名单数量
          if (i!=0)
          {				//名单数量不为0
            if (Find_BlackWhite(BlackFS,i)==1)
            {
	      Save_BlackCard_Transaction();//查到是黑名单后生成交易
              return;			//在新增黑名单中
            }
            else
              IcCardData.BlackCardFlag=0;//不在黑名单中
          }
          else
            IcCardData.BlackCardFlag=0; //不在黑名单中
        }
        else
        {				//员工卡查询白名单
          Load_WhiteVerInfo();		//读入白名单信息
          i=WhiteVerInfo.Number;	//获得白名单数量
          if (WhiteVerInfo.Ver!=0)
          {
            if (i!=0)
            {				//版本号有效且名单数量不为0
              Key_Display_TS(s2);	//非用户卡查找白名单
              if (Find_BlackWhite(WhiteFS,i)==1)
                IcCardData.BlackCardFlag=0;//在白名单中
              else
                Send_White_Card();
            }
            else
              Send_White_Card();
          }
          else
            Key_Display_TS("白名单无效!");
        }
      }
    }
    else if (CheckBlackWhite==1)
    {					//正在通过PC查询黑/白名单
      if (PCOffLine==1)
        CheckBlackWhite=0;		//已脱机准备在本机查询
    }
  }
  else
    CheckBlackWhite=0;			//清除正在查找黑白名单的标志
}

//保存油品油价信息
Save_PriceVerInfo()
{
  word i;
  PriceVerInfo.CRC=CRC_16((byte *)&PriceVerInfo,LengthOfPriceVerInfo-2);//油站信息的CRC校验和
  i=PriceFS;				//要存储到的扇区号
  i<<=8;				//要存储到的地址
  write_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//向28SF040写入油品油价信息
  write_28sf040(i+256,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//在相邻的扇区再保存一份
}

//清除油品油价信息
Clear_PriceVerInfo()
{
  PriceVerInfo.Ver=0;			//版本号为0
  PriceVerInfo.FieldNum=0;		//记录数为0
  PriceVerInfo.ValidFlag=2;	        //无待生效的单价
  Save_PriceVerInfo();			//存储油品油价信息
  Send_Error_Information("油品油价初始化!");
}

//获得油品油价信息
Load_PriceVerInfo()
{
  word i;
  i=PriceFS;				//要读取的扇区号
  i<<=8;				//要读取的地址
  read_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo1);//从28SF040中读出油品油价信息
  if (PriceVerInfo1.CRC!=CRC_16((byte *)&PriceVerInfo1,LengthOfPriceVerInfo-2))
  {					//28SF040中的油站通用信息不正确
    read_28sf040(i+256,LengthOfPriceVerInfo,(byte *)&PriceVerInfo1);//从相邻扇区读出油品油价信息
    if (PriceVerInfo1.CRC!=CRC_16((byte *)&PriceVerInfo1,LengthOfPriceVerInfo-2))
    {					//相邻扇区中的数据也不正确
      if (PriceVerInfo.CRC==CRC_16((byte *)&PriceVerInfo,LengthOfPriceVerInfo-2))
      {					//SRAM中信息正确
        write_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//向28SF040写入油站通用信息
        write_28sf040(i+256,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//向相邻扇区也写入油站通用信息
      }
      else
        Clear_PriceVerInfo();		//没有油品油价信息,清除
    }
    else
      write_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo1);//向28SF040写入油站通用信息
  }
  read_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//从28SF040中读出油站通用信息
  OilNumber[0]=PriceVerInfo.GDP[0].O_TYPE[0];//保存上次的油品代码
  OilNumber[1]=PriceVerInfo.GDP[0].O_TYPE[1];//保存上次的油品代码
}

//比较当前时间与油价生效时间
//若当前时间等于或晚于生效时间则返回1
Check_Price_Time()
{
  byte i,j;
  word k;
  if ((PriceVerInfo.FieldNum!=0) && ((DataOfNozzle.Status==0) || (DataOfNozzle.Status==10)) &&
      (PriceVerInfo.ValidFlag<2) && (TransactionRecord.NumberOfOfflineSave<(NumberOfTransactionRecord-2)))
  {					//没有加油,有单价待生效且脱机数据少于1999笔
    Get_Clock(Buffer);			//获得当前时间
    for (i=0,j=1;i<6;i++)
    {
      if (Buffer[i]>PriceVerInfo.V_DT[i])
      	break;				//当前时间比生效时间晚
      if (Buffer[i]<PriceVerInfo.V_DT[i])
      {
      	j=0;
      	break;				//当前时间比生效时间早
      }
    }
    if (j==0)
    {					//当前时间比生效时间早
      if (PriceVerInfo.ValidFlag==0)
      {                                 //当前油价还未生效
        Save_TransactionRecord(8);	//对油价信息的回应
        k=PriceVerInfo.GDP[0].PRC[0];   //获得目前的油价
        if (k!=0)
        {                               //油价不为0
          if (Change_SKCPU_Price(k)==1) //向税控CPU 发送请求修改单价的命令
          {
            TimerOfSpeaker=6;
            if (k!=DataOfSave.Price)
            {                           //油价不同
              Set_Price(k);             //修改单价
              if (TransactionRecord.EMP!=0xff)
              {                         //单价改变需自动下班
                Save_TransactionRecord(6);//存储下班数据
                TransactionRecord.EMP=0xff;//无员工上班
                Save_TransactionRecordInfo();//存储成交记录信息
                pop_IC_card();          //下班弹卡
              }
            }
          }
        }
        PriceVerInfo.ValidFlag=1;	//设置当前油价已生效的标志
        Save_PriceVerInfo();		//保存油品油价信息
      }
    }
    if (j==1)
    {					//当前时间与生效时间相同或比生效时间晚
      Save_TransactionRecord(8);	//对油价信息的回应
      k=PriceVerInfo.NextGDP[0].PRC[0]; //获得新的油价
      if (k!=0)
      {                                 //油价不为0
        if (Change_SKCPU_Price(k)==1)   //向税控CPU 发送请求修改单价的命令
        {
          TimerOfSpeaker=6;
          if (k!=DataOfSave.Price)
          {                             //油价不同
            Set_Price(k);               //修改单价
            if (TransactionRecord.EMP!=0xff)
            {                           //单价改变需自动下班
              Save_TransactionRecord(6);//存储下班数据
              TransactionRecord.EMP=0xff;//无员工上班
              Save_TransactionRecordInfo();//存储成交记录信息
              pop_IC_card();            //下班弹卡
            }
          }
        }
      }
      PriceVerInfo.GDP[0].PRC[0]=k;
      PriceVerInfo.ValidFlag=2;	        //设置油价已生效的标志
      Save_PriceVerInfo();		//保存油品油价信息
    }
  }
}

//存储下载的油品油价信息
Save_PriceInfo()
{
  byte i,j;
  byte xdata *px;
  px=StartAddOfRFPC+11;
  PriceVerInfo.Ver=*px++;     	//版本号
  for (i=0;i<6;i++)
    PriceVerInfo.V_DT[i]=*px++;	//新油品油价生效时间
  i=*px++;	                //总的记录数
  if (i!=0)
  {
    PriceVerInfo.FieldNum=i;
    OilNumber[0]=PriceVerInfo.GDP[0].O_TYPE[0];//保存上次的油品代码
    OilNumber[1]=PriceVerInfo.GDP[0].O_TYPE[1];//保存上次的油品代码
    PriceVerInfo.GDP[0].NZN=*px++;//枪号
    PriceVerInfo.GDP[0].O_TYPE[0]=*px++;//油品代码的高字节
    PriceVerInfo.GDP[0].O_TYPE[1]=*px++;//油品代码的低字节
    PriceVerInfo.GDP[0].Den=HexToLong(px,4);//密度
    px+=4;
    j=*px++;
    if (j>8)
      j=8;
    PriceVerInfo.GDP[0].PRC_N=j;//价格数目
    for (i=0;i<j;i++)
    {
      Hex2.c[0]=*px++;		//当前油品油价的高字节
      Hex2.c[1]=*px++;		//当前油品油价的低字节
      PriceVerInfo.GDP[0].PRC[i]=Hex2.i;//当前油品油价
    }
    PriceVerInfo.NextGDP[0].NZN=*px++;//枪号
    PriceVerInfo.NextGDP[0].O_TYPE[0]=*px++;//油品代码的高字节
    PriceVerInfo.NextGDP[0].O_TYPE[1]=*px++;//油品代码的低字节
    PriceVerInfo.NextGDP[0].Den=HexToLong(px,4);//密度
    px+=4;
    j=*px++;
    if (j>8)
      j=8;
    PriceVerInfo.NextGDP[0].PRC_N=j;//价格数目
    for (i=0;i<j;i++)
    {
      Hex2.c[0]=*px++;		//新油品油价的高字节
      Hex2.c[1]=*px++;		//新油品油价的低字节
      PriceVerInfo.NextGDP[0].PRC[i]=Hex2.i;//新油品油价
    }
    PriceVerInfo.ValidFlag=0;   //油价还未生效
  }
  Save_PriceVerInfo();		//保存油品油价信息
  DownLoadFlag=0;		//清除正在下载白名单的标志
}

//根据枪号获得油品代码
//px-油品代码存储地址,NZN-枪号
Get_G_CODE(byte *px,byte NZN)
{
  NZN=1;
  *px++=PriceVerInfo.GDP[0].O_TYPE[0];//油品代码高字节
  *px=PriceVerInfo.GDP[0].O_TYPE[1];//油品代码低字节
}

//根据枪号获得油品代码
//px-油品代码存储地址,NZN-枪号
Get_G_CODE1(byte *px,byte NZN,byte type)
{
  byte code s[]={  //取油品油价时枪号错误!
    0xC8,0xA1,0xD3,0xCD,0xC6,0xB7,0xD3,0xCD,0xBC,0xDB,0xCA,0xB1,
    0xC7,0xB9,0xBA,0xC5,0xB4,0xED,0xCE,0xF3,0xA3,0xA1,0x00};
  byte i,j;
  i=PriceVerInfo.FieldNum;
  for (j=0;j<i;j++)
  {
    if (NZN==PriceVerInfo.GDP[j].NZN) //break;//与油品油价中的枪号相同则退出
      break;
  }
  if (j==i)
  {				//枪号错误
    Send_Error_Information(s);
  }
  else
  {
    if (type==6)
    {
      *px++=OilNumber[0];
      *px=OilNumber[1];
      OilNumber[0]=PriceVerInfo.GDP[0].O_TYPE[0];//保存上次的油品代码
      OilNumber[1]=PriceVerInfo.GDP[0].O_TYPE[1];//保存上次的油品代码
    }
    else
    {
      *px++=PriceVerInfo.GDP[0].O_TYPE[0];//油品代码高字节
      *px=PriceVerInfo.GDP[0].O_TYPE[1];//油品代码低字节
    }
  }
}

//检查是否已有油站通用信息及油品油价信息
byte Check_Info_Ver()
{
  byte code s1[]={  //无油站通用信息!
    0xCE,0xDE,0xD3,0xCD,0xD5,0xBE,0xCD,0xA8,0xD3,0xC3,0xD0,0xC5,0xCF,0xA2,0x21,0x00};
  byte code s2[]={  //无油品油价信息!
    0xCE,0xDE,0xD3,0xCD,0xC6,0xB7,0xD3,0xCD,0xBC,0xDB,0xD0,0xC5,0xCF,0xA2,0x21,0x00};
  if (StationVerInfo.Ver==0)
  {
    Key_Display_TS1(s1);
    return (0);
  }
  if (PriceVerInfo.Ver==0)
  {
    Key_Display_TS1(s2);
    return (0);
  }
  return (1);
}

//保存油站通用信息

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -