📄 iccard.c
字号:
#include "typedef.h"
#include "iccard.h"
ICCARD_STATUS_BUF gICcardStatus;
/*****BCC校验***
*返回值:BCC校验的值
*pSrcBuf:需要加校验的报文
*nSrcLen;pSrcBuf的长度
******************/
/*Byte iccard_bcccode(Byte* pSrcBuf, Byte nSrcLen)
{
Byte nRet, i;
nRet = pSrcBuf[0];
for (i=1; i<nSrcLen; i++)
nRet ^= pSrcBuf[i];
return nRet;
}
/****BCC校验检查**************
*返回值:0表示校验未通过,否则校验通过
*pSrcBuf:进行校验的报文,其中最后一个字节为BCC校验和
*nSrcLen;pSrcBuf的长度
******************************/
/*Byte iccard_bccdecode(Byte* pSrcBuf, Byte nSrcLen)
{
Byte nBcc, i;
if (nSrcLen >1)
{
nBcc = pSrcBuf[0];
for (i=1; i<(nSrcLen-1); i++)
nBcc ^= pSrcBuf[i];
if (nBcc == pSrcBuf[nSrcLen-1])
return nSrcLen;
else
return 0;
}
else
return 0;
}
/****解码函数***************
*作用:还原出原始报文,主要是针对报文中DLE
*返回值:0表示报文错误或者无有意义报文(BCC校验不正确),否则返回原始报文的长度
*pSrcBuf:包括DLE的报文,该报文包括STX和ETX
*pDestBuf:去除DLE的报文
*nSrcLen;pSrcBuf的长度
****************************/
/*Byte iccard_dlepack(Byte* pSrcBuf, Byte* pDestBuf, Byte nSrcLen)
{
Byte i, j, bFound;
if ((ICCARD_STX == pSrcBuf[0]) && (ICCARD_ETX == pSrcBuf[nSrcLen-1]))
{
if (nSrcLen > 3)
{
i = 1;
j = 0;
bFound = 0;
while (i < (nSrcLen-1))
{
if (1 == bFound)
{
bFound = 0;
pDestBuf[j] = pSrcBuf[i];
i++;
j++;
}
else
{
if (ICCARD_DLE == pSrcBuf[i])
{
bFound = 1;
i++;
}
else
{
pDestBuf[j] = pSrcBuf[i];
i++;
j++;
}
}
return iccard_bccdecode(pDestBuf, j);
}
}
return 0;
}
else if (2 == nSrcLen)
return nSrcLen;
else
return 0;
}
char gICcardSendBuf[256];//发送缓存
//发送通信ACK
void iccard_communicationACK(Byte nValue)
{
gICcardSendBuf[0] = 0x06;
gICcardSendBuf[1] = nValue;
sio_send(gICcardSendBuf, 2);
}
#define ICCARD_STATUSRELAY_TIMEOUT 1
//约定50ms执行一次
void iccard_process()
{
Byte nRecLen, nRecTrueLen;
Byte* ptr;
Byte recBuf[255];
nRecLen = ;
nRecTrueLen = iccard_dlepack(ptr. recBuf, nRecLen);
switch (gICcardStatus.curstatus)
{
case ICCARD_STATUS_IDLE:
if (nRecTrueLen > 2)
{
iccard_communicationACK(recBuf[1]);
if (recBuf[1] < 0x80)
{
//命令报
gICcardStatus.curCommand = recBuf[2];
gICcardStatus.curstatus = ICCARD_STATUS_RELAY;
//对刷卡数据即克上传
if (ICCARD_CMD_CHECKWORK == recBuf[2])
{
if (22 == nRecTrueLen)
{
set_driver_id(recBuf+3);
make_assess_message(recBuf[22]+1);
gICcardStatus.curstatus = ICCARD_STATUS_WAIT_WORKRESPONSE;
gICcardStatus.curTimeout = ;
}
}
else if (ICCARD_CMD_CARDDATA == recBuf[2])
{
}
}
}
break;
case ICCARD_STATUS_WAITACK:
break;
case ICCARD_STATUS_WAITRESP:
break;
case ICCARD_STATUS_RELAY:
//针对不同的命令采用不同的方式回送应答
//对于上下班以及刷卡数据,只有在收到中心应答以后才回送数据报
//对于对时请求,即可发送
if ()
{
}
break;
case ICCARD_STATUS_WAITACK2:
break;
case ICCARD_STATUS_WAIT_WORKRESPONSE:
gICcardStatus.curTimeout--;
if (0 == gICcardStatus.curTimeout)
gICcardStatus.curstatus = ICCARD_STATUS_IDLE;
break;
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -