串口协议处理模型

定义结构体

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值