【框架】串口中断模型

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));
}

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/90060869
今日推荐