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

📄 pc_comm.c

📁 单片机和上位机通讯源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
  read_28sf040(i,LengthOfAddBlackVerInfo,(byte *)&AddBlackVerInfo1);//从28SF040中读出新增黑名单信息
  if (AddBlackVerInfo1.CRC!=CRC_16((byte *)&AddBlackVerInfo1,LengthOfAddBlackVerInfo-2))
  {					//28SF040中的新增黑名单信息不正确
    Read_2402(AddressOfAddBlackVerInfo,(byte *)&AddBlackVerInfo1,LengthOfAddBlackVerInfo);//从2402中读取新增黑名单信息
    if (AddBlackVerInfo1.CRC!=CRC_16((byte *)&AddBlackVerInfo1,LengthOfAddBlackVerInfo-2))
    {					//2402中的新增黑名单信息也不正确
      if (AddBlackVerInfo.CRC==CRC_16((byte *)&AddBlackVerInfo,LengthOfAddBlackVerInfo-2))
      {					//SRAM中信息正确
        write_28sf040(i,LengthOfAddBlackVerInfo,(byte *)&AddBlackVerInfo);//向28SF040写入新增黑名单
        Write_2402(AddressOfAddBlackVerInfo,(byte *)&AddBlackVerInfo,LengthOfAddBlackVerInfo);//保存新增黑名单信息
      }
      else
      {
        Clear_AddBlackVerInfo();	//没有新增黑名单信息,清除信息
        Send_Error_Information("新增黑名单初始化!");
      }
    }
    else
      write_28sf040(i,LengthOfAddBlackVerInfo,(byte *)&AddBlackVerInfo1);//向28SF040写入新增黑名单
  }
  read_28sf040(i,LengthOfAddBlackVerInfo,(byte *)&AddBlackVerInfo);//从28SF040中读出新增黑名单信息
}

//存储新增黑名单信息
Save_AddBlackList_Info()
{
  DownLoadFlag=0;			//清除正在下载新增黑名单的标志
  AddBlackVerInfo.Ver=InfoList[1];	//版本号
  AddBlackVerInfo.Number=InfoList[15];	//名单数量
  Save_AddBlackVerInfo();		//保存新增黑名单版本信息
}
//存储新增黑名单
Save_AddBlackList()
{
  byte i;
  word j;
  if (ApplyDownLoad==2)
  {					//下载数据为新增黑名单信息
    for (i=0;i<16;i++)
      InfoList[i]=XBYTE[StartAddOfRFPC+11+i];//暂存新增黑名单信息
    if (DLTotalLength==16)
      Save_AddBlackList_Info();		//数据全部下载完毕
    else
    {
      Clear_AddBlackVerInfo();		//清除新增黑名单版本号
      DLSector=1;			//继续下载的数据存储在第二个扇区中
    }
  }
  else
  {
    i=ValidLengthOfRFPC-5;		//下载数据的实际长度
    Save_BLackWhite_List(i,DLSector+AddBlackFS);//存储到28SF040中
    j=(DLSector-1)*240;
    j+=i+16;				//得到实际已经下载的数据的长度
    if (j>=DLTotalLength)
      Save_AddBlackList_Info();		//数据全部下载完毕
    else
      DLSector++;			//要写入的扇区号加一,继续下载
  }
}

//保存新删黑名单的版本信息
Save_DelBlackVerInfo()
{
  word i;
  DelBlackVerInfo.CRC=CRC_16((byte *)&DelBlackVerInfo,LengthOfDelBlackVerInfo-2);//新删黑名单的CRC校验和
  i=DelBlackFS;				//要存储到的扇区号
  i<<=8;				//要存储到的地址
  write_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo);//向28SF040写入新删黑名单
  Write_2402(AddressOfDelBlackVerInfo,(byte *)&DelBlackVerInfo,LengthOfDelBlackVerInfo);//保存新删黑名单信息
}

//清除新删黑名单的版本信息
Clear_DelBlackVerInfo()
{
  DelBlackVerInfo.Ver=0;		//版本号为0
  DelBlackVerInfo.Number=0;		//名单数量为0
  Save_DelBlackVerInfo();		//存储新删黑名单
}

//获得新删黑名单的版本信息
Load_DelBlackVerInfo()
{
  word i;
  i=DelBlackFS;				//要读取的扇区号
  i<<=8;				//要读取的地址
  read_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo1);//从28SF040中读出新删黑名单信息
  if (DelBlackVerInfo1.CRC!=CRC_16((byte *)&DelBlackVerInfo1,LengthOfDelBlackVerInfo-2))
  {					//28SF040中的新删黑名单信息不正确
    Read_2402(AddressOfDelBlackVerInfo,(byte *)&DelBlackVerInfo1,LengthOfDelBlackVerInfo);//从2402中读取新删黑名单信息
    if (DelBlackVerInfo1.CRC!=CRC_16((byte *)&DelBlackVerInfo1,LengthOfDelBlackVerInfo-2))
    {					//2402中的新删黑名单信息也不正确
      if (DelBlackVerInfo.CRC==CRC_16((byte *)&DelBlackVerInfo,LengthOfDelBlackVerInfo-2))
      {					//SRAM中信息正确
        write_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo);//向28SF040写入新删黑名单
        Write_2402(AddressOfDelBlackVerInfo,(byte *)&DelBlackVerInfo,LengthOfDelBlackVerInfo);//保存新删黑名单信息
      }
      else
      {
        Clear_DelBlackVerInfo();	//没有新删黑名单信息,清除信息
        Send_Error_Information("新删黑名单初始化!");
      }
    }
    else
      write_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo1);//向28SF040写入新删黑名单
  }
  read_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo);//从28SF040中读出新删黑名单信息
}

//存储新删黑名单信息
Save_DelBlackList_Info()
{
  DownLoadFlag=0;			//清除正在下载新删黑名单的标志
  DelBlackVerInfo.Ver=InfoList[1];	//版本号
  DelBlackVerInfo.Number=InfoList[15];	//名单数量
  Save_DelBlackVerInfo();		//保存新删黑名单版本信息
}

//存储新删黑名单
Save_DelBlackList()
{
  byte i;
  word j;
  if (ApplyDownLoad==3)
  {					//下载数据为新删黑名单信息
    for (i=0;i<16;i++)
      InfoList[i]=XBYTE[StartAddOfRFPC+11+i];//暂存新删黑名单信息
    if (DLTotalLength==16)
      Save_DelBlackList_Info();		//数据全部下载完毕
    else
    {
      Clear_DelBlackVerInfo();		//清除新删黑名单版本号
      DLSector=1;			//继续下载的数据存储在第二个扇区中
    }
  }
  else
  {
    i=ValidLengthOfRFPC-5;		//下载数据的实际长度
    Save_BLackWhite_List(i,DLSector+DelBlackFS);//存储到28SF040中
    j=(DLSector-1)*240;
    j+=i+16;				//得到实际已经下载的数据的长度
    if (j>=DLTotalLength)
      Save_DelBlackList_Info();		//数据全部下载完毕
    else
      DLSector++;			//要写入的扇区号加一,继续下载
  }
}

//保存白名单的版本信息
Save_WhiteVerInfo()
{
  word i;
  WhiteVerInfo.CRC=CRC_16((byte *)&WhiteVerInfo,LengthOfWhiteVerInfo-2);//白名单的CRC校验和
  i=WhiteFS;				//要存储到的扇区号
  i<<=8;				//要存储到的地址
  write_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo);//向28SF040写入白名单
  Write_2402(AddressOfWhiteVerInfo,(byte *)&WhiteVerInfo,LengthOfWhiteVerInfo);//保存白名单信息
}

//清除白名单的版本信息
Clear_WhiteVerInfo()
{
  WhiteVerInfo.Ver=0;			//版本号为0
  WhiteVerInfo.Number=0;		//名单数量为0
  Save_WhiteVerInfo();			//存储白名单
}

//获得白名单的版本信息
Load_WhiteVerInfo()
{
  word i;
  i=WhiteFS;				//要读取的扇区号
  i<<=8;				//要读取的地址
  read_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo1);//从28SF040中读出白名单信息
  if (WhiteVerInfo1.CRC!=CRC_16((byte *)&WhiteVerInfo1,LengthOfWhiteVerInfo-2))
  {					//28SF040中的白名单信息不正确
    Read_2402(AddressOfWhiteVerInfo,(byte *)&WhiteVerInfo1,LengthOfWhiteVerInfo);//从2402中读取白名单信息
    if (WhiteVerInfo1.CRC!=CRC_16((byte *)&WhiteVerInfo1,LengthOfWhiteVerInfo-2))
    {					//2402中的白名单信息也不正确
      if (WhiteVerInfo.CRC==CRC_16((byte *)&WhiteVerInfo,LengthOfWhiteVerInfo-2))
      {					//SRAM中信息正确
        write_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo);//向28SF040写入白名单
        Write_2402(AddressOfWhiteVerInfo,(byte *)&WhiteVerInfo,LengthOfWhiteVerInfo);//保存白名单信息
      }
      else
      {
        Clear_WhiteVerInfo();		//没有白名单信息,清除信息
        Send_Error_Information("白名单初始化!");
      }
    }
    else
      write_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo1);//向28SF040写入白名单
  }
  read_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo);//从28SF040中读出白名单信息
}

//存储白名单
Save_WhiteList_Info()
{
  DownLoadFlag=0;			//清除正在下载白名单的标志
  WhiteVerInfo.Ver=InfoList[1];		//版本号
  WhiteVerInfo.Number=InfoList[15];	//名单数量
  Save_WhiteVerInfo();			//保存白名单版本信息
}

