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

📄 pc_comm.c

📁 单片机和上位机通讯源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
Save_StationVerInfo()
{
  word i;
  StationVerInfo.CRC=CRC_16((byte *)&StationVerInfo,LengthOfStationVerInfo-2);//油站信息的CRC校验和
  i=StationFS;				//要存储到的扇区号
  i<<=8;				//要存储到的地址
  write_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo);//向28SF040写入油站通用
  Write_2402(AddressOfStationVerInfo,(byte *)&StationVerInfo,LengthOfStationVerInfo);//保存油站信息
}

//清除油站通用信息
Clear_StationVerInfo()
{
  StationVerInfo.Ver=0;			//版本号为0
  StationVerInfo.POS_P=0xff;            //初始通讯终端逻辑编号
  Save_StationVerInfo();		//存储油站通用信息
  Send_Error_Information("油站通用信息初始化!");
}

//获得油站通用信息
Load_StationVerInfo()
{
  word i;
  i=StationFS;				//要读取的扇区号
  i<<=8;				//要读取的地址
  read_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo1);//从28SF040中读出油站通用信息
  if (StationVerInfo1.CRC!=CRC_16((byte *)&StationVerInfo1,LengthOfStationVerInfo-2))
  {					//28SF040中的油站通用信息不正确
    Read_2402(AddressOfStationVerInfo,(byte *)&StationVerInfo1,LengthOfStationVerInfo);//从2402中读取油站通用信息
    if (StationVerInfo1.CRC!=CRC_16((byte *)&StationVerInfo1,LengthOfStationVerInfo-2))
    {					//2402中的油站通用信息也不正确
      if (StationVerInfo.CRC==CRC_16((byte *)&StationVerInfo,LengthOfStationVerInfo-2))
      {					//SRAM中信息正确
        write_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo);//向28SF040写入油站通用信息
        Write_2402(AddressOfStationVerInfo,(byte *)&StationVerInfo,LengthOfStationVerInfo);//保存油站通用信息
      }
      else
        Clear_StationVerInfo();		//没有油站通用信息,清除信息
    }
    else
      write_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo1);//向28SF040写入油站通用信息
  }
  read_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo);//从28SF040中读出油站通用信息
}

//存储下载的油站通用信息
Save_StationInfo()
{
  byte i,j;
  byte xdata *px;
  px=StartAddOfRFPC+11;
  StationVerInfo.Ver=*px++;		//版本号
  StationVerInfo.Prov=*px++;		//省代码
  StationVerInfo.City=*px++;		//地市代码
  for (i=0;i<4;i++)
    StationVerInfo.Superior[i]=*px++;	//上级单位代码
  for (i=0;i<4;i++)
    StationVerInfo.S_ID[i]=*px++;	//加油站ID
  StationVerInfo.POS_P=*px++;		//通讯终端逻辑编号
  j=*px++;				//枪数
  StationVerInfo.GUN_N=j;
  for (i=0;i<j;i++)
    StationVerInfo.NZN[i]=*px++;	//枪号
  Save_StationVerInfo();		//保存油站通用信息
  DownLoadFlag=0;			//清除正在下载白名单的标志
}

//检测员工是否上班
//返回值为1 则员工已上班
byte Test_Employee_On_Duty()
{
  if (TransactionRecord.EMP==0xff)
    return (0);                         //无员工上班
  return (1);
}

//下班操作前检查员工号是否一致
//一致则返回1
byte Check_Employee_Number()
{
  if (TransactionRecord.EMP==IcCardData.EmployeeNumber[0])
  {                        //员工号一致
    return (1);
  }
  else
  {
    Key_Display_TS("员工号不一致,  不能下班!");
    return (0);
  }
}

//员工上下班
//下班成功则返回1
byte Employee_On_Or_Off_Duty(byte *px)
{
  byte i,j,k;
  for (i=0,k=1;i<2;i++)
  {
    j=IcCardData.EmployeePassWord[i];
    if ((j>>4)!=px[k]) break;  //密码不同则退出
    k++;
    j&=0x0f;
    if ((j&0x0f)!=px[k]) break;//密码不同则退出
    k++;
  }
  if ((px[0]==4) && (k==5))
  {                             //输入的密码正确
    if (TransactionRecord.EMP==0xff)
    {                           //上班
      TransactionRecord.EMP=IcCardData.EmployeeNumber[0];//员工号
      for (i=0;i<10;i++)
        TransactionRecord.CardNumber[i]=IcCardData.CardNumber[i];//保存上班时的员工卡号
      TransactionRecord.PassWord[0]=IcCardData.EmployeePassWord[0];//密码
      TransactionRecord.PassWord[1]=IcCardData.EmployeePassWord[1];//密码
      Save_TransactionRecordInfo();//存储成交记录信息
      Save_TransactionRecord(5);//存储上班数据
    }
    else
    {                           //下班
      Save_TransactionRecord(6);//存储下班数据
      TransactionRecord.EMP=0xff;//无员工上班
      Save_TransactionRecordInfo();//存储成交记录信息
      pop_IC_card();      //下班弹卡
    }
    return (1);
  }
  return (0);
}

//检查脱机数据是否已存满
byte Test_Offline_Data()
{
  if (TransactionRecord.NumberOfOfflineSave==NumberOfTransactionRecord)
    return (1);				//已存满
  return (0);
}

//保存成交记录信息
Save_TransactionRecordInfo()
{
  TransactionRecord.CRC=CRC_16((byte *)&TransactionRecord,LengthOfTransactionRecord-2);//成交记录信息的CRC校验和
  Write_2402(AddressOfTransactionRecord1,(byte *)&TransactionRecord,LengthOfTransactionRecord);//保存成交记录信息
  Write_2402(AddressOfTransactionRecord2,(byte *)&TransactionRecord,LengthOfTransactionRecord);//保存成交记录信息
}

//清除成交记录信息
Clear_TransactionRecordInfo(byte flag)
{
  byte code s[]={  //成交数据已清除!
    0xB3,0xC9,0xBD,0xBB,0xCA,0xFD,0xBE,0xDD,0xD2,0xD1,0xC7,0xE5,0xB3,0xFD,0x21,0x00};
  if (flag==1)
  {
    Key_Display_TS1(s);
    TransactionRecord.POS_TTC=0;	//终端交易号初始化为0
    TransactionRecord.SaveAddress=0;	//交易数据存储位置为0
    TransactionRecord.NumberOfOfflineSave=0;//脱机交易数据数量为0
    TransactionRecord.NumberOfTotalSave=0;//总的交易数据数量为0
    TransactionRecord.EMP=0xff;		//员工号为0xff
    TransactionRecord.NumberOfGrayRecord=0;//灰记录数量为0
  }
  if (flag==1)
  {
    Save_TransactionRecordInfo();	//存储成交记录信息
    Send_Error_Information("成交记录信息初始化!");
  }
}

//获得成交记录信息
Load_TransactionRecordInfo()
{
  Read_2402(AddressOfTransactionRecord1,(byte *)&TransactionRecord1,LengthOfTransactionRecord);//从2402中读取成交记录信息
  if ((TransactionRecord1.CRC!=CRC_16((byte *)&TransactionRecord1,LengthOfTransactionRecord-2))
        || (TransactionRecord1.NumberOfOfflineSave>NumberOfTransactionRecord)
        || (TransactionRecord1.NumberOfGrayRecord>NumberOfGrayDataRecord))
  {					//2402中的成交记录信息不正确
    Read_2402(AddressOfTransactionRecord2,(byte *)&TransactionRecord1,LengthOfTransactionRecord);//从2402中读取成交记录信息
    if ((TransactionRecord1.CRC!=CRC_16((byte *)&TransactionRecord1,LengthOfTransactionRecord-2))
        || (TransactionRecord1.NumberOfOfflineSave>NumberOfTransactionRecord)
        || (TransactionRecord1.NumberOfGrayRecord>NumberOfGrayDataRecord))
    {					//2402中的成交记录信息也不正确
      if ((TransactionRecord.CRC==CRC_16((byte *)&TransactionRecord,LengthOfTransactionRecord-2))
           && (TransactionRecord.NumberOfOfflineSave<=NumberOfTransactionRecord)
           && (TransactionRecord.NumberOfGrayRecord<=NumberOfGrayDataRecord))
        Save_TransactionRecordInfo();	//SRAM中信息正确
      else
        Clear_TransactionRecordInfo(1);//没有成交记录信息,清除信息
    }
    else
      Write_2402(AddressOfTransactionRecord1,(byte *)&TransactionRecord,LengthOfTransactionRecord);//保存成交记录信息
  }
  Read_2402(AddressOfTransactionRecord1,(byte *)&TransactionRecord,LengthOfTransactionRecord);
}

//未成交的记录数减一
Dec_TransactionRecord()
{
  Load_TransactionRecordInfo();
  if (TransactionRecord.NumberOfOfflineSave!=0)
  {
    TransactionRecord.NumberOfOfflineSave--;//脱机交易数据数量减一
    Save_TransactionRecordInfo();	    //存储成交记录信息
  }
}

//转换扣款来源
byte Convert_DS(byte i)
{
  switch (i)
  {
    case 0x80:
      i=0;
      break;
    case 0x81:
      i=2;
      break;
    case 0x82:
      i=3;
      break;
    case 0x83:
      i=1;
  }
  return (i);
}

byte Re_Convert_DS(byte i)
{
  switch (i)
  {
    case 0:
      i=0x80;
      break;
    case 1:
      i=0x83;
      break;
    case 2:
      i=0x81;
      break;
    case 3:
      i=0x82;
  }
  return (i);
}

//获得T_MAC
Get_T_MAC()
{
  byte i;
  TransactionData.T_MAC[0]=0x80;
  for (i=1;i<5;i++)
    TransactionData.T_MAC[i]=0;
  for (i=0;i<6;i++)
    TransactionData.INIT[i]=0;
  TransactionData.CRC=0;
  Clear_WatchDog();
  if(account_des()==0)			//计算T_MAC
  EA=1;
  ET0=1;
  IcCardData.DisBuf[30]=0;
  for (i=0;i<4;i++)
    TransactionData.T_MAC[i]=IcCardData.T_MAC[i];
}

//计算非卡加油时的平均单价
word Get_Average_Price()
{
  dword i,j;
  i=DataOfSave.NoCardMoney;		//非卡加油的金额
  i*=100;                               //两位小数
  j=DataOfSave.NoCardLitre;		//非卡加油的油量
  i+=j/2;				//4舍5入
  i/=j;
  return (i);
}

//存储非卡成交数据
NoCard_Transaction()
{
  byte i;
  Read_Last_Transaction();	//读取最后一笔成交数据
  for (i=0;i<4;i++)
    Hex4.c[i]=TransactionData.V_TOT[i];
  if (Hex4.i!=DataOfSave.TotalLitre)
    Save_TransactionRecord(7);	//还未上送非卡交易数据则存储
  DataOfSave.NoCardMoney=0;
  DataOfSave.NoCardLitre=0;
  Save_Data();
}

//试图加油
Attempt_Refueling()
{
  IcCardData.TAC[0]=0x10;
  IcCardData.TAC[1]=5;
  IcCardData.TAC[2]=0;
  IcCardData.TAC[3]=0;
  Save_TransactionRecord(9);	//存储试图加油数据
  pop_IC_card();
}

//加油结束后生成成交记录
Make_TransactionRecord(byte Type)
{
  byte i,j;
  j=Type&0x0f;
  TransactionData.POS_TTC=TransactionRecord.POS_TTC;
  TransactionData.T_TYPE=Type;		//交易类型
  if ((j>4) && (j<9))
  {
    Get_Clock(Buffer);			//获得当前时间
    for (i=0;i<7;i++)
      TransactionData.TIME[i]=Buffer[i];//日期及时间
  }
  else
  {
    for (i=0;i<7;i++)
      TransactionData.TIME[i]=IcCardData.CurrentTimer[i];//日期及时间
  }
  if ((j==7) || (j==8))
  {
    for (i=0;i<10;i++)
      TransactionData.ASN[i]=0;		//卡应用号填0
  }
  else
  {
    if (j==6)
    {                                   //下班
      for (i=0;i<10;i++)
        TransactionData.ASN[i]=TransactionRecord.CardNumber[i];//卡应用号
    }
    else
    {
      for (i=0;i<10;i++)
        TransactionData.ASN[i]=IcCardData.CardNumber[i];//卡应用号
    }
  }
  if (j>6)
  {
    for (i=0;i<4;i++)
      TransactionData.BAL[i]=0;		//卡余额填0
  }
  else
  {
    if (j==6)
    {                                   //下班
      for (i=0;i<10;i++)
        if (TransactionRecord.CardNumber[i]!=IcCardData.CardNumber[i])
          break;                        //上班时的员工卡号与下班时不相同
      if (i!=10)
      {                                 //上班时的员工卡号与下班时不相同
        for (i=0;i<4;i++)
          TransactionData.BAL[i]=0;	//卡余额填0
      }
      else
      {                                 //卡号相同
        for (i=0;i<4;i++)
        TransactionData.BAL[i]=IcCardData.IcBackBlanceBuf[i];//卡余额
      }
    }
    else
    {
      for (i=0;i<4;i++)
        TransactionData.BAL[i]=IcCardData.IcBackBlanceBuf[i];//卡余额
    }
  }
  if (j>4)
  {
    if (j==7)
      LongToHex(DataOfSave.NoCardMoney,TransactionData.AMN,3);//非卡交易金额
    else
    {
      for (i=0;i<3;i++)

⌨️ 快捷键说明

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