📄 syris.cpp
字号:
#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 + -