//存储白名单
Save_WhiteList()
{
  byte i;
  word j;
  if (ApplyDownLoad==4)
  {					//下载数据为白名单信息
    for (i=0;i<16;i++)
      InfoList[i]=XBYTE[StartAddOfRFPC+11+i];//暂存白名单信息
    if (DLTotalLength==16)
      Save_WhiteList_Info();		//数据全部下载完毕
    else
    {
      Clear_WhiteVerInfo();		//清除白名单版本号
      DLSector=1;			//继续下载的数据存储在第二个扇区中
    }
  }
  else
  {
    i=ValidLengthOfRFPC-5;		//下载数据的实际长度
    Save_BLackWhite_List(i,DLSector+WhiteFS);//存储到28SF040中
    j=(DLSector-1)*240;
    j+=i+16;				//得到实际已经下载的数据的长度
    if (j>=DLTotalLength)
      Save_WhiteList_Info();		//数据全部下载完毕
    else
      DLSector++;			//要写入的扇区号加一,继续下载
  }
}

//比较待查的卡应用号与将要读出的卡应用号是否一致
//一致则返回1、若待查大于读出则返回2、小于则返回3
byte Compare_CardNumber(word Sector,word Num)
{
  byte i,j,k;
  dword l;
  Num--;
  l=Num/24;				//该记录所在扇区的偏移量
  l+=Sector+1;				//绝对扇区号
  l<<=8;				//扇区的首地址
  i=Num%24;				//该记录在扇区内的偏移量
  i*=10;
  i++;
  l+=i;			                //该记录所在的地址
  read_28sf040(l,10,Buffer);		//从28SF040中读出卡应用号
  for (i=0;i<10;i++)
  {
    j=Buffer[i];
    k=IcCardData.CardNumber[i];
    if (k>j)
      return (2);			//大于
    if (k<j)
      return (3);			//小于
  }
  return (1);				//一致
}

//用二分法查找升序排列的黑/白名单
//Sector:名单所在的第一个扇区号、Number:名单的数量
//找到匹配的名单则返回1
byte Find_BlackWhite(word Sector,word Number)
{
  byte i,i1;
  word j,j1,j2;
  if (Number==1)
    return (Compare_CardNumber(Sector,1));//只有唯一的名单直接从第一个扇区中取数
  else
  {
    for (i=2,j=2;i<16;i++)		//先计算需要查找的次数
    {
      if (Number<=(j+1)) break;
      j*=2;
    }
    j++;				//i为要查找的最大次数,j为补齐后的最大名单数
    j1=1;				//查找范围为j1-j
    for (;i>0;i--)
    {
      Clear_WatchDog();
      j2=j-j1;
      if (j2==1)
      {					//已经是最后一次查找
        i1=Compare_CardNumber(Sector,j1);
        if (i1==1)
          return (1);			//找到匹配的记录
        i1=Compare_CardNumber(Sector,j);
        if (i1==1)
          return (1);			//找到匹配的记录
        return (0);			//没有找到匹配的记录
      }
      j2/=2;
      j2+=j1;			        //查找中间的记录
      i1=Compare_CardNumber(Sector,j2);
      switch (i1)
      {
        case 1:
          return (1);			//找到匹配的记录
        case 2:
        {				//卡号比刚刚读出的卡号大,则向后查找
          j1=j2;
          for (;;)
          {
            j2=j-j1;
            j2/=2;
            j2+=j1;
            if (j2>Number)
            {				//已超出范围
              j=j2;			//前向查找
              i--;			//查找次数减少一次
            }
            else
              break;
          }
        } break;
        case 3:
        {				//卡号比刚刚读出的卡号小,则向前查找
          j=j2;
        }
      }
    }
  }
  return (0);				//不匹配
}

//查到是黑名单后生成交易
Save_BlackCard_Transaction()
{
  IcCardData.TAC[0]=0;
  IcCardData.TAC[1]=1;
  Save_TransactionRecord(9);
  Key_Display_TS1("已挂失卡!");		//显示“已挂失卡”
  lock_pin();//黑名单卡锁密码
}

Send_White_Card()
{
  byte code s1[]={  //非本站管理卡!
    0xB7,0xC7,0xB1,0xBE,0xD5,0xBE,0xB9,0xDC,0xC0,0xED,0xBF,0xA8,0x21,0x00};
  byte code s2[]={  //非本站员工卡!
    0xB7,0xC7,0xB1,0xBE,0xD5,0xBE,0xD4,0xB1,0xB9,0xA4,0xBF,0xA8,0x21,0x00};
  byte code s3[]={  //非本站验泵卡!
    0xB7,0xC7,0xB1,0xBE,0xD5,0xBE,0xD1,0xE9,0xB1,0xC3,0xBF,0xA8,0x21,0x00};
  byte code s4[]={  //非本站维修卡!
    0xB7,0xC7,0xB1,0xBE,0xD5,0xBE,0xCE,0xAC,0xD0,0xDE,0xBF,0xA8,0x21,0x00};
  switch (IcCardData.CardNumber[2])
  {
    case 0x02:
      Key_Display_TS(s1);	//显示“非本站管理卡”
      break;
    case 0x04:
      Key_Display_TS(s2);	//显示“非本站员工卡”
      break;
    case 0x05:
      Key_Display_TS(s3);	//显示“非本站验泵卡”
      break;
    case 0x06:
      Key_Display_TS(s4);	//显示“非本站维修卡”
      break;
  }
}

//查找黑白名单
Check_BlackWhiteList()
{
  word i;
  byte j;
  char code s1[]={  //正在查找黑名单!

⌨️ 快捷键说明

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