算法(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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ble 分包解包系列
下一篇:c语言库函数

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月20日 07时16分38秒