嵌入式工具函数-数据合并拆分

在嵌入式编程中,通常涉及到不同类型变量的合并和拆分,例如将u32、u16、u3的三个变量组成一帧数据,当然可以在封帧的时候移位填充,然后在解帧的时候按顺序合并回来,但坏处是代码难看,并且每次都得注意一下高地位。对于这类常用的功能,写该工具函数。

1 应用举例

拆分

例如,封装三种类型的变量

uint32_t  data_1;
uint16_t data_2;
uint8_t data_3;
//用指针指向数据帧保存的buffer
uint8_t *pBuf = payload;
//拆分32位数据,并将其存放buffer中,指针偏移
pBuf = Util_bufferUint32(pBuf, data_1);//短地址
//拆分32位数据
pBuf = Util_bufferUint16(pBuf, data_2);//电压
//8位就直接塞进去了
*pBuf++ = ata_3;

其中函数:

uint8_t *Util_bufferUint32(uint8_t *pBuf, uint32_t val)

将val按照地位在前高位在后的原则拆分成4个8位数据,顺序存入pBuf,并且指针移动4字节


合并

拆帧取出数据:

uint32_t  data_1;
uint16_t data_2;
uint8_t data_3;

uint8_t *pBuf = payload;
data_1=Util_parseUint32(pBuf);
pBuf+=4;
data_1=Util_parseUint16(pBuf);
pBuf+=2;
data_1 = *pBuf;

其中函数:

uint32_t  Util_parseUint32(uint8_t *pArray)

将pArray开始的连续4个字节合并成一个32位字节返回,不会修改指针指向。

工具函数API

//拼接该指针的首位和次位数据,首位是16位的低位
uint16_t Util_parseUint16(uint8_t *pArray);
//拆分16位数据存入pBuf
uint8_t *Util_bufferUint16(uint8_t *pBuf, uint16_t val);
//将32位数据拆分保存在数组中
uint8_t *Util_bufferUint32(uint8_t *pBuf, uint32_t val);
//从数组中取出4位合并成32位
uint32_t Util_parseUint32(uint8_t *pArray);

uint32_t Util_buildUint32(uint8_t byte0, uint8_t byte1, uint8_t byte2,uint8_t byte3);
//拆分32位数据,获取某一个8位的数据
uint8_t Util_breakUint32(uint32_t var, int byteNum);
//将两个8位组成一个十六位
uint16_t Util_buildUint16(uint8_t loByte, uint8_t hiByte);

函数实现

/*!
 Get the high byte of a uint16_t variable
 获取16位数据的高位
 */
uint8_t Util_hiUint16(uint16_t a)
{
    return((a >> 8) & 0xFF);
}

/*!
 Get the low byte of a uint16_t variable
 获取16位数据的地位
 */
uint8_t Util_loUint16(uint16_t a)
{
    return((a) & 0xFF);
}

/*
拆分16位数据,存入buffer
pBuf :数据指针
val  :拼接后返回值
return :如果传入的是一串数据,则返回使用后指针新的指向
*/

uint8_t *Util_bufferUint16(uint8_t *pBuf, uint16_t val)
{
    *pBuf++ = Util_loUint16(val);
    *pBuf++ = Util_hiUint16(val);
    return(pBuf);
}

//将两个8位组成一个十六位
//loByte :16位地位数据
//hiByte :16位高位数据
//return :拼接后数据
uint16_t Util_buildUint16(uint8_t loByte, uint8_t hiByte)
{
    return((uint16_t)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8)));
}

//拼接该指针的首位和次位数据,首位是16位的低位
uint16_t Util_parseUint16(uint8_t *pArray)
{
    return(Util_buildUint16(pArray[0], pArray[1]));
}

//拆分32位数据,获取某一个8位的数据
//var :原数据
//byteNum :拆分哪一个8位数据(0,1,2,3)
//return :返回所选择位的数据
uint8_t Util_breakUint32(uint32_t var, int byteNum)
{
    return(uint8_t)((uint32_t)(((var) >> ((byteNum) * 8)) & 0x00FF));
}

//将32位数据拆分保存在数组中
//pBuf :被保存数据的位置指针
//val :被拆分的32位数据
//return :数据依次保存后剩余空间的指针
uint8_t *Util_bufferUint32(uint8_t *pBuf, uint32_t val)
{
    *pBuf++ = Util_breakUint32(val, 0);
    *pBuf++ = Util_breakUint32(val, 1);
    *pBuf++ = Util_breakUint32(val, 2);
    *pBuf++ = Util_breakUint32(val, 3);
    return(pBuf);
}

//合并成32位数据
//byte :0~7
//byte :8~15
//byte :16~23
//byte :24~31
uint32_t Util_buildUint32(uint8_t byte0, uint8_t byte1, uint8_t byte2,
                            uint8_t byte3)
{
    return((uint32_t)((uint32_t)((byte0) & 0x00FF) +
                     ((uint32_t)((byte1) & 0x00FF) << 8) +
                     ((uint32_t)((byte2) & 0x00FF) << 16) +
                     ((uint32_t)((byte3) & 0x00FF) << 24)));
}

//直接将pArray组成一个32位数据,首地址位最低位
uint32_t Util_parseUint32(uint8_t *pArray)
{
    return(Util_buildUint32(pArray[0], pArray[1], pArray[2], pArray[3]));
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,599评论 1 19
  • 大家好!我们是蜂窝儿童互联网实验室的学生!由于共享单车经常被破坏,我们便开始探讨这个问题!因为共享单车经常被破坏,...
    恍惚间的黄昏阅读 365评论 0 3
  • 2018年5月9号18:30,EOS引力区在武汉光谷的资本大厦一楼进行了有关EOS的分享演讲。作者林肯玩有幸参与了...
    林肯万C阅读 340评论 0 0
  • 这篇游记写了一个星期,因为太忙了,每天只能写一点点,今天总算弄出来了。 5月6日星期日,伦敦第二天。 路线:格林威...
    Helenkeller阅读 565评论 0 3
  • 有时候觉得现实就摆在面前,那么清晰,却不愿意去承认,一个爱你的人应该是不管路途多么遥远,也风雨无阻来见你的人,而不...
    小汐好美阅读 207评论 0 0