📄 protocol.cpp
字号:
#include <windows.h>
#include "protocol.h"
bool InitCom(int comport)
{
char Ccom[10];
DCB dcb;
HANDLE hCom;
BOOL fSuccess;
COMSTAT comstat;
DWORD dwError;
COMMTIMEOUTS TimeOuts;
Ccom[0]='C',Ccom[1]='O',Ccom[2]='M',Ccom[4]='\0';
if( comport<1 || comport>8 )
return false;
Ccom[3]='0'+comport;
hCom = CreateFile(Ccom,
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hCom == INVALID_HANDLE_VALUE)
return false;
fSuccess = GetCommState(hCom, &dcb);
if (!fSuccess)
return false;
dcb.BaudRate = (unsigned long) 57600;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = 0;
fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess)
return false;
GetCommTimeouts(hCom,&TimeOuts);
TimeOuts.ReadTotalTimeoutMultiplier=120; //220
TimeOuts.WriteTotalTimeoutConstant=50; //60
SetCommTimeouts(hCom,&TimeOuts);
HCOM[comport]=hCom;
ClearCommError(hCom,&dwError,&comstat);
return true;
}
void ReleaseCom(int comport)
{
if( HCOM[comport]!=INVALID_HANDLE_VALUE )
CloseHandle( HCOM[comport] );
}
//----------------------GetPkgByte--------------------
int GetPkgByte(int comport,unsigned char *TranChar)
{
DWORD num;
COMSTAT comstat;
DWORD dwError;
num=0;
*TranChar=0;
ClearCommError(HCOM[comport],&dwError,&comstat);
ReadFile(HCOM[comport],TranChar,1,&num,NULL);
if( num!=1 )
return 0;
return 1;
}
//-------------------SendPkgByte---------------------
int SendPkgByte(int comport,unsigned char TranChar)
{
DWORD num;
COMSTAT comstat;
DWORD dwError;
int qq=9,tt=158;
for(int pp=0;pp<=5000;pp++ )
qq=qq*tt/tt;
ClearCommError(HCOM[comport],&dwError,&comstat);
WriteFile(HCOM[comport],&TranChar,1,&num,NULL);
if( num!=1 )
return 0;
return 1;
}
int GetPackage(int comport, CMD *cmd)
{
int i,RptTimes;
long jyh;
RptTimes=0;
hostReIn:
if( !GetPkgByte(comport, &(cmd->PkgId )) )
return 0;
if( !GetPkgByte(comport, &(cmd->Address[0]) ) )
return 0;
if( !GetPkgByte(comport, &(cmd->Address[1] ) ))
return 0;
if( !GetPkgByte(comport, &(cmd->PkgLen)) )
return 0;
jyh=cmd->PkgId+cmd->Address[0]+cmd->Address[1]+cmd->PkgLen;
for( i=0;i<cmd->PkgLen;i++ )
{
if( !GetPkgByte(comport, &(cmd->PkgCnt[i] )) )
return 0;
jyh+=cmd->PkgCnt[i];
}
if( !GetPkgByte(comport, &(cmd->Jyh[0] )) )
return 0;
if( !GetPkgByte(comport, &(cmd->Jyh[1] )) )
return 0;
Sleep(1);
if( cmd->Jyh[0]!=(jyh&0xff00)>>8 || cmd->Jyh[1]!=(jyh&0xff) )
{
RptTimes++;
if( RptTimes>3 )
{
SendPkgByte(comport, hEot );
Sleep(1);
SendPkgByte(comport, hEot );
return 0;
}
SendPkgByte(comport, hReIn );
Sleep(1);
SendPkgByte(comport, hReIn );
goto hostReIn;
}
SendPkgByte(comport, hRight );
Sleep(1);
SendPkgByte(comport, hRight );
return 1;
}
int SendPackage(int comport,SCMD scmd)
{
int i;
long jyh; //unsigned int
unsigned char ret;
ModuleReIn:
if( !SendPkgByte(comport, scmd.sPkgId ) )
return 0;
if( !SendPkgByte(comport, scmd.sAddress[0] ) )
return 0;
if( !SendPkgByte(comport, scmd.sAddress[1] ) )
return 0;
if( !SendPkgByte(comport, scmd.sPkgLen) )
return 0;
jyh=scmd.sPkgId+scmd.sAddress[0]+scmd.sAddress[1]+scmd.sPkgLen;
for( i=0;i<scmd.sPkgLen;i++ )
{
if( !SendPkgByte(comport, scmd.sPkgCnt[i] ) )
return 0;
jyh+=scmd.sPkgCnt[i];
}
scmd.sJyh[0]=(jyh&0xff00)>>8;
scmd.sJyh[1]=jyh&0xff;
if( !SendPkgByte(comport, scmd.sJyh[0] ) )
return 0;
if( !SendPkgByte(comport, scmd.sJyh[1] ) )
return 0;
if( !GetPkgByte(comport, &ret ) )
return 0;
if( !GetPkgByte(comport, &ret ) )
return 0;
if( ret==mReIn )
goto ModuleReIn;
if( ret==mRight )
return 1;
if( ret==mBusy )
return 2;
return 0;
}
int SensorStatus(int comport,unsigned char* St0,unsigned char* St1)
{
int ret;
SCMD scmd;
CMD cmd;
Sleep(30); //should delay 150ms
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=Status ;
ret=SendPackage(comport,scmd);
if( ret==2 )
return 2; //busy
if( ret==1 )
{
if( GetPackage(comport,&cmd) )
{
*St0=cmd.PkgCnt[0];
*St1=cmd.PkgCnt[1];
return 1;
}
}
return 0;
}
int SensorReset(int comport)
{
SCMD scmd;
Sleep(10);
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=Reset ;
return( SendPackage(comport,scmd) );
}
int SensorFree(int comport)
{
SCMD scmd;
Sleep(10);
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=Free ;
return( SendPackage(comport,scmd) );
}
int SensorGenTzz(int comport)
{
SCMD scmd;
Sleep(10);
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=GenTzz ;
return( SendPackage(comport,scmd) );
}
int SensorEnroll(int comport)
{
SCMD scmd;
Sleep(10);
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=Enroll ;
return( SendPackage(comport,scmd) );
}
int SensorGenImg(int comport)
{
SCMD scmd;
Sleep(10);
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=GenImg ;
return( SendPackage(comport,scmd) );
}
int SensorDownMb(int comport,int nummb,TZDP mb[])
{
int i,ptr;
int ret;
SCMD scmd;
Sleep(10);
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=DownMb ;
ret=SendPackage(comport,scmd);
if( !ret )
return 0;
if( ret==2 )
return 2;
Sleep(3);
for( i=0,ptr=0;i<nummb;i++ )
{
scmd.sPkgCnt[ptr++]=mb[i].hres;
scmd.sPkgCnt[ptr++]=mb[i].zres;
scmd.sPkgCnt[ptr++]=mb[i].flag+((mb[i].direct/256)<<7);
scmd.sPkgCnt[ptr++]=mb[i].direct%256;
}
scmd.sPkgId=EndData;
scmd.sPkgLen=ptr;
return( SendPackage(comport,scmd) );
}
int SensorDownTz(int comport,int numtzd,TZDP tzd[])
{
int i,ptr;
int ret;
SCMD scmd;
Sleep(10);
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=DownTz ;
ret=SendPackage(comport,scmd);
if( !ret )
return 0;
if( ret==2 )
return 2;
Sleep(1);
for( i=0,ptr=0;i<numtzd && i<=31;i++ )
{
scmd.sPkgCnt[ptr++]=tzd[i].hres;
scmd.sPkgCnt[ptr++]=tzd[i].zres;
scmd.sPkgCnt[ptr++]=tzd[i].flag+((tzd[i].direct/256)<<7);
scmd.sPkgCnt[ptr++]=tzd[i].direct%256;
}
if(numtzd>32)
scmd.sPkgId=Data;
else
scmd.sPkgId=EndData;
scmd.sPkgLen=ptr;
if( !SendPackage(comport,scmd) )
return 0;
if( numtzd<=32 )
return 1;
Sleep(3);
for( i=32,ptr=0;i<numtzd && i<=31+32;i++ )
{
scmd.sPkgCnt[ptr++]=tzd[i].hres;
scmd.sPkgCnt[ptr++]=tzd[i].zres;
scmd.sPkgCnt[ptr++]=tzd[i].flag+((tzd[i].direct/256)<<7);
scmd.sPkgCnt[ptr++]=tzd[i].direct%256;
}
scmd.sPkgId=EndData;
scmd.sPkgLen=ptr;
return( SendPackage(comport,scmd) );
}
int SensorUpMb(int comport,int* nummb,TZDP mb[])
{
int i,ptr;
int ret;
SCMD scmd;
CMD cmd;
Sleep(10);
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=UpMb ;
ret=SendPackage(comport,scmd);
if( !ret )
return 0;
if( ret==2 )
return 2;
if( !GetPackage(comport,&cmd) )
return 0;
if( cmd.PkgId!=EndData )
return 0;
*nummb=cmd.PkgLen/4;
ptr=0;
for( i=0;i<*nummb;i++ )
{
mb[i].hres=cmd.PkgCnt[ptr++];
mb[i].zres=cmd.PkgCnt[ptr++];
mb[i].flag=cmd.PkgCnt[ptr++];
mb[i].direct=cmd.PkgCnt[ptr++];
if(mb[i].flag&0x80)
{
mb[i].direct+=256;
mb[i].flag&=0x7f;
}
}
return 1;
}
int SensorUpTz(int comport,int *numtzd,TZDP tzd[])
{
int i,ptr;
int ret;
SCMD scmd;
CMD cmd;
Sleep(10);
scmd.sPkgId=Cmd;
scmd.sPkgLen=1;
scmd.sPkgCnt[0]=UpTz ;
ret=SendPackage(comport,scmd);
if( !ret )
return 0;
if( ret==2 )
return 2;
if( !GetPackage(comport,&cmd) )
return 0;
if( cmd.PkgId!=EndData && cmd.PkgId!=Data )
return 0;
i=0;
*numtzd=0;
anothertzz:
*numtzd+=cmd.PkgLen/4;
ptr=0;
for( ;i<*numtzd;i++ )
{
tzd[i].hres=cmd.PkgCnt[ptr++];
tzd[i].zres=cmd.PkgCnt[ptr++];
tzd[i].flag=cmd.PkgCnt[ptr++];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -