定义结构体
typedef enum
{
POS11,
POS12,
POS13,
POS14,
POS15,
POS21,
POS22,
POS23,
POS24,
POS25,
POS31,
}UsartPos_T;
__packed typedef struct _ProtData
{
uint8_t POS11_head;
uint8_t POS12_num;
uint8_t POS13_rnum;
uint16_t POS1415_len;
uint16_t POS2122T;
uint16_t POS2324L;
uint8_t POS25V[200];
uint16_t POS31_CRC;
}ProtData_T;
此后每个数据过来 就处理一下
char is_crc_ok( ProtData_T *pag )
{
uint16_t size = offsetof(ProtData_T,POS25V);
uint16_t crc16;
memset(fb , 0 , sizeof(fb));
memcpy(fb , pag ,size );
memcpy(fb+size , pag->POS25V , pag->POS2324L);
crc16 = crc16_ccitt(fb ,size+ pag->POS2324L);
if(crc16 == pag->POS31_CRC)
return 1;
else
return 0;
}
ProtData_T pag;
void BleReceiveUsartByte( uint8_t ucData)
{
static UsartPos_T BytePos = POS11;
static uint8_t count=0;
switch(BytePos)
{
case POS11:
{
memset(&pag , 0x00 , sizeof(ProtData_T));
if((pag.POS11_head = ucData) == 0XAA)
{
BytePos = POS12;
}
}break;
case POS12:
{
pag.POS12_num = ucData;
BytePos = POS13;
}break;
case POS13:
{
pag.POS13_rnum = ucData;
if( (pag.POS12_num | pag.POS13_rnum)==0XFF )
BytePos = POS14;
else
BytePos = POS11;
}break;
case POS14:
{
pag.POS1415_len = ucData;
pag.POS1415_len = pag.POS1415_len<<8;
BytePos = POS15;
}break;
case POS15:
{
pag.POS1415_len = pag.POS1415_len|ucData ;
BytePos = POS21;
}break;
case POS21:
{
pag.POS2122T = ucData;
pag.POS2122T = pag.POS2122T<<8;
BytePos = POS22;
}break;
case POS22:
{
pag.POS2122T = pag.POS2122T|ucData ;
BytePos = POS23;
}break;
case POS23:
{
pag.POS2324L = ucData;
pag.POS2324L = pag.POS2324L<<8;
BytePos = POS24;
}break;
case POS24:
{
pag.POS2324L = pag.POS2324L|ucData ;
BytePos = POS25;
count = 0;
}break;
case POS25:
{
pag.POS25V[count++] = ucData;
if( count == pag.POS2324L)
BytePos = POS31;
}break;
case POS31:
{
if(is_crc_ok(&pag))
{
static BaseType_t xHigherPriorityTaskWoken = pdFALSE;;
xSemaphoreGiveFromISR( xBtSemaphore, &xHigherPriorityTaskWoken );
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken );
}
BytePos = POS11;
}break;
}
}