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

📄 syris.cpp

📁 企业员工考勤和工资管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <windows.h>
#include <stdio.h>

#include "vtl.h"
#include "syris.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

static  HANDLE  ComPort=INVALID_HANDLE_VALUE;
static  int nSyrisError=SYRIS_NOERROR;
static  int nSyrisTimeOut=200; //超时的时间值

//获取Syris字符串的CRC
static int GetSyrisCRC(char *crcBuf,int nSize);
//检查Syris字符串的CRC
static int CheckSyrisCRC(char *crcBuf,int nSize);

static int GetSendBuf(char *pszBuf,char *pszID,char *pszFC,
  char *Param1,char *Param2);
static int GetSyrisState(char *pszBuf,int nSize);
//将整数转为十进制字符串(高位在前)
static long IntToDec(char *pszBuf,int ss,int n);
//将整数转为两字节十进制数(高位在前)
static long IntToDec2(char *pszBuf,int ss);
//将整数转为n字节十六进制数(高位在前)
static long IntToHex(char *pszBuf,int ss,int n);
//将n字节十六进制数(高位在前)转为整数
static int HexToInt(char *pszBuf,int n);

#ifdef SYRIS_DLL
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
 {
  return 1;
 }
#endif

// ************** Part 1. Communication Port ******************//
//初始化通讯端口
SYRISPROC int Syris_InitComm(int nCom)
 {
  SDCB dDcb;
  int rc;

  dDcb.nCom = nCom;
  dDcb.nInQue=1024;
  dDcb.nOutQue=1024;
  dDcb.BaudRate = CBR_19200;
  dDcb.Parity = EVENPARITY;   /*偶校验*/
  dDcb.ByteSize = DATABITS_8;
  dDcb.StopBits = ONESTOPBIT;  /*一个停止位*/

  ComPort = InitCommWithSDCB(&dDcb);
  if(ComPort==INVALID_HANDLE_VALUE) rc=FALSE;
  else rc=TRUE;
  if(rc==FALSE)Syris_SetError(SYRISERR_NOCOMM);
  else Syris_SetError(SYRIS_NOERROR);
  return (rc);
 }
//测试通讯端口
SYRISPROC int Syris_TestComm(int nCom,int nPort)
 {
  int rc,i;

  rc=Syris_InitComm(nCom);
  if(rc){ //端口能打开
    if(nPort>0)//读取一个控制器版本
      rc=Syris_GetVersion(nPort,NULL);
    else {
      for(i=1;i<=10;i++){
        rc=Syris_GetVersion(i,NULL);
        if(rc==SYRIS_NOERROR)break;
       }
     }
    if(rc==SYRIS_NOERROR)rc=TRUE;
    else{//端口未联Syris控制器
      Syris_CloseComm();
      rc=FALSE;
     }
   }
  return(rc);
 }
// 关闭通讯端口
SYRISPROC int Syris_CloseComm(void)
 {
  if(ComPort!=INVALID_HANDLE_VALUE)
   CloseHandle(ComPort);
  ComPort=INVALID_HANDLE_VALUE;
  return(TRUE);
 }
//获取端口句柄
SYRISPROC int Syris_GetCommHandle(void)
 {
  return((int)ComPort);
 }

//将整数转为十进制字符串(高位在前)
long IntToDec(char *pszBuf,int ss,int n)
 {
  int i,m;
  char *p;
  long rc;

  rc=0;
  p = (char *)&rc;
  for(i=n-1;i>=0;i--){
    m = (ss%10)+'0'; ss=ss/10;
    if(pszBuf!=NULL)pszBuf[i] = (char)m;
    if(i<4)p[i]=(char)m;
   }
  return(rc);
 }
//将整数转为两字节十进制数(高位在前)
long IntToDec2(char *pszBuf,int ss)
 {
  long rc;

  rc=IntToDec(pszBuf,ss,2);
  return(rc);
 }
//将整数转为n字节十六进制数(高位在前)
long IntToHex(char *pszBuf,int ss,int n)
 {
  long rc;
  int i,m;
  char *p;

  rc=0;
  p = (char *)&rc;
  for(i=n-1;i>=0;i--){
    m = ss & 0x0f;
    if(m<10)m += '0'; else m = m+('A'-10);
    if(pszBuf!=NULL)pszBuf[i] = (char)m;
    if(i<4)p[i]=(char)m;
    ss >>= 4;
   }
  return(rc);
 }
