typedef enum
{
MATE_HEARD1 = 0 ,
MATE_HEARD2,
MATE_SN,
MATE_TYPE,
MATE_CMD,
MATE_LENGTH,
MATE_DATA,
MATE_CRC1,
MATE_CRC2,
}mateRecvStatusEnum;
mateRecvStatusEnum mateReceStatus = MATE_HEARD1;
//上面是万能的!定位
typedef struct
{
uint8_t sn;
uint8_t type;
uint8_t cmd;
uint8_t length;
uint8_t data[256];
uint16_t crc16;
uint8_t cnt;
}mateDataType;
mateDataType mateData;
//上面是本次硬件的报文协议
//每次进来一个ch
void mate_getchar( uint8_t ch)
{
timer.start(receiveTimeoutTimerHandle);
switch(mateReceStatus)
{
case MATE_HEARD1:
{
if(ch == 0x10)
{
mateReceStatus = MATE_HEARD2;
}
}break;
case MATE_HEARD2:
{
if(ch == 0x23)
{
mateReceStatus = MATE_SN;
}
}break;
case MATE_SN:
{
mateData.sn = ch;
mateReceStatus = MATE_TYPE;
}break;
case MATE_TYPE:
{
mateData.type = ch;
mateReceStatus = MATE_CMD;
}break;
case MATE_CMD:
{
mateData.cmd = ch;
mateReceStatus = MATE_LENGTH;
}break;
case MATE_LENGTH:
{
mateData.length = ch;
if(mateData.length > 0 )
{
mateReceStatus = MATE_DATA;
}
else
{
mateReceStatus = MATE_CRC1;
}
}break;
case MATE_DATA:
{
mateData.data[mateData.cnt] = ch;
if(++mateData.cnt == mateData.length)
{
mateReceStatus = MATE_CRC1;
}
}break;
case MATE_CRC1:
{
mateData.crc16 = ch << 8;
mateReceStatus = MATE_CRC2;
}break;
case MATE_CRC2:
{
uint16_t crc16 = 0;
mateData.crc16 |= ch;
crc16 = crc16_ccitt(mateData.data , mateData.length);
if( mateData.crc16 == crc16 )
{
log(INFO,"MATE接收正确\n");
if( mateData.type != ACK_TYPE)
{
log(INFO,"send ack\n");
mate_send_ack(); //接收一个正确的非ACK包,返回ACK
}
if( mateReceiveMode == FALSE)
{
//send queue
if(mateData.type == QRCODE_TYPE)
{
xQueueSendFromISR( xQRCodeQueue, ( void* )&mateData, NULL );
mateReceStatus = MATE_HEARD1;
memset(&mateData , 0x00 , sizeof(mateDataType));
timer.stop(receiveTimeoutTimerHandle);
}
}
else
{
mateReceiveFinsh = TRUE;
}
}
mateReceStatus = MATE_HEARD1;
}break;
default:log(WARN,"no this status into mate\n");break;
}
}
receiveTimeoutTimerHandle = timer.creat( 30 , FALSE , mate_receive_timeout_isr );
void mate_receive_timeout_isr(void)
{
timer.stop(receiveTimeoutTimerHandle);
mateReceStatus = MATE_HEARD1;
memset(&mateData , 0x00 , sizeof(mateDataType));
}