数据解包

项目中要使用串口通信,要对数据进行解包,找出需要的数据。对不符合协议的数据丢弃,要求可以对数据进行干扰,在数据前后都可以插入扰乱数据。通过程序解析出需要的数据,下位机C语言单片机代码如下:



//数据解包
void DataAnalysis() {
    u16 i = 0;
    if(length <200) {//数据长度小于200
        for(i = 0 ; i<length; i++) {
            if(receiLen == 0 && USART_RX_BUF[i] == 0xab) {//包头1
                buff[receiLen] = USART_RX_BUF[i];
                receiLen = 1;
            } else if(receiLen == 1 && USART_RX_BUF[i] == 0xcd) {//包头2
                buff[receiLen] = USART_RX_BUF[i];
                receiLen = 2;
            } else if(receiLen == 1 && USART_RX_BUF[i] != 0xcd) {//找到包头1 但是包头2不对 则重新计数
                receiLen = 0;
            }
            else if(receiLen != 0) {//数据
                buff[receiLen] = USART_RX_BUF[i];
                receiLen++;
            }
            if(receiLen != 0 && buff[receiLen-2] == 0xdc &&buff[receiLen-1] == 0xba) {//检测到包尾正确退出
                break;
            }
        }
        if(receiLen != 0 && (buff[receiLen-2] != 0xdc || buff[receiLen-1] != 0xba)) {//检测到包尾错误退出,接收数据缓冲区长度清零
            receiLen = 0;
        }


    } else {
        // printf("数据超长\r\n");
        receiLen = 0;
    }
//--------打印数据---------------
    if(receiLen != 0) {
        //  printf("数据接收完成! 数据长度-> %d \r\n",receiLen);
        SendHex(buff,receiLen);
        receiLen  = 0;


    }
}
调用程序

int main() {

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    uart_init(115200);
    delay_init();


    while(1) {
        if(USART_RX_STA & 0X8000) {
            length = USART_RX_STA & 0X3FFF;//0-13位保存数据长度
            //  printf("数据长度:length = %d\r\n\n",length);
            DataAnalysis();
            USART_RX_STA = 0;
        } else {
            delay_ms(10);
        }
    }

}

该代码是一种设计思想,适用与各种开发语言。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值