//将n字节十六进制数(高位在前)转为整数
int HexToInt(char *pszBuf,int n)
 {
  int rc,i,m;

  rc=0;
  for(i=0;i<n;i++){
    m = pszBuf[i];
    if(m>='A')m = m-'A'+0x0a;
    else m=m-'0';
    rc = (rc<<4)+m;
   }
  return(rc);
 }
//************** Part 1. Communication Port end *
//获取Syris字符串的CRC
int GetSyrisCRC(char *crcBuf,int nSize)
 {
  int nCRC;

  nCRC = GetCRCWithBuf(crcBuf,nSize);
  return((int)nCRC);
 }
//检查Syris字符串的CRC
int CheckSyrisCRC(char *crcBuf,int nSize)
 {
  int  nCRC,rc;
  char *p;

  p = (char *)memchr(crcBuf,ASC_EOT,nSize);
  if(p!=NULL){
     nCRC = GetCRCWithBuf(crcBuf,(int)(p-crcBuf)+1);
     rc = HexToInt(p+1,4);
     if(rc!=nCRC)p=NULL;
    }
  return((int)p);
 }
//*********SYRIS Reader SyrisBCC Function  ********************* //
int SyrisBCC(char *bccStr,int nSize)
 {
  int  i,rc;
  WORD ss;

  ss=0;
  for(i=0;i<nSize;i++) ss ^=bccStr[i];
  ss &= 0x0ff;
  rc = IntToHex(bccStr,ss,2);
  return(rc);
 }
//获取发送格式的字符序列
int GetSendBuf(char *pszBuf,char *pszID,char *pszFC,
  char *Param1,char *Param2)
 {
  int i,nSize;
  nSize=0;
  pszBuf[nSize++]=ASC_SOH;
  for(i=0;i<2;i++)pszBuf[nSize++]=pszID[i];
  for(i=0;i<2;i++)pszBuf[nSize++]=pszFC[i];
  if(Param1!=NULL){
    i = strlen(Param1);
    MoveMemory(pszBuf+nSize,Param1,i);
    nSize += i;
   }
  if(Param2!=NULL){
    i = strlen(Param2);
    MoveMemory(pszBuf+nSize,Param2,i);
    nSize += i;
   }
  pszBuf[nSize++]=ASC_STX;
  i = GetSyrisCRC(pszBuf,nSize);
  IntToHex(pszBuf+nSize,i,4);nSize += 4;
  pszBuf[nSize++]=ASC_CR;
  return(nSize);
 }
//检查收到字符串的状态
int GetSyrisState(char *pszBuf,int nSize)
 {
  char *p;
  int rc;

  rc=HIWORD(nSize);
  nSize=LOWORD(nSize);
  if(rc==SYRIS_NOERROR){
    p = (char *)memchr(pszBuf,ASC_ETX,nSize);//搜索0x03字符
    if(p!=NULL){
       if(p>pszBuf){
         nSize = nSize-(p-pszBuf);
         MoveMemory(pszBuf,p,nSize);
        }
       if(!CheckSyrisCRC(pszBuf,nSize))//检查Syris字符串的CRC
          rc=SYRISERR_CRC;
       else if(nSize>5)pszBuf[nSize-5]=0;
      }
    else rc=SYRISERR_NOSOH;
   }

  if(rc==SYRIS_NOERROR && pszBuf[5]==ASC_SO)//错误
      rc=pszBuf[6];
  Syris_SetError(rc);
  return(rc);
 }

//{*******Part.2 Private Function end *************************}

//***********Part.3 输出函数开始
//发送Syris卡参数
SYRISPROC int Syris_SendParam(int nPort,char *szFC,char *Param1,char *Param2)
 {
  char cmdBuf[100],szID[5];
  int nSize;

  IntToDec(szID,nPort,2);
  nSize=GetSendBuf(cmdBuf,szID,szFC,Param1,Param2);
  Syris_SendOneFrame(cmdBuf,nSize);
  return(nSize);
 }
//读取Syris卡参数
SYRISPROC int Syris_ReadParam(char *Param,int nSize)
 {
  char cmdBuf[100];
  int rc;

  rc=Syris_ReadOneFrame(cmdBuf,sizeof(cmdBuf));
  rc=GetSyrisState(cmdBuf,rc);
  if(Param!=NULL && rc==SYRIS_NOERROR){//拷贝nSize字节,再加0字符
    MoveMemory(Param,cmdBuf+5,nSize);
    Param[nSize]=0;
   }
  return(rc);
 }
//从端口读取一帧数据
SYRISPROC int Syris_ReadOneFrame(char *pszBuf,int nBuf)
 {
  static char szStr[256];
  static int nLen;
  int n,rc;
  DWORD nSize,nTime;
  char *p,*p2;

  if(ComPort==INVALID_HANDLE_VALUE){
    rc=SYRISERR_NOCOMM;
    Syris_SetError(rc);
    return(rc);
   }
  rc=SYRIS_NOERROR;
  nTime=GetTickCount()+Syris_GetTimeOut();
  if(nLen>0)p2=(char *)memchr(szStr,ASC_CR,nLen);
  else p2=NULL;
  while(p2==NULL){
    nSize=0;
    p = szStr+nLen;
    ReadFile(ComPort,p,(DWORD)(sizeof(szStr)-nLen),&nSize,NULL);
    if(nSize>0){
      nLen += (int)nSize;
      p2=(char *)memchr(p,ASC_CR,nSize);//已收到一帧
      if(nLen>=sizeof(szStr))  //缓冲区溢出
         {rc=SYRISERR_OUTBUF;break;}
      nTime=GetTickCount()+Syris_GetTimeOut();
     }
    else if(GetTickCount()>nTime)
       { rc=SYRISERR_TIME; break;} //超时
   }
  if(p2!=NULL){//拷贝一帧
    n = (int)(p2-szStr)+1;
    nLen = nLen-n;
    if(n>nBuf)n=nBuf;
    MoveMemory(pszBuf,szStr,n);
    if(nLen>0)MoveMemory(szStr,p2+1,nLen);
   }
  else  n=0;
//  PurgeComm(ComPort, PURGE_RXABORT|PURGE_RXCLEAR ) ;
  rc=MAKELONG(n,rc);
  return(rc);
 }
//发送一帧数据
SYRISPROC int Syris_SendOneFrame(char *aa,int nSize)
 {
  DWORD rc;
  if(ComPort==INVALID_HANDLE_VALUE){
    rc=SYRISERR_NOCOMM;
    Syris_SetError(rc);
    return(rc);
   }
  rc=SYRIS_NOERROR;
  WriteFile(ComPort,aa,(DWORD)nSize,&rc,NULL);
  return((int)rc);
 }
//获取Syris通讯错误
SYRISPROC int Syris_GetError(void)
 { return(nSyrisError);}

//设置Syris通讯错误
SYRISPROC int Syris_SetError(int nNew)
 {
  int nOld;
  nOld=nSyrisError;
  nSyrisError=nNew;
  return(nOld);
 }

//获取Syris通讯超时的时间(ms)
SYRISPROC int Syris_GetTimeOut(void)
 { return(nSyrisTimeOut);}

//设置Syris通讯超时的时间(ms)
SYRISPROC int Syris_SetTimeOut(int nNew)
 {
  int nOld;
  nOld=nSyrisTimeOut;
  nSyrisTimeOut=nNew;
  return(nOld);
 }
//1-设置控制器日期时间
SYRISPROC int Syris_SetDatetime(int nSyID,char *ymdhms)
 {
  int rc;

  Syris_SendParam(nSyID,"AA",ymdhms,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }
//2-读取控制器日期时间
SYRISPROC int Syris_ReadDatetime(int nSyID,char *ymdhms)
 {
  int rc;

  Syris_SendParam(nSyID,"AB",NULL,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(ymdhms,15);//读取Syris卡参数
  return(rc);
 }
//37-读取母卡
SYRISPROC int Syris_GetMastercard(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"BA",No,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,24);//读取Syris卡参数
  return(rc);
 }
//36-设置母卡
SYRISPROC int Syris_SetMastercard(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"BA",No,State);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }
//38-设置工程师卡
SYRISPROC int Syris_SetEngcard(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"BB",No,State);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }

