算法(2) uart 分包-j解包函数 系列代码
发布日期:2021-06-29 05:35:29
浏览次数:3
分类:技术文章
本文共 7796 字,大约阅读时间需要 25 分钟。
1:uart 分包函数
1.1 .c文件
#include "uart_packt.h"static uint8_t cover_data(uint8_t indata,uint8_t*out_data){ uint8_t len=0; if(0xaa==indata) { out_data[len++]=0xab; out_data[len++]=0x01; } else if(0xab==indata) { out_data[len++]=0xab; out_data[len++]=0x02; } else { out_data[len++]=indata; } return len;}static uint8_t uncover_data(uint8_t predata,uint8_t nowdata){ uint8_t r_value=0xff; r_value= nowdata; if(0xab==predata) { if(0x01==nowdata) { r_value= 0xaa; } else if(0x02==nowdata) { r_value= 0xab; } else { r_value= nowdata;//error========================= } } return r_value;}/*** 解包数据** datain,串口数据入口** call_util_get_data接收到数据的回调** return,true接收一帧数据*/bool uart_unpackage_data(uint8_t datain,dataout_fun call_util_get_data){ static uint8_t sta,pre; static uint8_t buf[UART_FRAM_LEN+5];//cmd len datas.. xor static uint16_t buf_len,left; static uint8_t data_xor; uint8_t tmp; uint16_t tmp16;//head if(datain == 0xaa) { data_xor=0; pre=datain; data_xor^=datain; buf_len=0; sta=1; return false; } switch(sta) { case 1://cmd case 2://cmd case 3://lenth case 4://lenth if(datain == 0xab) { break; } else { tmp=uncover_data(pre,datain); data_xor^=tmp; buf[buf_len++]=tmp; sta++; if(5==sta)//判断长度是否合法 { tmp16=buf[2]; tmp16<<=8; tmp16|=buf[3]; left=tmp16; if(tmp16>(UART_FRAM_LEN))//长度错误 { sta=0; break; } else if(tmp16==0) { sta++; } } } break; case 5://datas if(datain == 0xab) { break; } else { tmp=uncover_data(pre,datain); data_xor^=tmp; buf[buf_len++]=tmp; left--; if(0==left) { sta++; } } break; case 6://xor if(datain == 0xab) { break; } else { tmp=uncover_data(pre,datain); data_xor^=tmp; buf[buf_len++]=tmp; if(0==data_xor) { call_util_get_data(((uint16_t)buf[0]<<8)|buf[1],&buf[4],((uint16_t)buf[2]<<8)|buf[3]); pre=datain; sta=0; return true; } sta=0; } break; default: sta=0; break; } pre=datain; return false;}/*** 函数说明:打包发送** cmd:传入的命令** p_in_datas,datalen 数据部分的指针和长度** p_out_data:打包完全的数据** 返回值为打包号数据的长度*/uint16_t uart_package_data(uint16_t cmd,uint8_t* p_in_datas,uint16_t datalen,uint8_t*p_out_datas){ uint16_t len=0,i; uint8_t xor_result=0,tmp; //head xor_result^=0xaa; p_out_datas[len++]=0xaa; #ifdef EN_MCU_USE_TIME_CONTROL if(0==(cmd&0xff00)) { //cmd tmp=cmd>>8; xor_result^=tmp; p_out_datas[len++]=tmp; tmp=cmd; xor_result^=tmp; p_out_datas[len++]=tmp; //datalen tmp=datalen>>8; xor_result^=tmp; p_out_datas[len++]=tmp; tmp=datalen; xor_result^=tmp; p_out_datas[len++]=tmp; //datas if(datalen) { for(i=0; i>8; xor_result^=tmp; len+=cover_data(tmp,&p_out_datas[len]); tmp=cmd; xor_result^=tmp; len+=cover_data(tmp,&p_out_datas[len]); //datalen tmp=datalen>>8; xor_result^=tmp; len+=cover_data(tmp,&p_out_datas[len]); tmp=datalen; xor_result^=tmp; len+=cover_data(tmp,&p_out_datas[len]); //datas if(datalen) { for(i=0; i
1.1 .h 文件
#include "uart_packt.h"static uint8_t cover_data(uint8_t indata,uint8_t*out_data){ uint8_t len=0; if(0xaa==indata) { out_data[len++]=0xab; out_data[len++]=0x01; } else if(0xab==indata) { out_data[len++]=0xab; out_data[len++]=0x02; } else { out_data[len++]=indata; } return len;}static uint8_t uncover_data(uint8_t predata,uint8_t nowdata){ uint8_t r_value=0xff; r_value= nowdata; if(0xab==predata) { if(0x01==nowdata) { r_value= 0xaa; } else if(0x02==nowdata) { r_value= 0xab; } else { r_value= nowdata;//error========================= } } return r_value;}/*** 解包数据** datain,串口数据入口** call_util_get_data接收到数据的回调** return,true接收一帧数据*/bool uart_unpackage_data(uint8_t datain,dataout_fun call_util_get_data){ static uint8_t sta,pre; static uint8_t buf[UART_FRAM_LEN+5];//cmd len datas.. xor static uint16_t buf_len,left; static uint8_t data_xor; uint8_t tmp; uint16_t tmp16;//head if(datain == 0xaa) { data_xor=0; pre=datain; data_xor^=datain; buf_len=0; sta=1; return false; } switch(sta) { case 1://cmd case 2://cmd case 3://lenth case 4://lenth if(datain == 0xab) { break; } else { tmp=uncover_data(pre,datain); data_xor^=tmp; buf[buf_len++]=tmp; sta++; if(5==sta)//判断长度是否合法 { tmp16=buf[2]; tmp16<<=8; tmp16|=buf[3]; left=tmp16; if(tmp16>(UART_FRAM_LEN))//长度错误 { sta=0; break; } else if(tmp16==0) { sta++; } } } break; case 5://datas if(datain == 0xab) { break; } else { tmp=uncover_data(pre,datain); data_xor^=tmp; buf[buf_len++]=tmp; left--; if(0==left) { sta++; } } break; case 6://xor if(datain == 0xab) { break; } else { tmp=uncover_data(pre,datain); data_xor^=tmp; buf[buf_len++]=tmp; if(0==data_xor) { call_util_get_data(((uint16_t)buf[0]<<8)|buf[1],&buf[4],((uint16_t)buf[2]<<8)|buf[3]); pre=datain; sta=0; return true; } sta=0; } break; default: sta=0; break; } pre=datain; return false;}/*** 函数说明:打包发送** cmd:传入的命令** p_in_datas,datalen 数据部分的指针和长度** p_out_data:打包完全的数据** 返回值为打包号数据的长度*/uint16_t uart_package_data(uint16_t cmd,uint8_t* p_in_datas,uint16_t datalen,uint8_t*p_out_datas){ uint16_t len=0,i; uint8_t xor_result=0,tmp; //head xor_result^=0xaa; p_out_datas[len++]=0xaa; #ifdef EN_MCU_USE_TIME_CONTROL if(0==(cmd&0xff00)) { //cmd tmp=cmd>>8; xor_result^=tmp; p_out_datas[len++]=tmp; tmp=cmd; xor_result^=tmp; p_out_datas[len++]=tmp; //datalen tmp=datalen>>8; xor_result^=tmp; p_out_datas[len++]=tmp; tmp=datalen; xor_result^=tmp; p_out_datas[len++]=tmp; //datas if(datalen) { for(i=0; i>8; xor_result^=tmp; len+=cover_data(tmp,&p_out_datas[len]); tmp=cmd; xor_result^=tmp; len+=cover_data(tmp,&p_out_datas[len]); //datalen tmp=datalen>>8; xor_result^=tmp; len+=cover_data(tmp,&p_out_datas[len]); tmp=datalen; xor_result^=tmp; len+=cover_data(tmp,&p_out_datas[len]); //datas if(datalen) { for(i=0; i
可以加入QQ群:687360507 与大伙沟通交流,技术在于分享而进步
转载地址:https://blog.csdn.net/zhi_Alanwu/article/details/104836951 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月20日 07时16分38秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
使用cl.exe和linker.exe连接程序
2019-04-29
编译器背后的故事
2019-04-29
第7周作业--嵌入式程序调试与opencv图像库
2019-04-29
第七周作业--C#编程和网络编程入门
2019-04-29
第8-9周作业--STM32嵌入式应用系统设计
2019-04-29
自定义类似于word的查找替换功能程序
2019-04-29
树莓派——嵌入式智能家居项目,语音远程控制红外设备
2019-04-29
Linux库引入静态库和动态库,两者区别
2019-04-29
ubuntu更换国内源的简便方法
2019-04-29
Ubuntu,centos等虚拟机安装中文输入法
2019-04-29
已知n个元素依次入栈,判断元素出栈的次序或者出栈的结果
2019-04-29
为什么使用scp无法从树莓派拷贝到unbuntu等虚拟机
2019-04-29
如何打开树莓派ssh,vnc等服务
2019-04-29
电脑设置关闭计算机盒子不采取任何操作无效的问题
2019-04-29
在上层平台(如unbuntu)上编写并且编译树莓派的驱动模块程序
2019-04-29
编写树莓派引脚驱动代码
2019-04-29
Linux下C语言调用paly播放音频文件
2019-04-29
初次使用github
2019-04-29
通过按位与和按位或操作
2019-04-29