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

📄 pc_comm.c

📁 单片机和上位机通讯源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        TransactionData.AMN[i]=0;
    }
    TransactionData.CTC[0]=0;
    TransactionData.CTC[1]=0;
  }
  else
  {
    for (i=0;i<3;i++)
      TransactionData.AMN[i]=IcCardData.BussinesMoney[i+1];//数额
    TransactionData.CTC[0]=IcCardData.CTC[0];//卡交易序号高字节
    TransactionData.CTC[1]=IcCardData.CTC[1];//卡交易序号低字节
  }
  if ((j>4) && (j!=9))
  {
    for (i=0;i<4;i++)
      TransactionData.TAC[i]=0;
  }
  else
  {
    if (j==1)
    {					//逃卡
      for (i=0;i<4;i++)
        TransactionData.TAC[i]=IcCardData.GTAC[i];//逃卡时为GTAC
    }
    else
    {
      for (i=0;i<4;i++)
        TransactionData.TAC[i]=IcCardData.TAC[i];
    }
  }
  if ((j==1) || (j==2))
  {
    for (i=0;i<4;i++)
      TransactionData.GMAC[i]=IcCardData.GMAC[i];//解灰认证码
    for (i=0;i<4;i++)
      TransactionData.PSAM_TAC[i]=IcCardData.SAMTAC[i];//灰锁签名
  }
  else
  {
    for (i=0;i<4;i++)
      TransactionData.GMAC[i]=0;
    for (i=0;i<4;i++)
      TransactionData.PSAM_TAC[i]=0;
  }
  if (j>4)
  {
    for (i=0;i<10;i++)
      TransactionData.PSAM_ASN[i]=0;//PSAM应用号
    for (i=0;i<6;i++)
      TransactionData.PSAM_TID[i]=0;//PSAM编号
    for (i=0;i<4;i++)
      TransactionData.PSAM_TTC[i]=0;//PSAM-TTC
    TransactionData.DS=0;//扣款来源
  }
  else
  {
    for (i=0;i<10;i++)
      TransactionData.PSAM_ASN[i]=IcCardData.PsamCardNumber[i];//PSAM应用号
    for (i=0;i<6;i++)
      TransactionData.PSAM_TID[i]=IcCardData.PSAMTID[i];//PSAM编号
    for (i=0;i<4;i++)
      TransactionData.PSAM_TTC[i]=IcCardData.PsamTTC[i];//PSAM-TTC
    TransactionData.DS=Convert_DS(IcCardData.DecMoneyType);//扣款来源
  }
  if (j>2)
  {
    TransactionData.UNIT=0;
    TransactionData.C_TYPE=0;
  }
  else
  {
    if (Get_Card_Type()<0x10)
      TransactionData.UNIT=TransactionData.DS;//用户卡结算方式
    else
    {
      if (IcCardData.DsChangeFlag[1]>5)
        IcCardData.DsChangeFlag[1]=0;
      TransactionData.UNIT=IcCardData.DsChangeFlag[1]<<4;//员工卡结算方式
    }
    TransactionData.C_TYPE=0;		//卡类
  }
  if (j>4)
    TransactionData.VER=0;
  else
  {
    i=IcCardData.PsamPasWodIndex<<4;	//卡密钥索引号
    i&=0xf0;
    i|=IcCardData.IcCardPasWodVer&0x0f;	//卡密钥版本号
    TransactionData.VER=i;		//版本
  }
  TransactionData.NZN=StationVerInfo.NZN[0];//枪号
  if ((j<3) || ((j>4) && (j<8)))
  {
    Get_G_CODE1((byte *)&TransactionData.G_CODE,TransactionData.NZN,j);//获得油品代码
  }
  else
  {
    TransactionData.G_CODE[0]=0;
    TransactionData.G_CODE[1]=0;
  }
  if (j<3)
  {
    LongToHex(Get_Current_Litre(),TransactionData.VOL,3);//加油数额
    TransactionData.PRC[0]=DataOfNozzle.Price>>8;//成交价格高字节
    TransactionData.PRC[1]=DataOfNozzle.Price;//成交价格低字节
  }
  else
  {
    if (j==7)
    {
      LongToHex(DataOfSave.NoCardLitre,TransactionData.VOL,3);//加油数额
      Hex2.i=Get_Average_Price();		//计算出平均单价
      TransactionData.PRC[0]=Hex2.c[0];		//成交价格高字节
      TransactionData.PRC[1]=Hex2.c[1];		//成交价格低字节
    }
    else
    {
      for (i=0;i<3;i++)
        TransactionData.VOL[i]=0;
      TransactionData.PRC[0]=0;
      TransactionData.PRC[1]=0;
    }
  }
  if ((j==3) || (j==4) || (j>7))
  {
    for (i=0;i<4;i++)
      TransactionData.V_TOT[i]=0;
  }
  else
  {
    if (j<3)
      LongToHex(DataOfSave.TotalLitre+Get_Current_Litre(),TransactionData.V_TOT,4);//本次加油后的升总累计
    else
      LongToHex(DataOfSave.TotalLitre,TransactionData.V_TOT,4);//本次加油后的升总累计
  }
  if (j==8)
    TransactionData.EMP=0;
  else
    TransactionData.EMP=TransactionRecord.EMP;//员工号
  for (i=0;i<11;i++)
    TransactionData.RFU[i]=0;		//备用
  Get_T_MAC();				//计算T_MAC
  TransactionData.CRC=CRC_16((byte *)&TransactionData.POS_TTC,LengthOfTransactionData-2);
}

//向28SF040中写入交易数据(包括灰记录)
//type:0-交易数据、1-灰记录
//返回值为1 则写入成功
byte Save_TransactionData(byte type,word Num)
{
  dword i;
  switch (type)
  {
    case 0:
      i=TransactionDataFS;		//交易记录数据存储的首扇区号
      break;
    case 1:
      i=GrayRecordDataFS;		//灰记录数据存储的首扇区号
      break;
    default:
      return (0);
  }
  i+=Num/2;				//待写入的灰记录数据存储的扇区号
  i<<=8;				//要存储到的扇区的地址
  if ((Num%2)==1)
    i+=128;				//每扇区存储2 条数据
  for (;;)
  {
    Clear_WatchDog();
    write_28sf040(i,LengthOfTransactionData,(byte *)&TransactionData.CRC);//向28SF040写入交易数据
    read_28sf040(i,LengthOfTransactionData,(byte *)&TransactionData1.CRC);//从28SF040读出交易数据
    if ((TransactionData1.CRC==TransactionData.CRC) &&
        (TransactionData1.CRC==CRC_16((byte *)&TransactionData1.POS_TTC,LengthOfTransactionData-2)))
      break;
  }
  return (1);
}

//从28SF040中读取交易数据(包括灰记录)
//type:0-交易数据、1-灰记录
//返回值为1 则读取的数据有效
byte Load_TransactionData(byte type,word Num)
{
  dword i;
  switch (type)
  {
    case 0:
      i=TransactionDataFS;		//交易记录数据存储的首扇区号
      break;
    case 1:
      i=GrayRecordDataFS;		//灰记录数据存储的首扇区号
      break;
    default:
      return (0);
  }
  i+=Num/2;				//待读取的灰记录数据存储的扇区号
  i<<=8;				//要读取的扇区地址
  if ((Num%2)==1)
    i+=128;				//每扇区存储2 条数据
  read_28sf040(i,LengthOfTransactionData,(byte *)&TransactionData.CRC);//从28SF040中读出交易数据
  if (TransactionData.CRC==CRC_16((byte *)&TransactionData.POS_TTC,LengthOfTransactionData-2))
    return (1);				//读出的数据有效
//  TransactionData.POS_TTC=0;
  return (0);				//无效
}

//解灰前查找匹配的灰记录
//返回值小于NumberOfGrayDataRecord 则为匹配的灰记录号
byte Find_GrayRecord()
{
  byte i,j,k;
  k=TransactionRecord.NumberOfGrayRecord;
  if (k==0)
    return (NumberOfGrayDataRecord);
  for (i=0;i<k;i++)
  {
    Clear_WatchDog();
    Load_TransactionData(1,i);		//读取第i 条灰记录
    for (j=0;j<10;j++)
      if (TransactionData.ASN[j]!=IcCardData.CardNumber[j])
        break;				//卡应用号不同则退出
    if (j!=10) continue;
    for (j=0;j<4;j++)
      if (TransactionData.BAL[j]!=IcCardData.IcBackBlanceBuf[j])
        break;				//余额不同则退出
    if (j!=4) continue;
    for (j=0;j<2;j++)
      if (TransactionData.CTC[j]!=IcCardData.CTC[j])
        break;				//CTC不同则退出
    if (j!=2) continue;
    if (TransactionData.DS!=Convert_DS(IcCardData.DecMoneyType))
      continue;				//扣款来源不同则退出
    for (j=0;j<7;j++)
      if (TransactionData.TIME[j]!=IcCardData.CurrentTimer[j])
        break;				//日期和时间不同则退出
    if (j==7) break;
  }
  if (i==k)
    return (NumberOfGrayDataRecord);
  return (i);
}