//39-读取工程师卡
SYRISPROC int Syris_GetEngcard(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"BB",No,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,24);//读取Syris卡参数
  return(rc);
 }
//40-设置操作员卡
SYRISPROC int Syris_SetOptcard(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"BC",No,State);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }
//41-读取操作员卡
SYRISPROC int Syris_GetOptcard(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"BC",No,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,24);//读取Syris卡参数
  return(rc);
 }
//42-设置控制器管制卡数
SYRISPROC int Syris_SetMaxcard(int nSyID,char *No)
 {
  int rc;

  Syris_SendParam(nSyID,"DA",No,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }
//43-读取控制器管制卡数
SYRISPROC int Syris_GetMaxcard(int nSyID,char *No)
 {
  int rc;

  Syris_SendParam(nSyID,"DA",NULL,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(No,8);//读取Syris卡参数
  return(rc);
 }
//44-读取控制器版本
SYRISPROC int Syris_GetVersion(int nSyID,char *Version)
 {
  int rc;

  Syris_SendParam(nSyID,"DB",NULL,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(Version,8);//读取Syris卡参数
  return(rc);
 }
//45-设置模组配置表
SYRISPROC int Syris_SetModule(int nSyID,char *No)
 {
  int rc;

  Syris_SendParam(nSyID,"DC",No,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }
//46-读取模组配置表
SYRISPROC int Syris_GetModule(int nSyID,char *No)
 {
  int rc;

  Syris_SendParam(nSyID,"DC",NULL,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(No,60);//读取Syris卡参数
  return(rc);
 }

//47-设置所有卡片之APB状态
SYRISPROC int Syris_SetApball(int nSyID,char *No)
 {
  int rc;

  Syris_SendParam(nSyID,"DE",No,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }
//48-读取模组输入点状态
SYRISPROC int Syris_GetDistate(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"DG",No,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,16);//读取Syris卡参数 原为10
  return(rc);
 }

//48-读取门位侦测点状态
SYRISPROC int Syris_GetDoorstate(int nSyID,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"DH",NULL,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,4);//读取Syris卡参数
  return(rc);
 }

//49-设置四门APB级别
SYRISPROC int Syris_SetApblevel(int nSyID,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"DI",State,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }

//50-读取四门APB级别
SYRISPROC int Syris_GetApblevel(int nSyID,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"DI",NULL,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,4);//读取Syris卡参数
  return(rc);
 }
//51-设置DI接点位置
SYRISPROC int Syris_SetDincno(int nSyID,char *Id,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"DJ",Id,State);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }

//52-读取DI接点位置
SYRISPROC int Syris_GetDincno(int nSyID,char *Id,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"DJ",Id,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,16);//读取Syris卡参数
  return(rc);
 }

//53-设置应用群组
SYRISPROC int Syris_SetApp(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"EA",No,State);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }
//54-读取应用群组
SYRISPROC int Syris_GetApp(int nSyID,char *no,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"EA",no,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,19);//读取Syris卡参数
  return(rc);
 }

//55-设置门区直接外出
SYRISPROC int Syris_SetJustout(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"EB",No,State);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }

//56-读取可否门区直接外出
SYRISPROC int Syris_GetJustout(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"EB",No,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,72);//读取Syris卡参数
  return(rc);
 }


//57-设置门区周计划通行时区及通行时区是否可直接外出
SYRISPROC int Syris_SetJustoutw(int nSyID,char *No,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"EC",No,State);//发送Syris卡参数
  rc=Syris_ReadParam(NULL,0);//读取Syris卡参数
  return(rc);
 }

//58-读取门区周计划通行时区及通行时区是否可直接外出
SYRISPROC int Syris_GetJustoutw(int nSyID,char *no,char *State)
 {
  int rc;

  Syris_SendParam(nSyID,"EC",no,NULL);//发送Syris卡参数
  rc=Syris_ReadParam(State,21);//读取Syris卡参数
  return(rc);

⌨️ 快捷键说明

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