//解扣后查找匹配的灰记录
//返回值小于NumberOfGrayDataRecord 则为匹配的灰记录号
byte Find1_GrayRecord()
{
  byte i,j;
  for (i=0;i<NumberOfGrayDataRecord;i++)
  {
    Clear_WatchDog();
    Load_TransactionData(1,i);		//读取第i 条灰记录
    for (j=0;j<10;j++)
      if (TransactionData.ASN[j]!=GrayData.ASN[j])
        break;				//卡应用号不同则退出
    if (j!=10) continue;
    for (j=0;j<4;j++)
      if (TransactionData.BAL[j]!=GrayData.BAL[j])
        break;				//余额不同则退出
    if (j!=4) continue;
    for (j=0;j<3;j++)
      if (TransactionData.AMN[j]!=GrayData.AMN[j])
        break;				//交易额不同则退出
    if (j!=3) continue;
    for (j=0;j<2;j++)
      if (TransactionData.CTC[j]!=GrayData.CTC[j])
        break;				//CTC不同则退出
    if (j!=2) continue;
    if (TransactionData.DS!=GrayData.DS)
      continue;				//扣款来源不同则退出
    for (j=0;j<7;j++)
      if (TransactionData.TIME[j]!=GrayData.TIME[j])
        break;				//日期和时间不同则退出
    if (j!=7) continue;
    for (j=0;j<4;j++)
      if (TransactionData.GMAC[j]!=GrayData.GMAC[j])
        break;				//解灰认证码不同则退出
    if (j!=4) continue;
    for (j=0;j<6;j++)
      if (TransactionData.PSAM_TID[j]!=GrayData.PSAM_TID[j])
        break;				//PSAM应用编号不同则退出
    if (j!=6) continue;
    for (j=0;j<4;j++)
      if (TransactionData.PSAM_TTC[j]!=GrayData.PSAM_TTC[j])
        break;				//PSAM的TTC不同则退出
    if (j==4) break;
  }
  return (i);
}

//查找最早的一条灰记录
//返回值为该条灰记录的位置
byte Find_First_GrayRecord()
{
  byte i,j,k;
  k=0;
  Load_TransactionData(1,0);            //读取第一条灰记录
  for (j=0;j<7;j++)
    Buffer[j]=TransactionData.TIME[j];
  for (i=1;i<NumberOfGrayDataRecord;i++)
  {
    Load_TransactionData(1,i);          //读取下面的灰记录
    for (j=0;j<7;j++)
    {
      if (Buffer[j]>TransactionData.TIME[j])
      {
        k=i;                            //当前灰记录为最早的
        for (j=0;j<7;j++)
          Buffer[j]=TransactionData.TIME[j];
      	break;
      }
      if (Buffer[j]<TransactionData.TIME[j])
      	break;				//当前灰记录为较新的
    }
  }
  return (k);                           //返回最早的灰记录的位置
}

//存储成交记录
Save_TransactionRecord(byte Type)
{
  byte i;
  Load_TransactionRecordInfo();         //读取成交记录信息
  Clear_WatchDog();
  if (TransactionRecord.NumberOfOfflineSave<NumberOfTransactionRecord)
  {					//脱机数据没有2000笔
    TransactionRecord.POS_TTC++;	//终端交易号加一
    if (Type==9)
      Type|=0x80;			//卡错
    if ((Type<5) && (IcCardData.TACReadSuccessFlag==1))
      Type|=0x10;			//扣款签名有效
    if ((Type!=7) && (Type!=8) && (TypeOfCheckBW==1))
      Type|=0x40;			//使用油机内黑/白名单
    Clear_WatchDog();
    Make_TransactionRecord(Type);	//产生成交数据
    Save_TransactionData(0,TransactionRecord.SaveAddress);//存储交易数据
    Clear_WatchDog();
    if ((Type&0x0f)==1)
    {					//加油中逃卡
      if (TransactionRecord.NumberOfGrayRecord<NumberOfGrayDataRecord)
      {
        Save_TransactionData(1,TransactionRecord.NumberOfGrayRecord);//存储灰记录数据
        TransactionRecord.NumberOfGrayRecord++;//灰记录数量增加1
      }
      else
      {					//灰记录已经有NumberOfGrayDataRecord笔,则替换掉最早的一笔
        i=Find_First_GrayRecord();      //获得最早的灰记录的位置
        Load_TransactionData(0,TransactionRecord.SaveAddress);//读取最后一笔成交数据
        Save_TransactionData(1,i);      //存储灰记录数据
      }
    }
    else if ((Type&0x0f)==3)
    {					//补扣
      if (TransactionRecord.NumberOfGrayRecord!=0)
      {					//有灰记录
      	i=Find1_GrayRecord();		//查找匹配的灰记录
      	if (i!=NumberOfGrayDataRecord)
      	{				//i 就是匹配的灰记录号
          TransactionRecord.NumberOfGrayRecord--;//灰记录数量减一
          if (TransactionRecord.NumberOfGrayRecord!=i)
          {
      	    Load_TransactionData(1,TransactionRecord.NumberOfGrayRecord);//读取最后一条灰记录
            Save_TransactionData(1,i);	//存储到刚刚删除的灰记录处
          }
        }
      }
    }
    TransactionRecord.SaveAddress++;	//交易数据存储位置加一
    if (TransactionRecord.SaveAddress>=NumberOfTransactionRecord)
      Transac

⌨️ 快捷键说明

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